如何增加我的图像数据?

数据挖掘 图像分类 正常化 数据增强
2022-02-19 05:15:29

为 CNN 标准化图像的正确和常用方法是什么?我曾经使用文本,它非常简单。去除停用词,从噪音中清除文本,标记化,词干等。长度没有问题,我们可以轻松添加填充。我不确定如何处理图像。灰度要好得多,输入的数据更少。我应该以随机角度旋转每张图像吗?如何在我的训练数据集中选择正确大小的图像?添加额外的过滤器怎么样?

(我的目标是用 tensorflow 对 2 个类进行分类)

3个回答

您首先询问图像规范化,然后参考其他技术,我相信这些技术都属于“图像增强”。所以我将回答更普遍的问题:

如何执行图像增强来改进我的模型?

我通常会说,你可以应用的增强越多越好。该声明的一个警告是,增强必须对您的目标案例有意义我将在最后解释我的意思。

让我们列出一些增强图像的方法,以及一些常见的值:

增强

1. 翻转

从可能最容易实现的开始,您可以(轻松)翻转图像:

  • 水平方向:使指向左的箭头图像指向相反方向 - 向右,反之亦然
  • 垂直:使向下的箭头指向上,反之亦然。

由于图像的一般矩形形状,这更加困难,但是您可以对角翻转图像,但我还没有看到有人真正做到这一点。我想它已经接近旋转的概念了。

2. 旋转

在这种情况下,我们只需将图像围绕其中心旋转随机度数,通常在[-5, +5]度数范围内。即使是我们可能几乎无法察觉的微小角度,这也是一个简单的技巧,可以为模型增加很多鲁棒性。

3. 裁剪

我们随机或使用预定义的模式获取图像的“块”。这有助于模型可能专注于图像的某些区域,而不会被可能不重要的特征所淹没。它还简单地创建了更多数据。

您还可以将这种增强方法合并为一种调整输入图像大小以适应预训练模型的方法,该模型将不同大小的输入图像与您的数据相结合。

4. 规范化

这更像是一种数值优化技巧,可以真正从视觉角度进行解释。许多算法在使用较小的数字时会更稳定,因为值不太可能爆炸更接近的数字(在具有线性比例的连续空间的意义上)也更容易产生更平滑的优化路径。

执行标准化的一种方法是:

  • 首先计算图像的均值和标准差,然后
  • (从所有图像中)我们减去平均值并除以标准偏差。

这将生成像素值在某个范围内但平均值为零的图像。在这里查看一些其他方法和更多讨论您可以对整个图像或仅在单独的颜色通道 (RedGreenBlue) 上进行标准化。

要记住的一件事是,用于优化的值必须来自训练数据集本身,并且不得在包括验证/测试数据集在内的整个数据集上计算。这是因为该信息不应该以任何方式传递给模型 - 这是一种作弊。

5. 翻译

只需将图像向上、向下、向左或向右移动一定量,例如 10 像素,或再次在[-5, +5]图像大小的 % 范围内移动。这将沿一个或两个轴产生像素,必须用另一种颜色填充,因为图片已移出框架。对于这些“空白”部分,通常使用黑色或白色,但您也可以使用平均像素值,甚至裁剪移位的图像以将其移除。

6. 重新缩放

这是一个不太明显的增强步骤,但可以增加价值,因为该模型将能够从越来越小的图像中提取不同特征(或多或少)。没有太多细节的小图像只会让模型学习更高级别或更模糊的特征,并且无法专注于高分辨率图像中可用的特定细节。

诸如渐进式调整大小等方法,通常用于训练 GAN 架构,从较小的图像开始,然后慢慢处理到较大的图像。这样做可以使训练尽可能稳定(在 GAN 中,它可以提高对抗模式崩溃的鲁棒性),但也与网络中的早期层学习高级特征和更深的层(例如卷积网络)学习的概念不谋而合更详细的表示。为什么早期层需要高分辨率图像?让我们给他们低分辨率的图像,更快地训练,并希望能更好地概括!

7. 有创意!!

我曾经做过自动驾驶汽车的模型。我知道要测试模型的轨道有很多树和不少高墙,这在道路上造成了阴影。这些阴影看起来很像代表道路边缘的直线!所以我在我的图像中添加了阴影,随机强度和随机角度和随机大小。汽车了解到,直线上的亮度变化并不一定意味着道路边缘,因此当它到达一个边缘时就停止了!

考虑一下您的训练数据的伪影以及您的模型在验证数据中将面临的情况,并尝试将它们合并。这真的很像特征工程,通过增强合并到模型中......它可以提供很多帮助!

8. 例子

只是为了添加一张漂亮的图片,这里很好地展示了如何从单个图像中做出有趣的变化,取自 Keras 教程,链接如下。原始图像在左上角,剩下的 7 是一组随机增强组合的输出:

图像增强示例

你可以看看这样的文章,它通过示例很好地解释了增强。

这里的另一个很好的例子是一系列文章的一部分,详细介绍了增强的可能性。

实现

1. Keras:ImageDataGenerator

这是一个单一的课程,您可以在其中说明要应用哪些增强步骤以及(如果相关)多少。它允许非常容易地将增强集成到模型中。

查看 Keras 官方教程,了解一些很棒的图片示例。

2. PyTorch:转换

您可以构建一个小的转换管道,将它们聚集到一个Compose对象中,以便对每个增强步骤、其参数以及应用它的概率进行细粒度控制。

查看本教程Rescale以获取组合和的示例RandomCrop

3. 增强器:增强库

这个独立的库允许您构建出色的增强管道,然后将图像传递到模型中。实现了很多可能性,例如随机翘曲/失真,看起来非常时髦:

图像失真

它看起来也像上面显示的 Keras 解决方案一样易于使用!

回到起点

现在回到我的开场白,我们想要应用尽可能多的增强的原因是因为它综合地为我们的模型创建了更多的数据来学习。我们正在尝试教模型可能的数据输入的分布,并使其学习如何产生正确的输出。我们通常在训练集上这样做,然后在验证集上询问它的预测,其中包含看不见的数据。模型从生成数据的分布/函数中看到的数据越多,它对“看不见的”数据的表现就越不惊讶,效果也越好。我们希望我们的模型尽可能健壮,以便对数据进行各种更改,并将其暴露在更多帮助下。

需要注意的是,我们只使用相关的扩充,因为一旦我们开始使用以某种方式扭曲输入分布的扩充(例如,显示没有意义的模型图像1)。

因此,在您的问题的现实限制范围内,尽可能多地使用增强;以及训练模型所需的时间;-)


1 - 想象一下训练一个模型来检测道路上的汽车。如果我们执行垂直翻转,显示给模型的图像将包含本质上是颠倒行驶的汽车;“在灰色的天空上”。这真的没有意义,并且永远不会在现实的验证集或现实世界中发生。

免责声明:我会尝试回答这个问题,但会推广Image Augmentation Library Albumentations,这可能是我和合作者在空闲时间开发的,我们认为它是市场上最好的图像增强库 :)

有很多方法可以增强图像数据。

空间变换:裁剪、翻转、转置、弹性变换、ShiftScaleRotate 等。

像素级变换:BrightnessContrast、Gamma、RGB 空间变化、HSV 空间变化、JpegCompression、天气变换(比如在图像中添加雨水)等。

使用哪些转换以及选择哪些参数是艺术,而不是科学。

那些不改变数据分布的转换:必备。那些改变:可能工作可能不会。如果您有很多经验,他们会,如果没有;它们会使模型变弱:)

空间变换:

  1. 如果您的目标对于水平翻转是不变的,假设您需要对狗和猫进行分类或对街景图像执行分割 - 应该使用水平翻转。

  2. 如果您使用卫星图像,水平或垂直翻转、转置和旋转是不错的选择。

  3. 对于某些医学图像,您可以添加弹性和网格变换。

在此处输入图像描述 在此处输入图像描述

另一种标准空间变换是 RandomResizedCrop 和 ShiftScaleROtate。它有助于处理您的对象可能具有不同大小的事实。

在您的街景图像中,您面前可能有行人,或者远离相机 => 您可以放大/缩小图像并裁剪适合您的网络输入的部分。只要您的缩放参数不太极端,它就可以作为一个很好的正则化器并提高模型的质量。

颜色变换

这些更棘手。它们确实使您远离原始数据分布,但在许多(但不是全部)情况下,它会增加价值。

我建议尝试使用变换的参数并检查变换后的图像是否看起来或多或少自然。

在此处输入图像描述

有一天,我正在参加一场 Kaggle 比赛,其中必须具备不同强度的 JpegCompression 应用程序。包含解决方案的博客文章。

对于您面临的问题,可能会发生一些类似但未广泛使用的转换可能是必不可少的。

但这不是故事的结局。

对于许多问题,我们知道您的训练和测试数据具有不同的分布。

例如:数据按城市划分,您使用在莫斯科收集的数据进行训练并根据巴黎的数据进行预测。您的火车来自一家医院,而测试集来自另一家医院。或者,您需要额外的信心,即当生产管道中的分布发生变化时,您的模型会更加健壮。

在这些情况下,你可以用一种奇怪的、不现实的方式来硬核并增强你的图像。

但这是一项先进的技术。它被广泛用于赢得深度学习挑战并击败现有的最先进技术。对于大多数问题,您可以安全地使用翻转、裁剪、ShiftScaleRotate、BrightNessContrast,并专注于深度学习管道的其他部分。

在 Albumentations 库中,我们准备了一个 jupyter notebook 列表,展示了如何在图像上应用变换。

将标注应用于图像、蒙版、边界框、关键点、天气变换和多目标问题的示例。

如果有不清楚的地方,请随时检查并提交问题:)

Keras 数据论证可能是适合您的工具。