提问者:小点点

Keras DataGenerator:如何从每个子目录中只加载特定数量的图像?


我使用Keras flow_from_目录从多个文件夹加载图像。每个文件夹的图像数从1500到9500不等。据我所知,keras ImageDataGenerator加载子文件夹中的所有图像,但我只想从每个子文件夹中加载1000个图像。

举个例子,我的目录结构如下:A是父目录,A中有X1,X2,。。。,Xn子目录。我只想从X1,X2,…,中采集1000张图像。。。,Xn,即,我总共将有1000*n个图像。

提前感谢。


共1个答案

匿名用户

您可以使用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)

类似的,我不确定它是否运行,我直接在堆栈溢出上写的。