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


41

我想使用神经网络进行图像分类。我将从训练有素的CaffeNet开始,然后为我的应用程序对其进行训练。

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

在这种情况下,所有图像都属于同一物体,但具有变化(请考虑:质量控制)。它们的比例/分辨率/距离/照明条件略有不同(很多情况下我不知道比例)。同样,在每个图像中,目标对象周围都有一个区域(已知),网络应该忽略该区域。

我可以(例如)裁剪每个图像的中心,以确保其中包含感兴趣对象的一部分而没有忽略区域。但这似乎会浪费掉信息,而且结果的范围也不尽相同(可能是1.5倍的变化)。

数据集扩充

我听说过通过随机裁剪/镜像/等方式创建更多训练数据,是否有标准方法?它对分类器的准确性有何改善?

Answers:


35

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

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之间的随机数(对数均匀)
  • 翻转:是或否(bernoulli)
  • 剪切:随机,角度在-20°和20°之间(均匀)
  • 拉伸:拉伸因子在1 / 1.3到1.3之间的随机数(对数均匀)

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

预处理图像

预处理图像

相同图像的增强版本

在此处输入图片说明

-其他技术

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


1
颜色也值得一看,以进行数据扩充。
戴维·C·毕晓普

您还可以共享旋转和剪切等代码吗?@wacax
阿森纳狂热者队

你们可以使用像keras这样的软件包进行数据扩充。
里卡多·克鲁兹

2
对于任何人在导入scipy.misc模块时遇到问题。您需要import scipy.miscstackoverflow.com/questions/13581593/…–
eleijonmarck

至于图像大小调整,在现有技术中通常使用哪种方法,例如ImageNet上使用的那些方法?
HelloGoodbye

2

尽管wacax的答案是完整的且确实具有解释性,但我想补充几件事,以防有人偶然发现此答案。

首先,大多数scipy.misc图像相关的功能(imreadimsaveimresizeERC)已经成为弃用,取而代之的任一的ImageIOskimage

其次,我强烈建议将python库imgaug用于任何扩充任务。它真的很容易使用,并且拥有您可能想要使用的几乎所有增强技术。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.