带有中心裁剪的 Keras ImageDataGenerator 用于旋转和平移移位

Posted

技术标签:

【中文标题】带有中心裁剪的 Keras ImageDataGenerator 用于旋转和平移移位【英文标题】:Keras ImageDataGenerator with center crop for rotation and translation shift 【发布时间】:2019-10-08 19:10:12 【问题描述】:

我需要进行数据扩充,但不需要任何填充模式,constantreflectnearestwrap。相反,每次旋转或平移图像时,我都希望将其中心裁剪(如下所示),以免出现任何黑色、白色、反射或恒定边缘/边框,如 here 所述。

如何在考虑到这些点的情况下扩展ImageDataGenerator 类(如果这是唯一的方法并且没有开箱即用的中心裁剪)?

    保留ImageDataGenerator中除扩充部分之外的现有部分,并编写自定义扩充函数

    在增强发生之前保留原始大小的图像而不调整大小会很有效,因为中心裁剪会导致调整大小后的大量数据丢失。 Translate/Rotate -> Center crop -> Resize 应该比 Resize -> Translate/Rotate -> Center crop 更高效

【问题讨论】:

【参考方案1】:

如果有人正在寻找解决方案,以下是我设法解决问题的方法。主要思想是将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 循环。

【讨论】:

【参考方案2】:

这可能会有所帮助,

扩展 Keras 的 ImageDataGenerator 以支持随机裁剪

https://jkjung-avt.github.io/keras-image-cropping/

github 代码:

https://github.com/jkjung-avt/keras-cats-dogs-tutorial/blob/master/train_cropped.py

train_datagen = ImageDataGenerator(......)
train_batches = train_datagen.flow_from_directory(DATASET_PATH + '/train',
                                              target_size=(256,256),
                                              ......)
train_crops = crop_generator(train_batches, 224)
net_final.fit_generator(train_crops, ......)

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review

以上是关于带有中心裁剪的 Keras ImageDataGenerator 用于旋转和平移移位的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中裁剪一个张量,每个子张量都有不同的裁剪值?

如何自动裁剪和居中图像

从顶部裁剪,而不是从中心裁剪

从中心 PHP 裁剪图像

如何让图像在中心裁剪

jcrop - 中心的默认裁剪选择