Keras `ImageDataGenerator` 图像和掩码以不同方式增强

Keras `ImageDataGenerator` image and mask augments differently

我正在使用带有 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_datagenmask_datagenid,这两种情况它们的id是不同的。我想知道为什么在第一种情况下他们可以以相同的随机角度旋转图像和蒙版,但在第二种情况下却不行?当我确实需要为 image_datagen?

提供额外参数时,我应该怎么做才能使它们表现得像第一种情况

当您设置

channel_shift_range=10,
brightness_range=(0.7, 1.3)

这会修改此生成器的 RNG,使图像 RNG 和蒙版 RNG 不再同步。

我建议您在此任务中使用自定义序列,直到发布新的 KP API。 (参见 https://github.com/keras-team/governance/blob/master/rfcs/20190729-keras-preprocessing-redesign.md

自定义Sequence的例子,我这​​里举个例子:https://dref360.github.io/deterministic-da/

对于其他为此苦苦挣扎的人 - 沿通道轴连接图像和蒙版是同步增强的便捷方式

image_mask = np.concatenate([image, mask], axis=3)
image_mask  = augmenter.flow(image_mask).next()
image = image_mask [:, :, :, 0]
mask = image_mask [:, :, :, 1]