7

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

4

3 回答 3

8

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

至于查看真实符号和预期图像之间的差异,我见过的一种算法是k -nearest-neighbor algorithm是一篇描述使用k近邻算法进行字符识别的论文(编辑:我之前的链接错误。我提供的链接需要您为论文付费;我正在尝试找到免费版本论文)。

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

  1. 使用适当的训练算法设计您的神经网络。我建议从最简单的(随机反向传播)开始,然后在训练网络时根据需要改进算法。
  2. 获得良好的训练数据样本。对于识别手写数字的神经网络,我使用了MNIST 数据库
  3. 将训练数据转换为神经网络的输入向量。对于 MNIST 数据,您需要对图像进行二值化处理。我使用了 128 的阈值。我从Otsu 的方法开始,但这并没有给我想要的结果。
  4. 创建您的网络。由于来自 MNIST 的图像以 28x28 的数组形式出现,因此您的神经网络有一个包含 784 个分量和 1 个偏差(即 785 个输入)的输入向量。我使用了一个隐藏层,其节点数量按照此处概述的指南设置(以及偏差)。您的输出向量将有 10 个分量(每个数字一个)。
  5. 将训练数据(随机排序的数字,每个数字的随机输入图像)随机呈现给您的网络并对其进行训练,直到达到所需的错误级别。
  6. 针对您的神经网络运行测试数据(MNIST 数据也附带)以验证它是否正确识别数字。

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

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

在构建神经网络时,您可以使用现有的框架,例如Encog,但我发现自己构建网络要令人满意得多(我认为您可以通过这种方式学习更多)。如果您想查看一些源代码,可以查看我在github上的一个项目(无耻插件),其中包含一些 Java 基本类,可帮助您构建和训练简单的神经网络。

祝你好运!

编辑

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

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

于 2011-12-08T00:06:15.510 回答
2

附录

如果您在真正检查之前还没有实现机器学习算法:www.ml-class.org

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

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

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

一种实现手写识别的方法

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

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

我相信支持向量机将是最快实现的,因为那里有优秀的库可以为您处理代码的机器学习部分,例如libSVM。如果您熟悉使用机器学习算法,这应该花费您不到 30 分钟的时间来实施。

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

学习符号“看起来像”什么

  1. 二值化库中的图像。
  2. 将图像展开为向量/一维数组。
  3. 将库中图像的“矢量表示”及其标签传递给 libSVM,以使其了解像素覆盖率与库中图像的表示符号之间的关系。
  4. 该算法为您返回一组模型参数,这些参数描述了所学习的识别算法。

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

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

如果要识别符号:

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

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

于 2011-12-07T09:49:40.047 回答
2

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

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

特别是您要查找的内容应该在 Sim.hs 中

我希望它有帮助

于 2011-12-09T11:53:34.217 回答