opencv - 如何使用 OpenCV 3 训练 SVM 进行 "Euro"硬币识别?

标签 opencv machine-learning svm

我今年的圣诞假期项目是构建一个小的 Android 应用程序,它应该能够检测图片中的任意欧元硬币,识别它们的值(value)并将值(value)相加。

我对图片良好识别的假设/要求

  • 统一背景
  • 图片应该大约是一张 DinA4 纸的大小
  • 硬币不能重叠,但可以相互接触
  • 硬币的数字面必须朝上/可见

我最初的想法是,对于后面的硬币值(value)识别,最好先检测图片中的实际硬币/它们的区域。然后,任何识别都将仅在图片的这些区域运行,也就是找到实际硬币的区域。

所以第一步是找到圆圈。我已经使用这个 OpenCV 3 管道完成了这个,正如几本书和 SO 帖子中所建议的:

  1. 转换为灰色
  2. CannyEdge检测
  3. 高斯模糊
  4. 霍夫圆检测
  5. 过滤掉内部/冗余圈子

恕我直言,检测工作相当成功,这里是结果图片: Coins detected with HoughCircles with blue border

现在对每一个找到的硬币进行识别!

我搜索了这个问题的解决方案并提出了

  • 模板匹配
  • 特征检测
  • 机器学习

模板匹配似乎非常不适合这个问题,因为硬币可以相对于模板硬币任意旋转(并且模板匹配算法不是旋转不变的!所以我不得不旋转硬币!)。 模板硬币的像素也永远不会与先前检测到的硬币区域的像素完全匹配。因此,我认为任何计算相似度的算法都只会产生很差的结果。

然后我研究了特征检测。这对我来说似乎更合适。我检测了模板硬币和候选硬币图片的特征并绘制了匹配项(ORB 和 BRUTEFORCE_HAMMING 的组合)。不幸的是,在错误的候选硬币中也检测到了模板硬币的特征。 请参见下图,左侧是模板或“特征”硬币,一枚 20 美分的硬币。右边是候选硬币,最左边的硬币是 20 美分硬币。我实际上希望这枚硬币有最多的匹配,不幸的是没有。同样,这似乎不是识别硬币值(value)的可行方法。 Feature-matches drawn between a template coin and candidate coins

所以机器学习是第三种可能的解决方案。从大学开始,我现在仍然了解神经网络及其工作原理等。不幸的是,我的实践知识很差,而且我根本不知道支持向量机 (SVM),这是 OpenCV 支持的机器学习。

所以我的问题实际上与源代码无关,但更多的是如何设置学习过程。

  1. 我应该在普通硬币图像上学习还是应该先提取特征并在特征上学习? (我认为:特点)
  2. 每枚硬币应给出多少正数和负数?
  3. 我是否也必须学习旋转硬币,或者这种旋转是否会由支持向量机“自动”处理?那么 SVM 会识别旋转的硬币吗,即使我只用非旋转的硬币训练它?
  4. 我上面的图片要求之一(“DinA4”)将硬币的大小限制在一定大小,例如图片高度的 1/12。我应该学习大致相同大小或不同大小的硬币吗?我认为,不同的大小会导致不同的特征,这对学习过程没有帮助,您怎么看?

当然,如果你有不同的可能解决方案,也欢迎! 任何帮助表示赞赏! :-)

再见,谢谢!

最佳答案

回答您的问题:

1- 我应该在普通硬币图像上学习还是应该先提取特征并在特征上学习? (我认为:功能)

对于许多对象分类任务,最好先提取特征,然后使用学习算法训练分类器。 (例如,特征可以是 HOG,学习算法可以是 SVM 或 Adaboost 之类的东西)。这主要是因为与像素值相比,特征具有更有意义的信息。 (它们可以描述边缘、形状、纹理等)但是,深度学习等算法会提取有用的特征作为学习过程的一部分。

2 - 每枚硬币应该给出多少正数和负数?

您需要根据您要识别的类的变化和您使用的学习算法来回答这个问题。对于 SVM ,如果您使用 HOG 功能并想要识别硬币上的特定数字,则不需要太多。

3- 我是否还必须学习旋转硬币,或者这种旋转是否会由支持向量机“自动”处理?那么 SVM 会识别旋转的硬币吗,即使我只用非旋转的硬币训练它?

同样,这取决于您对要选择的特征(不是 SVM,它是学习算法) 的最终决定。 HOG 特征不是旋转不变的,但有像 SIFT 或 SURF 这样的特征。

4-我上面的图片要求之一(“DinA4”)将硬币的大小限制在一定大小,例如图片高度的 1/12。我应该学习大致相同大小或不同大小的硬币吗?我认为,不同的尺寸会导致不同的特征,这对学习过程没有帮助,你怎么看?

再次选择您的算法,其中一些要求您提供固定/相似的宽度/高度比。您可以在相关论文中了解具体要求。

如果您决定使用 SVM,请查看 this另外,如果您觉得神经网络没问题,那么使用 Tensorflow 是个好主意。

关于opencv - 如何使用 OpenCV 3 训练 SVM 进行 "Euro"硬币识别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34662077/

相关文章:

python - 打开 cv 关闭相机

machine-learning - 什么样的人工智能会在不考虑 future 的情况下做出选择?

python - sci-kit学习库中的算法参数是如何优化的?

python - 如何使用交叉验证模型获取系数

c++ - OpenCV 3.1.0 : Save and load trained SVMs

c++ - SURF、FlannMatcher的min_dist和max_dist是什么意思

python - 为 OpenCV imshow 连接 Numpy 数组

machine-learning - 如何获得多类分类中的jlibsvm预测概率

c++ - 在简单的黑白绘图图像中检测直线、圆和弧

c++ - 如何从 k-d 树实现 K-NN 分类?