如何使用 OpenCV 3 训练 SVM 以识别“欧元”硬币?
Posted
技术标签:
【中文标题】如何使用 OpenCV 3 训练 SVM 以识别“欧元”硬币?【英文标题】:How to train SVM for "Euro" coin recognition with OpenCV 3? 【发布时间】:2016-04-12 06:03:21 【问题描述】:我今年的圣诞假期项目是构建一个小的 android 应用程序,它应该能够检测图片中的任意欧元硬币,识别它们的价值并将价值相加。
我对图片获得良好识别的假设/要求是
统一背景 图片应大致为 DinA4 纸大小 硬币不能重叠,但可以相互接触 硬币的数字面必须向上/可见我最初的想法是,为了以后的硬币价值识别,最好先检测图片中的实际硬币/它们的区域。然后,任何识别都将仅在图片的这些区域运行,在这些区域中可以找到实际的硬币。
所以第一步是找到圈子。这是我使用这个 OpenCV 3 管道完成的,正如几本书和 SO 帖子中所建议的那样:
-
转换为灰色
CannyEdge 检测
高斯模糊
HoughCircle 检测
过滤掉内部/冗余圆圈
恕我直言,检测工作相当成功,这里是结果图片: Coins detected with HoughCircles with blue border
现在对每一枚发现的硬币进行识别!
我搜索了这个问题的解决方案并想出了
模板匹配 特征检测 机器学习模板匹配似乎非常不适合这个问题,因为硬币可以相对于模板硬币任意旋转(并且模板匹配算法不是旋转不变的!所以我不得不旋转硬币!)。 此外,模板硬币的像素永远不会与之前检测到的硬币区域的像素完全匹配。所以我认为任何计算相似度的算法都只会产生很差的结果。
然后我研究了特征检测。这对我来说似乎更合适。我检测了模板硬币和候选硬币图片的特征并绘制了匹配项(ORB 和 BRUTEFORCE_HAMMING 的组合)。不幸的是,模板硬币的特征也在错误的候选硬币中被检测到。 见下图,模板或“特征”硬币位于左侧,即 20 美分硬币。右边是候选硬币,最左边的硬币是 20 美分硬币。我实际上预计这枚硬币的匹配次数最多,不幸的是不是。因此,这似乎不是识别硬币价值的可行方法。 Feature-matches drawn between a template coin and candidate coins
所以机器学习是第三种可能的解决方案。从大学开始,我现在还在学习神经网络,它们是如何工作的,等等。不幸的是,我的实践知识很差,而且我根本不知道支持向量机 (SVM),这是 OpenCV 支持的机器学习。
所以我的问题实际上与源代码无关,而更多的是如何设置学习过程。
-
我应该学习普通硬币图像还是应该先提取特征并学习特征? (我认为:功能)
每个硬币应该给出多少正数和负数?
我是否还必须学习旋转硬币,或者这种旋转是否由 SVM “自动”处理?那么即使我只在非旋转硬币上训练它,SVM 会识别旋转硬币吗?
我上面的一个图片要求(“DinA4”)将硬币的大小限制在一定的大小,例如图片高度的 1/12。我应该学习大小大致相同还是不同大小的硬币?我认为,不同的大小会导致不同的特征,这对学习过程没有帮助,你怎么看?
当然,如果您有其他可能的解决方案,也欢迎! 任何帮助表示赞赏! :-)
再见,谢谢!
【问题讨论】:
【参考方案1】:回答您的问题:
1- 我应该学习普通硬币图像还是应该首先提取特征并学习特征? (我认为:功能)
对于许多对象分类任务,最好先提取特征,然后使用学习算法训练分类器。 (例如,特征可以是HOG,学习算法可以是 SVM 或 Adaboost)。这主要是因为与像素值相比,特征具有更有意义的信息。 (它们可以描述边缘、形状、纹理等。)但是,像深度学习这样的算法将提取有用的特征作为学习过程的一部分。
2 - 每枚硬币应该给出多少正数和负数?
您需要根据您要识别的类别的变化以及您使用的学习算法来回答这个问题。对于 SVM ,如果您使用 HOG 功能并想识别硬币上的特定数字,则不需要太多。
3- 我是否还必须学习旋转硬币,还是 SVM 会“自动”处理这种旋转?那么即使我只在非旋转硬币上训练它,SVM 也会识别旋转硬币吗?
同样,这取决于您对要选择的功能(不是学习算法的 SVM) 的最终决定。 HOG 特征不是旋转不变的,但有像 SIFT 或 SURF 这样的特征。
4-我上面的图片要求之一(“DinA4”)将硬币的大小限制在一定的大小,例如图片高度的 1/12。我应该学习大小大致相同还是不同大小的硬币?我认为,不同的尺寸会导致不同的特征,这对学习过程没有帮助,你怎么看?
再次,选择您的算法,其中一些要求您提供固定/相似的宽度/高度比。具体要求可以在相关论文中找到。
如果您决定使用 SVM,请查看 this,并且如果您对神经网络感到满意,那么使用 Tensorflow 是个好主意。
【讨论】:
非常感谢您的回答!我已经这么认为了,答案将是“这取决于”:-) 我会进一步调查并发布我的发现。以上是关于如何使用 OpenCV 3 训练 SVM 以识别“欧元”硬币?的主要内容,如果未能解决你的问题,请参考以下文章
OpenCVopencv3.0中的SVM训练 mnist 手写字体识别