我今年的圣诞假期项目是构建一个小的 Android 应用程序,它应该能够检测图片中的任意欧元硬币,识别它们的值(value)并总结值(value)。
我的 假设/要求 对图片的良好识别是
我最初的想法是,为了以后的硬币值(value)识别,最好先检测图片中的实际硬币/它们的区域。任何识别都只会在图片的这些区域上运行,在这些区域中可以找到实际的硬币。
所以第一步是找到圆圈。 这是我使用 OpenCV 3 管道完成的,正如几本书和 SO 帖子中所建议的:
恕我直言,检测工作相当成功,这是结果的图片:
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- 我应该学习普通硬币图像还是应该首先提取特征并学习这些特征? (我认为:功能)
对于许多对象分类任务,最好先提取特征,然后使用学习算法训练分类器。 (例如,特征可以是 HOG,学习算法可以是 SVM 或 Adaboost 之类的东西)。这主要是因为与像素值相比,特征具有更有意义的信息。 (它们可以描述边缘、形状、纹理等。)然而,像深度学习这样的算法将提取有用的特征作为学习过程的一部分。
2 - 每枚硬币应该给出多少正数和负数?
您需要根据您想要识别的类的变化以及您使用的学习算法来回答这个问题。对于 SVM ,如果您使用 HOG 功能并想识别硬币上的特定数字,则不需要太多。
3- 我是否还必须学习旋转的硬币,还是 SVM 会“自动”处理这种旋转?那么 SVM 会识别旋转的硬币,即使我只在非旋转的硬币上训练它吗?
同样,这取决于您对 特征(而不是学习算法的 SVM) 的最终决定。 HOG 特征不是旋转不变的,但有像 SIFT 或 SURF 这样的特征。
4-我上面的图片要求之一(“DinA4”)将硬币的大小限制为特定大小,例如图片高度的 1/12。我应该学习大致相同大小或不同大小的硬币吗?我认为,不同的尺寸会导致不同的特征,这对学习过程没有帮助,你怎么看?
同样,选择您的算法,其中一些要求您提供固定/相似的宽度/高度比。您可以在相关论文中了解具体要求。
如果您决定使用 SVM,请查看 this 并且如果您对神经网络感到满意,则使用 Tensorflow 是一个好主意。
关于opencv - 如何使用 OpenCV 3 为 "Euro"硬币识别训练 SVM?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34662077/