Keras `ImageDataGenerator` 图像和蒙版的增强方式不同
Posted
技术标签:
【中文标题】Keras `ImageDataGenerator` 图像和蒙版的增强方式不同【英文标题】:Keras `ImageDataGenerator` image and mask augments differently 【发布时间】:2020-03-09 19:23:43 【问题描述】:我正在使用带有 TensorFlow 后端的 Keras 训练语义分割模型。我采用ImageDataGenerator
进行图像增强,包括旋转、翻转和移位。通过遵循documentation,我创建了一个字典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
提供额外参数时,我应该怎么做才能让它们表现得像第一种情况?
【问题讨论】:
【参考方案1】:当你设置时
channel_shift_range=10,
brightness_range=(0.7, 1.3)
这会修改此生成器的 RNG,使 Image RNG 和 Mask RNG 不再同步。
我建议您为此任务使用自定义序列,直到发布 KP 新 API。 (见https://github.com/keras-team/governance/blob/master/rfcs/20190729-keras-preprocessing-redesign.md)
对于自定义序列的示例,我在这里提出一个示例:https://dref360.github.io/deterministic-da/
【讨论】:
【参考方案2】:对于其他为此苦苦挣扎的人 - 沿通道轴连接图像和蒙版是同步增强的便捷方式
image_mask = np.concatenate([image, mask], axis=3)
image_mask = augmenter.flow(image_mask).next()
image = image_mask [:, :, :, 0]
mask = image_mask [:, :, :, 1]
【讨论】:
以上是关于Keras `ImageDataGenerator` 图像和蒙版的增强方式不同的主要内容,如果未能解决你的问题,请参考以下文章
使用 ImageDataGenerator 时 Keras 拆分训练测试集
Keras ImageDataGenerator 不处理符号链接文件