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

Fro*_*Lee 5 machine-learning keras tensorflow semantic-segmentation data-augmentation

我正在使用带有 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)
Run Code Online (Sandbox Code Playgroud)

训练数据生成器如下完成,通过设置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'
    )
)
Run Code Online (Sandbox Code Playgroud)

到目前为止,没有出现任何问题。但是因为我只需要对图像而不是掩码进行一些额外的预处理(例如规范化),所以我创建了另一个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)
Run Code Online (Sandbox Code Playgroud)

当我检查 的输出时training_data_generator,出现问题:似乎图像和蒙版是分开生成的:它们肯定有随机旋转,但与以前不同,它们以不同的角度旋转。这是食物图像和食物掩码的示例。

不一致

我检查了idimage_datagenmask_datagen,这两种情况下,他们id是不同的。我想知道为什么第一种情况他们可以以相同的随机角度旋转图像和蒙版,但在第二种情况下不能?当我确实需要为 提供额外参数时,我该怎么做才能使它们表现得像第一种情况image_datagen

小智 2

当你设置

channel_shift_range=10,
brightness_range=(0.7, 1.3)
Run Code Online (Sandbox Code Playgroud)

这会修改该生成器的 RNG,以便图像 RNG 和掩模 RNG 不再同步。

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

对于自定义序列的示例,我在这里提出一个示例: https: //dref360.github.io/definistic-da/