图像预处理和数据增强应该如何用于语义分割?
Posted
技术标签:
【中文标题】图像预处理和数据增强应该如何用于语义分割?【英文标题】:How should image preprocessing and data augmentation be for semantic segmentation? 【发布时间】:2019-11-29 17:06:21 【问题描述】:我有一个不平衡的小型数据集,其中包含 4116 个 224x224x3 (RGB) 航拍图像。由于数据集不够大,我很可能会遇到过拟合问题。图像预处理和数据增强有助于解决这个问题,如下所述。
“过度拟合是由于要学习的样本太少,导致您无法训练可以泛化到新数据的模型。给定无限数据,您的模型将暴露于数据分布的每个可能方面手头:你永远不会过拟合。数据增强采用从现有训练样本中生成更多训练数据的方法,通过一系列随机变换来增强样本,从而产生看起来可信的图像。”
Deep Learning with Python by François Chollet,第 138-139 页,5.2.5 使用数据增强。
我已阅读 Medium - Image Data Preprocessing for Neural Networks 并查看了斯坦福的 CS230 - Data Preprocessing 和 CS231 - Data Preprocessing 课程。它在SO question 中再次突出显示,我知道没有“一刀切”的解决方案。这就是迫使我问这个问题的原因:
“没有使用翻译增强,因为我们想要实现高空间分辨率。”
Reference: Researchgate - Semantic Segmentation of Small Objects and Modeling of Uncertainty in Urban Remote Sensing Images Using Deep Convolutional Neural Networks
我知道我将使用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)
【问题讨论】:
这个问题非常广泛,我仍然会尝试对此提出我的看法。正如您必须阅读的那样,对伪造数据进行了扩充,基本上是从可用数据中生成数据以在分布中生成更多数据。这完全取决于您期望模型在训练后将来遇到的方差。例如,如果您认为您可能会遇到可能会翻转的图像,请旋转将其添加为增强的一部分。对于预处理,到目前为止,我使用的是灰度图像,用均值和标准差进行归一化。 【参考方案1】:扩充和预处理阶段始终取决于您遇到的问题。您必须考虑可以扩大数据集的所有可能的扩充。但最重要的是,你不应该执行极端的增强,这会以实际示例中不可能发生的方式生成新的训练样本。如果您不期望真实示例会水平翻转,请不要执行水平翻转,因为这会给您的模型提供错误信息。想想输入图像中可能发生的所有变化,并尝试从现有图像中人为地生成新图像。您可以使用 Keras 的许多内置函数。但是您应该注意每一个都不会生成新的示例,这些示例不太可能出现在您的模型输入中。
正如您所说,没有“一刀切”的解决方案,因为一切都取决于数据。分析数据并构建与之相关的一切。
关于小物体 - 您应该检查的一个方向是损失函数,它强调目标体积与背景相比的影响。查看 Dice Loss 或 Generalized Dice Loss。
【讨论】:
我分析了所有的数据增强技术,并为我的数据集找到了合理的答案。但我仍然对加权损失函数感到困惑。我不明白如何将骰子损失用于不平衡的多类分割问题。我怎么知道我比其他人更关心 A 类?一种建议是可以更改一个热编码向量(而不是为真实类写 1,而是写类权重,即 999)。请查看下面的链接以更好地理解我的意思。 github.com/qubvel/segmentation_models/issues/… 当我建议使用损失函数时,我考虑的是体积大小意义上的小对象。如果你有不平衡的类,这是一个不同的问题。对于这个问题,使用平衡采样很有用。尝试查看不同的采样技术。以上是关于图像预处理和数据增强应该如何用于语义分割?的主要内容,如果未能解决你的问题,请参考以下文章