【发布时间】:2013-04-30 09:34:35
【问题描述】:
现在我正在尝试使用 OpenCV 创建数字识别系统。 WEB上有很多文章和例子(甚至在StackOverflow)。我决定使用KNN classifier,因为这个解决方案在 WEB 中是最流行的。我找到了一个database of handwritten digits,它的训练集包含 60k 个示例,错误率低于 5%。
我以this tutorial 为例,说明如何使用 OpenCV 处理此数据库。我正在使用完全相同的技术,并且在测试数据 (t10k-images.idx3-ubyte) 上我的错误率是 4%。但是当我尝试对自己的数字进行分类时,我遇到了更大的错误。例如:
- 被识别为 7
- 和 被识别为 5
- 和 被识别为 1
- 被识别为 8
等等(如果需要,我可以上传所有图片)。
如您所见,所有数字都具有良好的质量,并且很容易被人类识别。
所以我决定在分类之前做一些预处理。从MNIST database site 的表格中,我发现人们正在使用 deskewing、noise removal、blurring 和 pixel shift技巧。不幸的是,几乎所有文章的链接都被破坏了。所以我决定自己做这样的预处理,因为我已经知道该怎么做了。
现在,我的算法如下:
- 腐蚀图像(我觉得我原来的数字太
粗糙)。 - 去除小轮廓。
- 阈值和模糊图像。
- 中心数字(而不是移位)。
我认为在我的情况下不需要纠偏,因为所有数字通常都会旋转。而且我也不知道如何找到合适的旋转角度。 所以在这之后我得到了这些图片:
- 也是 1
- 是 3(不是以前的 5)
- 是 5(不是 8)
- 是 7(利润!)
所以,这样的预处理对我有点帮助,但我需要更好的结果,因为在我看来,这样的数字应该可以毫无问题地识别出来。
谁能给我关于预处理的任何建议?感谢您的帮助。
附:我可以上传我的源代码 (c++)。
【问题讨论】:
-
好吧,您的训练数据是手写数字,但这些是打印数字。也许用打印的数字训练?
-
@DavidBrown 我想过,但是我在哪里可以找到这么大(60k)的数据库?自己创作?
-
@ArtemStorozhuk,使用你电脑上安装的字体作为训练集。
-
@John 哇,我不知道我可以在我的电脑上找到它们!一直想着谷歌。你以为我一个人就能练出这么强大的db?手写数字与普通印刷数字有那么大的区别吗?
-
@ArtemStorozhuk,您的结果有力地证明了它们完全不同。
标签: c++ opencv image-processing image-recognition knn