5

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

在此处输入图像描述

ImageDataGenerator考虑到这些要点,我如何扩展课程(如果这是唯一的方法并且没有开箱即用的中心裁剪)?

  1. 保留ImageDataGenerator的现有部分而不是扩充部分,并编写自定义扩充函数

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

4

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 循环。

于 2019-10-29T13:42:48.257 回答
1

这可能会有所帮助,

扩展 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, ......)
于 2020-10-13T02:21:46.760 回答