您需要多少个程序员和单词才能识别手写护照?

您认为手写护照在我们国家经常被发现吗?当我们开始Smart Engines设计护照识别系统,似乎足以教该系统以高质量的方式识别打字的文档。当时,无法自动识别的手写护照的存在似乎并不是一个重要问题:没有它,就会有很多未解决的问题。一年前,分析Smart IDReader的工作质量,我们意识到手写护照构成了严重的错误类别。按照科学方法,他们研究了问题并做出了决定。今天将有一个故事,讲述我们如何识别俄罗斯联邦的手写护照,成功解决了护照数据输入完全自动化的最后一个问题。


以一般方式识别手写文本的任务听起来是根本的,大规模的且无法解决的。因此,首先重要的是正确限制任务的形式化。因此,我们将识别出俄罗斯民用护照主要掉头的手写文字。此类护照用纯净的书法(至少根据护照提供者)手写。一方面,这使任务更加容易:我们不必识别“医疗涂鸦”和其他阅读不佳的文本。但是,另一方面,我们必须面对西里尔字母的所有书法风格的变化。好吧,这更多是一个严峻的挑战,而不是一个无法解决的问题。

护照中的手写识别任务分为三个子任务:

  1. 检测护照中手稿的存在。
  2. 将手写行分割为字符。
  3. 字符识别和后处理。

在本文的进一步部分,我们将向您介绍有关每个子任务的解决方案的更多信息。但是首先,我们将讨论一个始终在识别中首先出现的非常重要的问题-数据集。没有数据集,就无法完成正常的识别:即使您可以在合成数据上训练神经网络,您仍然需要可测量训练后系统准确性的数据。事实证明,网络上没有合适的手稿数据集。因此,我们的子任务列表添加了零点-“准备数据集”。我们创造性地处理了这个过程:我们“用尺子”分发了笔记本,并要求所有程序员“习惯”书法大师的角色-用漂亮的笔迹重写一些预先准备好的文本。这些是A.S.的经文 普希金。

在这里,我们正在等待第一个失望。不管听起来多么艰难,事实证明我们的程序员已经完全忘记了如何编写。而且您不能说他们没有尝试。不,他们只是忘记了如何手工拼写字母。这是发生的情况的一个示例:



同意,这根本不是必需的。字母在跳舞,尺寸不被尊重……我不得不在互联网上寻找字帖,并且像头等舱一样,让每个人都用字面意义写东西!我们仍然微笑着记住这次:整个团队(无一例外,从三年级学生到杰出的科学博士)都坐在桌子旁,仔细地显示字母。



在两天的时间里,我们已经准备好重复尝试收集手写数据集的“原始”数据。字母变得更流畅,单词更易读。有些甚至设法引入了书法的一些元素。现在,您自己看一下新样本:









由于这些空白文本和手写内容不同,我们收集了大约1000块,仔细地数字化了它们,并将它们放入线条和符号中。恭喜,手稿数据集已准备就绪。回到算法。

护照手稿检测


原稿检测是工业文件识别系统的重要元素。此功能属于“文档理解”类别,并且在商业客户方面有很高的要求。我们训练了一个二进制卷积神经网络,该网络分析了护照上各个文本行的输入图像。使用此网络对护照的每个字段进行手稿分析,然后通过权衡收到的估算值,对护照的整体“手稿”做出一般性决定。

手写线分割成字符


笔迹分割从根本上不同于打字稿分割。要了解问题的第一级,只需尝试手写“ chinchilla”一词,然后看看这些“细长的钩子行”。对于手写测试的细分,我们再次使用了神经网络。我们训练了一个特殊的神经网络,作为答案,该神经网络返回了在文本输入图像的每个点上字母之间存在“剪切”的估计值。此外,应用动态编程的原理,构造字母的各个部分。




在字母之间留出空白的问题远不是分割的全部痛苦。您必须正确地垂直限制每个字符。在这里,识别印刷文本时经常使用的“基线”线搜索根本不适用-手写字母的高度在无限范围内跳跃。

字符识别和后处理


识别手写字符的问题主要是不同字符的样式相同。看上面的例子:哪个姓写的是“ Petrov”还是“ Netrov”?当一个人阅读手写的文本时,他永远不会一个字一个字符地阅读,而总是在给定的上下文中阅读。在这种情况下,识别系统的行为应相同。因此,识别手写字符的神经网络应``容忍''具有相同类型的不同字母(从数学角度来看,它应为此类字符返回相同的置信度值),以及用于分析和处理识别结果的后续算法(因此称为“后处理器”)应考虑到已识别字段的功能。

最终我们取得了什么?


因此,一年来,我们学会了识别手写护照,从而遗忘了几年前似乎无法解决的根本问题!下一步是什么?然后,像往常一样,致力于质量和新领域。

PS我几乎忘了标题中所述问题的答案。因此,我们公司有62位程序员。我们购买了150台笔记本,打印了2,000张处方。


All Articles