如何使用OpenCV 3训练SVM以识别“欧元”硬币?

3
我的圣诞假期项目是构建一个小型的Android应用程序,它应该能够在图片中检测任意欧元硬币,识别它们的价值并将其总和计算出来。
我对于一张好的识别图片有以下假设/要求:
- 背景均匀 - 图片大小应该大致相当于DinA4纸张 - 硬币不得重叠,但可以互相接触 - 硬币的数字面必须朝上/可见
我的初步想法是,为了后续硬币价值识别最好先检测图片中实际硬币/它们的区域。然后只在找到实际硬币的图片区域上运行识别。
所以第一步是找到圆形。我使用了这个OpenCV 3管道,如几本书和SO帖子中建议的那样:
1. 转换为灰度 2. Canny边缘检测 3. 高斯模糊 4. HoughCircle检测 5. 过滤掉内部/冗余圆
在我看来,这种检测非常成功,下面是结果图片: 带有蓝色边框的HoughCircles检测到的硬币 现在对于每个找到的硬币进行识别!
我搜索了解决此问题的解决方案,并想出了
- 模板匹配 - 特征检测 - 机器学习
模板匹配似乎对这个问题非常不适合,因为硬币可以相对于模板硬币任意旋转(而且模板匹配算法不具有旋转不变性!所以我必须旋转硬币!)。此外,模板硬币的像素永远不会完全匹配先前检测到的硬币区域的像素。因此,任何计算相似性的算法都将产生较差的结果。
然后我研究了特征检测。这对我来说似乎更合适。我检测了模板硬币和候选硬币图片的特征,并绘制了匹配(ORB和BRUTEFORCE_HAMMING的组合)。不幸的是,模板硬币的特征也被检测到了错误的候选硬币中。
下面的图片显示了模板或“特征”硬币在左侧,一个20欧分硬币。右侧是候选硬币,最左边的硬币是20欧分硬币。我实际上期望这个硬币有最多的匹配,不幸的是没有。所以再次,这似乎不是识别硬币价值的可行方法。 模板硬币和候选硬币之间绘制的特征匹配

因此,机器学习是第三种可能的解决方案。我从大学里了解神经网络,以及它们的工作原理等等。不幸的是,我的实践知识相当贫乏,并且我根本不了解支持OpenCV的支持向量机(SVM)。

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

  1. 我应该在普通硬币图像上进行学习,还是应该先提取特征并针对这些特征进行学习? (我认为:特征)
  2. 每个硬币的正面和反面应该给出多少个示例?
  3. 我是否还需要在旋转的硬币上进行学习,或者这种旋转会被SVM "自动"处理?因此,即使我只在非旋转的硬币上进行了训练,SVM是否会识别旋转的硬币?
  4. 我上面的一个图片要求(“DinA4”)限制了硬币的大小,例如图片高度的1/12。我应该在大致相同大小的硬币上进行学习,还是不同大小的硬币? 我认为,不同大小的硬币会产生不同的特征,这对学习过程没有帮助,你认为呢?

当然,如果您有其他可能的解决方案,也欢迎提出!任何帮助都将不胜感激! :-)

再见和谢谢!

1个回答

1

回答您的问题:

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

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

2- 每个硬币的正面和反面应该给出多少个?

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

3- 我是否还需要在旋转的硬币上学习,或者这种旋转会被SVM“自动处理”?那么,即使我只在未旋转的硬币上进行了训练,SVM也会识别旋转的硬币吗?

再次,这取决于您最终关于您将选择的功能(不是学习算法SVM)的决定。HOG特征不具有旋转不变性,但有一些像SIFT或SURF这样的特征具有旋转不变性。

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

同样,选择您的算法,其中一些要求您具有固定/类似的宽度/高度比。您可以在相关论文中了解特定要求。

如果您决定使用SVM,请查看this,如果您感觉用神经网络可以的话,使用Tensorflow是一个好主意。


非常感谢您的回答!我已经想到了,答案可能是“这取决于情况” :-) 我会进一步调查并发布我的发现。 - Ximon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接