我需要进行数据增强,但不需要使用任何填充模式constant
,reflect
,nearest
,wrap
。相反,每次旋转或平移图像时,我都希望将其中心裁剪(如下所示),以免出现here所述的任何黑色,白色,反射或恒定的边缘/边框。
考虑到这些几点,如何扩展ImageDataGenerator
类(如果这是唯一的方法,并且没有可用的中心裁切)?
保留ImageDataGenerator中除扩充部分以外的现有部分,并编写自定义的扩充功能
在扩大发生之前保留原始大小的图像而无需重新调整大小会非常有效,因为中心裁切会在调整大小后导致大量数据丢失。 Translate/Rotate -> Center crop -> Resize
应该比Resize -> Translate/Rotate -> Center crop
答案 0 :(得分:0)
万一有人在寻找解决方案,这就是我设法解决问题的方法。主要思想是将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, :]
,我们仅更改图像的x
和y
尺寸,而批次大小和通道尺寸保持不变。这使我们避免了for循环。
答案 1 :(得分:-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, ......)