数字识别建议
Posted
技术标签:
【中文标题】数字识别建议【英文标题】:Suggestions for digit recognition 【发布时间】:2012-10-30 11:03:51 【问题描述】:我正在编写一个 android 应用程序来从图片中提取数独谜题。对于 9x9 数独网格中的每个单元格,我需要确定它是否包含数字 1 到 9 之一或为空白。我从这样的数独开始:
我使用 OpenCV 对数独进行预处理,以提取单个数字的黑白图像,然后将它们放入 Tesseract。不过,Tesseract 有一些限制:
-
Tesseract 很大,包含很多我不需要的功能(即全文识别),并且需要英语训练数据才能发挥作用,我认为必须进入设备的 SD 卡。至少我可以告诉它只使用
tesseract.setVariable("tessedit_char_whitelist", "123456789");
查找数字
Tesseract 经常将单个数字误解为一串数字,通常包含换行符。它有时也只是简单地弄错了。以下是上述数独中的一些示例:
我有三个问题:
-
有什么方法可以克服 Tesseract 的限制吗?
如果不是,什么是一种有用、准确的方法来检测在 Android 上可行的单个数字(不是 k 最近邻) - 这可以是免费库或 DIY 解决方案.
如何改进预处理以针对该方法?我考虑过的一种可能性是使用细化算法,正如this post 所建议的那样,但我不会费心去实现它,除非它会有所作为。
【问题讨论】:
这对于应用程序来说是一个很棒的想法。如果你已经完成了,你能把它的链接放上去吗?顺便说一句,我认为在您的数字图像周围设置边界会有所帮助。只需制作一个在高度和宽度维度上都增加 2 个像素的图像,将外部用作黑色边界,并将原始图像放在中间。 【参考方案1】:最简单的方法是使用归一化中心矩进行数字识别。 如果你有一种字体(或非常相似的字体,效果很好)。
查看此解决方案: https://github.com/grzesiu/Sudoku-GUI
核心部分负责数字识别、提取、时刻训练。 首次运行应用程序时,操作员必须提供看到的数字信息。然后将图像的矩(提取的平方 roi)分配给数字(操作员输入)。基于比较时刻的应用程序。
这里的第一部 youtube 电影展示了应用程序的工作原理: http://synergia.pwr.wroc.pl/2012/06/22/irb-komunikacja-pc/
【讨论】:
第一个链接失效了。 第二个链接也失效了。【参考方案2】:我和one 的计算机视觉巨星一起上课,他们曾经/现在是数字识别算法排名的前列。他非常坚持认为进行数字识别的最佳方法是......
1. Get some hand-labeled training data.
2. Run Histogram of Oriented Gradients (HOG) on the training data, and produce one
long, concatenated feature vector per image
3. Feed each image's HOG features and its label into an SVM
4. For test data (digits on a sudoku puzzle), run HOG on the digits, then ask
the SVM classify the HOG features from the sudoku puzzle
OpenCV 有一个HOGDescriptor
对象,它计算HOG features。查看this paper 以获取有关如何调整您的 HOG 功能参数的建议。任何 SVM 库都可以完成这项工作……CvSVM
stuff that comes with OpenCV 应该没问题。
对于训练数据,我建议使用MNIST handwritten digit database,它有数千张带有真实数据的数字图片。
一个稍微困难的问题是在自然界中出现的数字周围画一个边界框。幸运的是,您似乎已经找到了制作边界框的策略。 :)
【讨论】:
+1 - 训练需要多少数据?使用从大量数独游戏中收集的数据而不是手写数字数据库进行训练不是更好吗,因为他的测试数据几乎相同,不像手写数据有太大差异? 非常有用的帖子!我很高兴听到我目前所做的比我接下来要做的更难:)。 不幸的是,HOGDescriptor 是为 Nvidia GPU 设计的,在 OpenCV4Android 中不存在。 The source code 和 documentation 都引用了 CPU 版本,但它似乎在任何地方都不存在。你会建议我做什么? 所有 CPU OpenCV 代码都可用于 CV4Android 吗?如果是,那么 HOGDescriptor 确实存在;我用过。如果您签出 (git clone
) OpenCV 源代码树,您可以在此处查看 CPU HOG 代码:opencv/modules/objdetect/src
。有关示例 HOGDescriptor 应用程序,请参阅opencv/samples/cpp/peopledetect.cpp
。但是,您需要 HOGDescriptor hog(); h.compute(...)
获取实际的 HOG 描述符,而不是使用人员检测器功能。一旦你得到这个工作,看看如何将自定义参数放入 HOGDescriptor 构造函数。
@AbidRahmanK 啊,我在想OP也想识别数独中的手绘数字。不过,HOG+SVM 策略也应该适用于“计算机字体”数字。只需训练您尝试识别的字体即可。 (或者,更好的是,在您想要识别的字体的手动标记相机图像上进行训练。)以上是关于数字识别建议的主要内容,如果未能解决你的问题,请参考以下文章