我在使用TensorFlow后端的Keras训练语义分割模型。我采用了ImageDataGenerator
来进行图像增强,包括旋转、翻转和位移。按照文档的指导,我创建了一个字典maskgen_args
,并使用它作为参数来实例化两个ImageDataGenerator
对象。
maskgen_args = dict( rotation_range=90, validation_split=VALIDATION_SPLIT)image_datagen = ImageDataGenerator(**maskgen_args)mask_datagen = ImageDataGenerator(**maskgen_args)
训练数据生成器的设置如下,通过将seed
设置为相同的值,掩码将与图像匹配。
training_data_generator = zip( image_datagen.flow_from_directory( data_dir, target_size=(512, 512), color_mode='rgb', batch_size=BATCH_SIZE, class_mode=None, save_format='jpeg', seed=GENERATE_SEED, subset='training' ), mask_datagen.flow_from_directory( label_dir, target_size=(512, 512), color_mode='grayscale', batch_size=BATCH_SIZE, class_mode=None, save_format='png', seed=GENERATE_SEED, subset='training' ))
到目前为止,没有出现任何问题。但由于我需要对图像进行一些额外的预处理(例如归一化),而不对掩码进行预处理,我创建了另一个imagegen_args
字典,并在实例化ImageDataGenerator
时使用它作为参数。
maskgen_args = dict( rotation_range=90, validation_split=VALIDATION_SPLIT)imagegen_args = dict( samplewise_center=True, samplewise_std_normalization=True, channel_shift_range=10, brightness_range=(0.7, 1.3), **maskgen_args)image_datagen = ImageDataGenerator(**imagegen_args)mask_datagen = ImageDataGenerator(**maskgen_args)
当我检查training_data_generator
的输出时,出现了问题:似乎图像和掩码是分别生成的:它们确实有随机旋转,但旋转的角度不同,不像之前那样一致。这里有一个食物图像及其掩码的示例。
我检查了image_datagen
和mask_datagen
的id
,在两种情况下它们的id
都是不同的。我想知道为什么在第一种情况下它们可以以相同的随机角度旋转图像和掩码,但在第二种情况下却不行?当我确实需要为image_datagen
提供额外的参数时,我应该做些什么才能让它们像第一种情况那样表现?
回答:
当你设置
channel_shift_range=10,brightness_range=(0.7, 1.3)
这会修改此生成器的RNG,使图像的RNG和掩码的RNG不再同步。
我建议你在KP新API发布之前使用自定义的Sequence来完成这项任务。(参见 https://github.com/keras-team/governance/blob/master/rfcs/20190729-keras-preprocessing-redesign.md)
关于自定义Sequence的示例,我在这里提供了一个例子:https://dref360.github.io/deterministic-da/