我将图像增强用于图像分割任务,训练 Unet。由于 Keras ImageDataGenerator 没有很多用于增强的选项,我尝试了 Albumentations(专为增强而设计的库)。首先,我想复制 Keras 增强功能,看看 Albumentations 增强功能是否会执行相同的操作(......他们不会)。新库实际上在验证数据上的表现更差,模型稍微过拟合。
下面的代码显示了两个不同的生成器(Keras 与 Albumentations)。这是我更改的代码的唯一部分,因此应该在此处找到问题。我发现的一件事是 Keras 使用样条插值(一阶),而 Albumentations 使用正常的线性插值。样条插值(一阶)只是线性插值的一个域,所以我相信它是相同的(虽然不确定)。
所以我的问题是:为什么即使增强技术和参数完全相同,它们的性能也不完全相同?我知道这涉及到一些随机性,但我通过几次培训对此进行了测试,并且总是得到类似的结果。
from keras_preprocessing.image import ImageDataGenerator
import albumentations as A
# parameters
rotation_range=10.0
width_shift_range=0.1
height_shift_range=0.1
shear_range=0.5
zoom_range=0.1
horizontal_flip=True
c_fill_val = -2
label_chans = 2
def keras_build_generator(img, lab):
img, lab = (np.expand_dims(data, axis=0) for data in [img, lab])
datagen = ImageDataGenerator(
rotation_range=rotation_range,
width_shift_range=width_shift_range,
height_shift_range=height_shift_range,
shear_range=shear_range,
zoom_range=zoom_range,
horizontal_flip=horizontal_flip,
fill_mode="constant",
cval=c_fill_val
)
image_generator = datagen.flow(img, batch_size=1, shuffle=False)
label_generator = datagen.flow(lab, batch_size=1, shuffle=False)
return zip(image_generator, label_generator)
def alb_build_transformer():
random.seed(10)
transformer = A.Compose([
A.Affine(
interpolation=1,
mask_interpolation=1,
always_apply=True,
rotate=(-rotation_range, rotation_range),
translate_percent={
'x':(-width_shift_range, width_shift_range),
'y':(-height_shift_range, height_shift_range)
},
shear=[-shear_range, shear_range],
scale={
'x':(1-zoom_range, 1+zoom_range),
'y':(1-zoom_range, 1+zoom_range)
},
cval=c_fill_val,
cval_mask=c_fill_val,
mode=0,
fit_output=False,
),
A.HorizontalFlip(
p=0.5 if horizontal_flip else 0
),
])
return transformer
编辑:更改了 Albumentations 库源代码,因此它使用样条插值(就像 Keras 一样)。结果表明,Albulentations 的表现甚至更差。所以这可能不是问题所在。