Keras图像数据生成器使用中心裁剪进行旋转和平移变换

4
我需要进行数据增强,但不使用任何填充模式,如constantreflectnearestwrap。相反,每次旋转或平移图像时,我希望它能够居中裁剪(如下所示),以避免出现任何黑色、白色、反射或常数边缘/边框,具体解释请参见这里

enter image description here

如果只有这种方法且没有提供中心裁剪,则如何扩展ImageDataGenerator类,并考虑以下几点:

  1. 保留ImageDataGenerator的现有部分,除了增强部分,并编写自定义增强函数

  2. 在增强发生之前保留原始尺寸的图像而不进行调整大小会更有效率,因为中心裁剪会导致调整大小后数据巨大的损失。 平移/旋转 -> 中心裁剪 -> 调整大小应该比调整大小 -> 平移/旋转 -> 中心裁剪更有效率。

2个回答

4

如果有人正在寻找解决方案,这是我如何成功解决问题的方法。主要思路是将ImageDataGenerator包装在自定义生成器中,例如:

def crop_generator(batches, new_size):
    while True:
        batch_x, batch_y = next(batches)
        x= batch_x.shape[1] // 2
        y= batch_x.shape[2] // 2
        size = new_size // 2
        yield (batch_x[:, x-size:x+size, y-size:y+size], batch_y)

x_train = HDF5Matrix(...)
y_train = HDF5Matrix(...)

datagen = ImageDataGenerator(rotation_range=180, ...)

model = create_model()

training_gen = crop_generator(datagen.flow(x_train, y_train, batch_size=128), new_size=64)

model.fit_generator(training_gen, ...)

使用numpy索引batch_x[:, x-size:x+size, y-size:y+size, :]只改变图像的xy维度,保持批量大小和通道维度不变。这使我们避免了使用for循环。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接