带有中心裁剪的 Keras ImageDataGenerator 用于旋转和平移移位
Posted
技术标签:
【中文标题】带有中心裁剪的 Keras ImageDataGenerator 用于旋转和平移移位【英文标题】:Keras ImageDataGenerator with center crop for rotation and translation shift 【发布时间】:2019-10-08 19:10:12 【问题描述】:我需要进行数据扩充,但不需要任何填充模式,constant
、reflect
、nearest
、wrap
。相反,每次旋转或平移图像时,我都希望将其中心裁剪(如下所示),以免出现任何黑色、白色、反射或恒定边缘/边框,如 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, :]
我们只改变图像的 x
和 y
尺寸,使批量大小和通道尺寸保持不变。这可以让我们避免 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 用于旋转和平移移位的主要内容,如果未能解决你的问题,请参考以下文章