Keras`ImageDataGenerator`图像和遮罩以不同方式增加

时间:2019-11-13 22:23:55

标签: tensorflow machine-learning keras semantic-segmentation data-augmentation

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

Inconsistency

我检查了idimage_datagen的{​​{1}},它们的mask_datagen都不同。我想知道为什么在第一种情况下他们可以以相同的随机角度旋转图像和蒙版,而在第二种情况下却不能?当我确实确实需要给id附加参数时,我应该怎么做才能使它们表现得像第一种情况?

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

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

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