Python 将图像从磁盘添加到Tensorflow数据集
我正在使用Tensorflow数据集的Python 将图像从磁盘添加到Tensorflow数据集,python,tensorflow,tensorflow-datasets,data-pipeline,Python,Tensorflow,Tensorflow Datasets,Data Pipeline,我正在使用Tensorflow数据集的tfds.load函数加载我的数据: import tensorflow_datasets as tfds import tensorflow as tf (raw_train, raw_validation, raw_test), metadata = tfds.load( 'cats_vs_dogs', split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'], with_in
tfds.load
函数加载我的数据:
import tensorflow_datasets as tfds
import tensorflow as tf
(raw_train, raw_validation, raw_test), metadata = tfds.load(
'cats_vs_dogs',
split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
with_info=True,
as_supervised=True,
)
现在,我在本地pc上有一些猫和狗的附加图像(例如Cat1.jpg
)。我想把它们添加到这些数据中。我该怎么做
注意,我不仅仅有一个文件,还有很多,而且这只是一个二进制分类的例子;同样的问题也适用于多类分类,所以最好也有一个解决方案
更新:我尝试了不同的方法,比如尝试每晚使用tf从目录中读取tf.keras.preprocessing.image\u dataset\u的图像,但不幸的是,这并不是那么容易。有很多问题,比如结果数据集的数据类型不同,无法与原始数据集合并。我没有解决这个问题的办法。我对它很感兴趣,因为我真的需要详细的代码,一个有效的解决方案,而不仅仅是一些一般性的想法,理论上如何实现这一点。我不需要一个解决方案与图像_数据集_从_目录,如果有人有任何解决方案,详细的代码,这是工作,我很好 我不想发布任何代码,因为我认为有更好的方法来解决这个问题。但是,请找到我在这里尝试的方式(在colab中): tmp中有一个测试文件夹。一个子文件夹是cat,另一个子文件夹是dog。包括一些随机图片从搜索猫和狗 生成的序列是一个
例如,原始列车是
ds现在是一个
无法解决此问题,因为数据未正确匹配/连接。此外,在多类情况下,我无法控制检查标签的匹配
因此,我不需要任何关于如何在理论上实现这一目标的一般性思考。我需要一个详细的工作方案,详细的代码。不仅仅是这个例子中的二进制,我也需要它来解决多类问题,因为我也有这个问题。因此,在多类情况下,如何将“读入标签”与tfds.load生成的标签相匹配。没有遗漏匹配,比如混合类等等。例如,猫变成马(在猫对狗对马的情况下)
第二种方式:
我还尝试将ImageDataGenerator直接指向原始列车数据集。如果这样做有效的话,我本来可以继续使用ImageDataGenerator,尽管我实际上并不希望这样。所以我只想将图像添加到原始列车数据集中。我试过这个:
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_image_generator = ImageDataGenerator(
rescale=1./255,
)
train_datagen = train_image_generator.flow_from_directory(
directory=raw_train,
target_size=(224, 224),
shuffle=True,
batch_size=128,
class_mode='binary'
)
然后匹配/连接这些数据生成器的结果。但是不可能只在原始序列上指出它,它会给出一个错误。tfds.load返回的对象是的实例。因此,您可以为本地图像构建一个新的
tf.data.Dataset
实例,然后使用方法将它们连接在一起。要从磁盘上的图像构建这样的数据集,至少有三种不同的方法:
- 您可以使用新添加的函数。目前,该功能仅在tf每晚提供。您可以找到使用此函数的示例
- 或者,您可以使用
API对加载过程进行更多控制,并对图像及其标签进行进一步转换。这是一个如何实现这一点的示例tf.data
- 或者,您可以首先使用任何库/方法作为Numpy数组加载图像,还可以构建另一个与其标签对应的数组。然后您可以使用方法创建一个
实例。你可以找到一个例子。请注意,如果您有大量图像,则不建议使用此方法(这反过来意味着构造的Numpy阵列的大小将非常大,从而导致数据管道内存浪费或无法构建)tf.data.Dataset
import os
import shutil
os.listdir("/tmp/Test") #First find where the ".ipynb_checkpoints" is located.
shutil.rmtree("/tmp/Test/.ipynb_checkpoints")
import tensorflow_datasets as tfds
(raw_train, raw_validation, raw_test), metadata = tfds.load(
'cats_vs_dogs',
split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
with_info=True,
as_supervised=True,
)
def _normalize_img(img, label):
img = tf.cast(img, tf.float32) / 255.
img = tf.image.resize(img, (224,224))
label = tf.cast(label, tf.int64)
img = tf.cast(img, tf.uint8)
return (img, label)
# ds = tfds.load('mnist', split='train', as_supervised=True)
ds = raw_train.map(_normalize_img)
test=ds.concatenate(raw_train)
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_image_generator = ImageDataGenerator(
rescale=1./255,
)
train_datagen = train_image_generator.flow_from_directory(
directory=raw_train,
target_size=(224, 224),
shuffle=True,
batch_size=128,
class_mode='binary'
)