1

我将图像增强用于图像分割任务,训练 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 的表现甚至更差。所以这可能不是问题所在。

4

0 回答 0