5

我正在使用带有 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,出现了问题:似乎图像和蒙版是分别生成的:它们肯定有随机旋转,但它们以不同的角度旋转,与以前不同。这是食物图像和食物掩码的示例。

不一致

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

4

2 回答 2

2

当你设置

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/

于 2019-11-14T20:00:19.927 回答
0

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

image_mask = np.concatenate([image, mask], axis=3)
image_mask  = augmenter.flow(image_mask).next()
image = image_mask [:, :, :, 0]
mask = image_mask [:, :, :, 1]
于 2021-05-24T16:46:30.527 回答