我使用Keras flow_from_目录从多个文件夹加载图像。每个文件夹的图像数从1500到9500不等。据我所知,keras ImageDataGenerator加载子文件夹中的所有图像,但我只想从每个子文件夹中加载1000个图像。
举个例子,我的目录结构如下:A是父目录,A中有X1,X2,。。。,Xn子目录。我只想从X1,X2,…,中采集1000张图像。。。,Xn,即,我总共将有1000*n个图像。
提前感谢。
您可以使用tf。数据数据集。分别列出所有组的_文件,
从每个组中获取1000张图像,并连接数据集。
import tensorflow as tf
dogs = tf.data.Dataset.list_files('Dogs/*.jpg').take(1000)
cats = tf.data.Dataset.list_files('Cats/*.jpg').take(1000)
turtles = tf.data.Dataset.list_files('Turtles/*.jpg').take(1000)
ds = dogs.concatenate(cats).concatenate(turtles).shuffle(3000)
这将为您提供文件名。然后,您可以使用这样的函数将它们转换为成对的图像、标签。
def get_label(file_path):
parts = tf.strings.split(file_path, os.path.sep)
one_hot = parts[-2] == class_names
return tf.argmax(one_hot)
def decode_img(img):
img = tf.image.decode_jpeg(img, channels=3)
img = tf.image.resize(img, [img_height, img_width])
return img
def process_path(file_path):
label = get_label(file_path)
img = tf.io.read_file(file_path)
img = decode_img(img)
return img, label
train_ds = ds.map(process_path)
如果你有很多文件夹,你可以这样做:
all_folders = os.listdir('/all_images')
all_datasets = dict()
for folder in all_folders:
all_datasets[folder] = tf.data.Dataset.list_files(folder +'/*.jpg').take(1000)
ds = all_datasets.pop('Dogs')
for key, dataset in all_datasets.items():
ds = ds.concatenate(dataset)
ds = ds.shuffle(len(all_datasets)*1000)
类似的,我不确定它是否运行,我直接在堆栈溢出上写的。