有哪些逐笔手写识别算法?

7

我认为有一些算法可以评估绘制的符号与预期符号之间的差异,或者类似于这样的算法。任何帮助都将不胜感激 :))


有两种手写识别:一是即时识别手写符号(在线);另一种是已经绘制好的符号识别(离线)。对于这两种方法,都有不同的识别方法。你更感兴趣哪种方法? - Peter O.
一次只能绘制一个符号,机器立即识别并清除输入以进行下一个符号的输入。 - nicks
英语或非英语,这是很大的区别。 - Eric Yin
你应该学习Palm的Graffiti http://en.wikipedia.org/wiki/Graffiti_%28Palm_OS%29。我喜欢它:学习字母很容易(对于用户),而且识别也很简单(对于PDA),准确度远比识别自由手写高。 - ern0
现在真的不需要特殊的字母表了:当 Graffiti 开发时,Palm 的资源非常有限。在今天的硬件和现代算法下,自然书写的字符可以获得出色的识别结果。此外,语言对逐字识别不应该有影响。差异将来自不同的字母表:拉丁文、阿拉伯文、汉字等。 - ARF
3个回答

8
您可以实现一个简单的神经网络来识别手写数字。最简单的类型是通过反向传播训练的前馈网络(可以随机或批量训练)。有一些改进可以应用于反向传播算法,以帮助神经网络更快地学习(动量、Silva和Almeida算法、模拟退火)。
至于区分真实符号和预期图像之间的差异,我见过使用的一个算法是k最近邻算法这里是一篇描述如何使用k最近邻算法进行字符识别的论文(编辑:我之前提供的链接需要付费获取该论文;我正在尝试找到免费版本的论文)。
如果您要使用神经网络来识别字符,则涉及以下步骤:
  1. 使用适当的训练算法设计神经网络。我建议从最简单的(随机反向传播)开始,然后在训练网络时改进算法。
  2. 获取良好的训练数据样本。对于我识别手写数字的神经网络,我使用了MNIST数据库
  3. 将训练数据转换为神经网络的输入向量。对于MNIST数据,您需要对图像进行二值化处理。我使用了阈值128。我最初尝试了Otsu's方法,但没有得到我想要的结果。
  4. 创建您的网络。由于MNIST中的图像以28x28的数组形式出现,因此您有一个包含784个组件和1个偏置(共785个输入)的输入向量。我使用了一个隐藏层,并根据这里列出的指南设置节点数(以及一个偏置)。您的输出向量将有10个组件(每个数字一个)。
  5. 随机向网络提供训练数据(因此每个数字的顺序是随机的,并且每个数字的输入图像也是随机的),并训练它直到达到所需的错误水平。
  6. 运行测试数据(MNIST数据也带有此功能)对您的神经网络进行验证,以确保它正确识别数字。

您可以查看一个示例此处 (自荐),尝试识别手写数字。我使用MNIST的数据训练了网络。

如果您决定选择这条路线,请预留一些时间来了解神经网络概念。在我真正理解该概念之前,我花了至少3-4天的时间阅读和编写代码。heatonresearch.com是一个很好的资源。我建议先尝试实现神经网络以模拟AND、OR和XOR布尔运算(使用阈值激活函数)。这应该会给您一个基本概念。当您真正开始训练网络时,您可以尝试训练一个识别XOR布尔运算符的神经网络;这是一个介绍学习算法的好起点。

当涉及到构建神经网络时,您可以使用现有的框架,比如Encog,但我发现自己构建网络会更加令人满意(我认为这样可以学到更多)。如果您想查看一些源代码,可以查看我在github上的一个项目(自荐),其中包含一些Java基本类,可帮助您构建和训练简单的神经网络。

祝你好运!

编辑

我找到了一些使用k-最近邻算法进行数字或字符识别的资料:

关于神经网络的资源,我发现以下链接很有用:


@PeterO。你说得对。我链接错了。我所指的论文是D.Y. Lee写的。题目是“使用K最近邻、径向基函数和反向传播神经网络进行手写数字识别”。不过我似乎找不到它的链接,不知为何。我会更新我的答案。感谢你指出这一点。 - Vivin Paliath
1
啊,神经网络……这让我想起了我在大学时想要从事人工智能的岁月……为怀旧加一分,那些日子真是美好。 - Guillaume
@Guillaume 这是一个有趣的话题。最近我有机会为课程项目创建自己的神经网络。我觉得这个经历非常有教育意义! - Vivin Paliath
1
哦,是的,我还记得当你看到你的网络开始真正学习并做出比你想象中更好的事情时的感觉 :) 就像你创造了一些有生命的东西。 - Guillaume
我从这里开始学习:http://www.heatonresearch.com/content/non-mathematical-introduction-using-neural-networks。不幸的是,神经网络非常数学密集型(特别是反向传播算法),所以你真的无法逃避它。 - Vivin Paliath
显示剩余2条评论

2

附录

如果您以前没有实现过机器学习算法,建议您查看:www.ml-class.org

这是由斯坦福大学机器学习中心主任Andrew Ng教授的免费课程。该课程完全在线授课,专门讲解各种机器学习算法的实现。它不会深入讲解算法的理论细节,而是教你如何选择、实现和使用算法,并诊断其性能。 - 它独特之处在于自动检查你对算法的实现!对于初学机器学习的人来说,可以获得即时反馈。

该课程还包括至少两个识别手写数字的练习。(编程练习3:使用多项式分类和编程练习4:使用前馈神经网络)

这门课程已经开始一段时间了,但仍然有可能注册。如果不行,新一轮课程应该会在明年初开始。如果你想检查你的实现,你需要注册“高级课程”。

一种实现手写识别的方法

这个问题的答案取决于许多因素,包括您有哪些资源限制(嵌入式平台)以及是否有一个正确标记符号的良好库:即不同手写字母的示例,你知道它们代表什么字母。

如果你有一个相当大的库,实现一个快速而简单的标准机器学习算法可能是最好的选择。你可以使用多项式分类器、神经网络或支持向量机。

我认为支持向量机是最快实现的方法,因为有很好的库能够处理代码中的机器学习部分,例如libSVM。如果你熟悉使用机器学习算法,这应该只需要不到30分钟就能完成。

你可能想要实现的基本过程如下:

学习符号的外观

  1. 将库中的图像二值化。
  2. 将图像展开成向量/ 1-D 数组。
  3. 将库中图像的“向量表示”和它们的标签传递给libSVM,让它学习像素覆盖与库中所代表的符号之间的关系。
  4. 该算法会给出一组模型参数,描述所学习的识别算法。

您应该为要识别的每个字符重复步骤1-4,以获得适当的模型参数集。

注意:步骤1-4只需要对库中的符号执行一次(但对于您想要识别的每个符号都要执行一次)。您可以在开发机器上执行此操作,并仅将参数包含在您发布/分发的代码中。

如果您想要识别一个符号:

每组模型参数描述了一个算法,该算法测试一个字符是否代表一个特定的字符。通过测试所有模型并选择最适合正在测试的符号的模型来“识别”字符。
这种测试是通过将模型参数和要测试的符号以展开形式再次传递给SVM库来完成的,该库将返回测试模型的拟合度。

2

不知道你可以问丹尼尔·基尔什(danishkirel@gmail.com),他非常友好。 - JuanPi

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