Загрузите несколько наборов данных из нескольких каталогов, используя 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)  
Другие вопросы по тегам