图像预处理和数据增强应该如何用于语义分割?

sak*_*aki 4 python keras image-preprocessing semantic-segmentation

我有一个不平衡的小数据集,其中包含 4116 张 224x224x3 (RGB) 航拍图像。由于数据集不够大,我很可能会遇到过拟合问题。图像预处理和数据增强有助于解决这个问题,如下所述。

“过度拟合是由于可供学习的样本太少导致您无法训练可以泛化到新数据的模型。如果数据无限,您的模型将暴露于手头数据分布的每个可能方面:您永远不会过拟合。数据增强采用从现有训练样本生成更多训练数据的方法,通过大量随机变换来增强样本,从而产生看起来可信的图像。”

使用 Python 进行深度学习,作者 François Chollet,第 138-139 页,5.2.5 使用数据增强

我已经阅读了Medium - Image Data Preprocessing for Neural Networks并检查了斯坦福的CS230 - Data PreprocessingCS231 - Data Preprocessing课程。它在SO 问题中再次突出显示,我知道没有“一刀切”的解决方案。这是迫使我提出这个问题的原因:

“因为我们想要实现高空间分辨率,所以没有使用翻译增强。”

参考: Researchgate - 使用深度卷积神经网络对城市遥感图像中的小对象进行语义分割和不确定性建模



我知道我将使用Keras - ImageDataGenerator Class,但不知道使用哪些技术和哪些参数来对小对象任务进行语义分割。有人可以启发我吗?提前致谢。:)

from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
    rotation_range=20,      # is a value in degrees (0–180)
    width_shift_range=0.2,  # is a range within which to randomly translate pictures horizontally.
    height_shift_range=0.2, # is a range within which to randomly translate pictures vertically.
    shear_range=0.2,        # is for randomly applying shearing transformations.
    zoom_range=0.2,         # is for randomly zooming inside pictures.
    horizontal_flip=True,   # is for randomly flipping half the images horizontally
    fill_mode='nearest',    # is the strategy used for filling in newly created pixels, which can appear after a rotation or a width/height shift
    featurewise_center=True,
    featurewise_std_normalization=True)

datagen.fit(X_train)
Run Code Online (Sandbox Code Playgroud)

man*_*nza 5

扩充和预处理阶段始终取决于您遇到的问题。你必须考虑所有可以扩大你的数据集的可能的增强。但最重要的是,你不应该进行极端的增强,这会以真实示例中不可能发生的方式产生新的训练样本。如果您不期望真实示例会被水平翻转,请不要执行水平翻转,因为这会给您的模型提供错误信息。考虑输入图像中可能发生的所有变化,并尝试从现有图像人为地生成新图像。您可以使用 Keras 的许多内置函数。但是您应该注意,它不会生成新的示例,这些示例不太可能出现在您的模型输入中。

正如您所说,没有“一刀切”的解决方案,因为一切都取决于数据。分析数据并构建与之相关的一切。

关于小物体 - 您应该检查的一个方向是损失函数,它强调与背景相比目标体积的影响。查看 Dice Loss 或 Generalized Dice Loss。