Загрузите несколько наборов данных из нескольких каталогов, используя flow_from_directory
Я хочу загрузить несколько наборов данных из разных каталогов, чтобы обучить модель глубокого обучения задаче семантической сегментации. Например, у меня есть изображения и маски одного набора данных и разные изображения и маски другого набора данных с одинаковой файловой структурой в папках dataset1 и dataset2, как это.
train_images/
train/
img1, img2, img3 ..
train_masks/
train/
msk1, msk2, msk3 ..
val_images/
val/
img1, img2, img3 ..
val_masks/
val/
msk1, msk2, msk3 ..
Я мог бы создать генератор изображений, который комбинирует изображения и маски для одного набора данных, с помощью приведенного ниже кода. Интересно, как я могу сделать генератор, который использует как набор данных1, так и набор данных2.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
img_data_gen_args = dict(horizontal_flip=True,
vertical_flip=True,
fill_mode='reflect')
image_datagen = ImageDataGenerator(**img_data_gen_args)
mask_datagen = ImageDataGenerator(**img_data_gen_args)
image_generator = image_datagen.flow_from_directory(
train_img_path,
class_mode = None,
batch_size = 16,
seed = 123)
mask_generator = mask_datagen.flow_from_directory(
train_mask_path,
class_mode = None,
batch_size = 16,
seed = 123)
train_generator = zip(image_generator, mask_generator)
train_img_path = "dataset1/train_images/"
train_mask_path = "dataset1/train_masks/"
train_img_gen = trainGenerator(train_img_path, train_mask_path, num_class=1)
# get one batch of image and mask
x, y = train_img_gen.__next__()
1 ответ
Вот как это сделать с помощью flow_from_dataframe. Я создал два каталога поездов и два каталога масок. У каждого есть 2 класса с 5 изображениями в каждом классе. Код ниже
def get_df(directory1, directory2):
for d in [directory1, directory2]:
filepaths=[]
labels=[]
classlist=os.listdir(d)
for klass in classlist:
classpath=os.path.join(d,klass)
flist=os.listdir(classpath)
for f in flist:
fpath=os.path.join(classpath,f)
filepaths.append(fpath)
labels.append(klass)
Fseries=pd.Series(filepaths, name='filepaths')
Lseries=pd.Series(labels, name='labels')
df=pd.concat([Fseries, Lseries],axis=1)
if d == directory1:
df1=df
else:
df2=df
df=pd.concat([df1, df2], axis=0).reset_index(drop=True)
return df
# combine the training directories
directory1=r'C:\Temp\demo\train1'
directory2=r'C:\Temp\demo\train2'
train_df=get_df(directory1, directory2)
print(len(train_df))
#combine the mask directories
directory1=r'C:\Temp\demo\mask1'
directory2=r'C:\Temp\demo\mask2'
mask_df1=get_df(directory1, directory2)
print(len(mask_df))
img_size=(256,256)
img_data_gen_args = dict(horizontal_flip=True,
vertical_flip=True,
fill_mode='reflect')
datagen = ImageDataGenerator(**img_data_gen_args)
image_generator = datagen.flow_from_dataframe(train_df, x_col='filepaths', y_col=None, target_size=img_size, class_mode=None, batch_size=16,
shuffle=True, seed=123)
mask_generator = datagen.flow_from_dataframe(mask_df, x_col='filepaths', y_col=None, target_size=img_size, class_mode=None, batch_size=16,
shuffle=True, seed=123)
gen=zip(image_generator, mask_generator)
image, mask=next(gen)
print(image.shape, mask.shape)