我想使用神经网络进行图像分类。我将从预先培训的咖啡奈特开始,然后训练它以供我的应用。

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

在这种情况下,所有图像都是相同的对象,但具有变化(思考:质量控制)。它们处于不同的尺度/分辨率/距离/照明条件(在许多情况下,我不知道量表)。同样,在每个图像中,网络应忽略感兴趣的对象周围的区域(已知)。

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

数据集扩展

我听说通过随机作物/镜像/等创建更多的培训数据,是否有标准方法?关于分类器准确性产生多少改进的结果?

有帮助吗?

解决方案

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

2015年数据科学碗的获奖者对他们的方法有很好的文章,因此大多数答案的内容均来自以下内容:将浮游生物与深神经网络分类. 。我建议您阅读它,特别是关于 预处理和数据增强.

- 调整图像大小

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

另一个选择是使用OpenCV或Scipy。这将使图像大小为100个COLS(宽度)和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之间

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

预处理图像

Pre-processed images

相同图像的增强版本

enter image description here

- 其他技术

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

其他提示

虽然Wacax的答案是完整的,并且确实是解释性的,但我想添加几件事,以防有人偶然发现这个答案。

首先,最多 scipy.misc 图像相关功能(imread, imsave, imresize ERC)已被弃用而不是 Imageio 或者 略读.

其次,我强烈推荐Python图书馆 Imgaug 对于任何增强任务。它确实很容易使用,并且实际上拥有您可能想要使用的所有增强技术。

许可以下: CC-BY-SA归因
scroll top