如何为神经网络准备/增强图像?

数据挖掘 神经网络 图像分类 预处理 卷积网络
2021-10-13 20:51:11

我想使用神经网络进行图像分类。我将从预先训练的 CaffeNet 开始,并针对我的应用程序对其进行训练。

我应该如何准备输入图像?

在这种情况下,所有图像都是同一个对象,但有变化(想想:质量控制)。它们的比例/分辨率/距离/照明条件有些不同(在很多情况下我不知道比例)。此外,在每幅图像中,感兴趣的对象周围都有一个区域(已知),应该被网络忽略。

我可以(例如)裁剪每个图像的中心,保证包含感兴趣对象的一部分,并且不包含任何被忽略的区域;但这似乎会丢弃信息,而且结果也不会是真正相同的规模(可能是 1.5 倍的变化)。

数据集扩充

我听说过通过随机裁剪/镜像/等创建更多训练数据,是否有标准方法?关于它对分类器准确性产生多大改进的任何结果?

2个回答

神经网络的想法是它们几乎不需要预处理,因为繁重的工作是由负责学习特征的算法完成的。

2015 年数据科学碗的获胜者对他们的方法有很好的描述,所以这个答案的大部分内容来自: 用深度神经网络分类浮游生物我建议你阅读它,特别是关于预处理和数据增强的部分。

- 调整图像大小

至于不同的尺寸、分辨率或距离,您可以执行以下操作。您可以简单地将每个图像的最大边重新缩放为固定长度。

另一种选择是使用 openCV 或 scipy。这将调整图像的大小,使其具有 100 列(宽度)和 50 行(高度):

resized_image = cv2.resize(image, (100, 50)) 

另一种选择是使用 scipy 模块,方法是:

small = scipy.misc.imresize(image, 0.5)

- 数据增强

尽管数量取决于数据集,但数据增强始终可以提高性能。如果您想增强数据以人为地增加数据集的大小,您可以在适用的情况下执行以下操作(例如,如果是房屋或人的图像,如果将它们旋转 180 度,它们将丢失所有信息,则不适用但如果你像镜子一样翻转它们,则不会):

  • 旋转:随机,角度在 0° 到 360° 之间(均匀)
  • 翻译:随机,在 -10 和 10 像素之间移动(均匀)
  • 重新缩放:随机,比例因子在 1/1.6 和 1.6 之间(对数均匀)
  • 翻转:是或否(伯努利)
  • 剪切:随机,角度在 -20° 和 20° 之间(均匀)
  • 拉伸:随机,拉伸因子在 1/1.3 和 1.3 之间(对数均匀)

您可以在数据科学碗图像上查看结果。

预处理图像

预处理图像

相同图像的增强版本

在此处输入图像描述

-其他技术

这些将处理其他图像属性,如照明,并且已经与主算法相关,更像是一个简单的预处理步骤。查看完整列表:UFLDL 教程

虽然 wacax 的答案是完整的并且非常具有解释性,但我想补充几件事,以防有人偶然发现这个答案。

首先,大多数scipy.misc与图像相关的函数(imreadimsaveimresizeerc )已被弃用,取而代之的是imageioskimage

其次,我强烈推荐 python 库imgaug用于任何增强任务。它非常易于使用,并且几乎具有您可能想要使用的所有增强技术。