逐符号手写识别的算法是什么?

时间:2011-11-28 17:39:15

标签: gesture-recognition handwriting

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

3 个答案:

答案 0 :(得分:8)

您可以实现简单的神经网络来识别手写数字。最简单的实现类型是通过反向传播训练的前馈网络(可以随机训练或以批处理模式训练)。您可以对反向传播算法进行一些改进,这将有助于您的神经网络更快地学习(动量,席尔瓦和阿尔梅达的算法,模拟退火)。

就查看真实符号和预期图像之间的差异而言,我见过的一种算法是k-nearest-neighbor algorithmHere是一篇描述使用 k - 最近邻算法进行字符识别的文章(编辑:我之前的链接错误。我提供的链接要求你支付报酬;我正在努力寻找论文的免费版本

如果您使用神经网络识别您的角色,所涉及的步骤将是:

  1. 使用适当的训练算法设计神经网络。我建议从最简单的(随机反向传播)开始,然后根据需要改进算法,同时训练你的网络。
  2. 获取良好的培训数据样本。对于识别手写数字的神经网络,我使用了MNIST database
  3. 将训练数据转换为神经网络的输入向量。对于MNIST数据,您需要对图像进行二值化。我使用了128的阈值。我从Otsu's method开始,但这并没有给我我想要的结果。
  4. 创建您的网络。由于来自MNIST的图像以28x28的数组形式出现,因此您的神经网络具有784个分量和1个偏差(因此785个输入)的输入向量。我使用了一个隐藏层,其中节点的数量根据guidelines outlined here设置(以及偏差)。您的输出向量将包含10个组件(每个数字一个)。
  5. 随机向您的网络提供训练数据(如此随机排列的数字,每个数字随机输入图像)并对其进行训练,直至达到所需的错误级别。
  6. 针对您的神经网络运行测试数据(MNIST数据也附带此信息)以验证它是否正确识别数字。
  7. 您可以查看尝试识别手写数字的示例here无耻插件)。我使用来自MNIST的数据训练了网络。

    如果你决定走这条路,那么期待花一些时间让自己加快神经网络的概念。在我真正理解这个概念之前,我花了至少3-4天的时间阅读和编写代码。一个好的资源是heatonresearch.com。我建议首先尝试实现神经网络来模拟AND,OR和XOR布尔运算(使用阈值激活函数)。这应该让您了解基本概念。当它真正归结为训练你的网络时,你可以尝试训练一个识别XOR布尔运算符的神经网络;这是开始学习算法的好地方。

    在构建神经网络时,您可以使用Encog之类的现有框架,但我发现自己构建网络要更加令人满意(您可以通过我的方式了解更多)。如果您想查看某些来源,可以查看我在github无耻插件)上的项目,该项目包含一些Java基础类,可帮助您构建和训练简单的神经-networks。

    祝你好运!

    修改

    我发现了一些使用 k - 最近邻居进行数字和/或字符识别的来源:

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

答案 1 :(得分:2)

附录

如果您尚未实施机器学习算法,请务必查看:www.ml-class.org

这是斯坦福机器学习中心主任Andrew Ng教授的免费课程。该课程是一门完全在线授课的课程,专门用于实施各种机器学习算法。它不会过多地涉及算法的理论复杂性,而是教你如何选择,实现,使用算法以及如何诊断它们的性能。 - 它的独特之处在于自动检查算法的实现!这对于开始机器学习很有帮助,因为你有即时反馈。

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

该课程已经开始了一段时间,但它仍然可以注册。如果没有,新的运行应该在明年初开始。如果您希望能够检查您的实施,则需要注册“高级跟踪”。

实现手写识别的一种方法

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

如果你有一个像样的大小库,那么快速而肮脏的标准机器学习算法的实现可能就是你要走的路。您可以使用多项分类器,神经网络或支持向量机。

我相信支持向量机的实施速度最快,因为有很好的库可以为你处理代码的机器学习部分,例如: libSVM。如果您熟悉使用机器学习算法,则执行时间不到30分钟。

您可能希望实施的基本程序如下:

了解“看起来像”的符号

  1. 对图书馆中的图片进行二值化。
  2. 将图像展开为矢量/ 1-D数组。
  3. 将库中图像的“矢量表示”及其标签传递给libSVM,以使其了解像素覆盖与图像库中图像的表示符号的关系。
  4. 该算法为您提供了一组模型参数,用于描述所学习的识别算法。
  5. 您应该为要识别的每个字符重复1-4,以获得一组适当的模型参数。

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

    如果您想识别符号:

    每组模型参数都描述了一种算法,该算法测试一个角色是否代表一个特定角色。通过使用当前符号测试所有模型,然后选择最适合您正在测试的符号的模型,“识别”一个角色。

    通过再次将模型参数和符号传递给展开的SVM库来完成此测试,该库将返回测试模型的拟合优度。

答案 2 :(得分:2)

你检查过Detexify吗?我认为它几乎可以满足您的需求 http://detexify.kirelabs.org/classify.html

它是开源的,所以你可以看看它是如何实现的。 你可以从这里得到代码(如果我不记错了,它在Haskell中) https://github.com/kirel/detexify-hs-backend

特别是你要找的是Sim.hs

我希望它有所帮助