如何使用机器学习 PlatoBlockchain 数据智能轻松进行手写识别。 垂直搜索。 哎。

如何使用机器学习轻松进行手写识别

如何使用机器学习轻松进行手写识别

想要手写 OCR 吗?本博客全面概述了使用深度学习进行手写识别的最新方法。我们回顾了最新的研究和论文,还从头开始构建了一个手写阅读器。


纳米网 文字识别API 有很多有趣的 用例。 与Nanonets AI专家交谈以了解更多信息。


介绍

预计到13.38年光学字符识别(OCR)市场规模将达到2025亿美元,同比增长13.7%。这一增长是由业务流程的快速数字化推动的,使用 OCR 来降低劳动力成本并节省宝贵的工时。尽管 OCR 已被认为是一个已解决的问题,但它的一个关键组成部分是手写识别(手写 OCR)或手写文本识别(HTR),它仍然被认为是一个具有挑战性的问题陈述。与印刷文本相比,不同人的手写风格差异很大,而且手写文本的质量较差,这给将其转换为机器可读文本带来了重大障碍。然而,对于医疗保健、保险和银行等多个行业来说,这是一个需要解决的关键问题。

如何使用机器学习轻松进行手写识别
资源 :- https://www.semanticscholar.org/paper/Handwriting-recognition-on-form-document-using-and-Darmatasia-Fanany/

深度学习的最新进展(例如,变压器体系结构的出现)快速追踪了我们在破解手写文本识别方面的进展。 识别手写文本被称为智能字符识别(ICR),因为解决ICR所需的算法比解决普通OCR需要更多的智能。

在本文中,我们将了解手写文本识别的任务、其复杂性以及如何使用深度学习技术来解决它。


是否要从手写表格中提取数据? 前往 纳米网 并开始免费构建手写 OCR 模型!


手写识别的挑战

  1. 人与人之间笔划的巨大变异性和歧义性
  2. 每个人的笔迹样式也会随时间而变化并且不一致
  3. 源文档/图像的质量随时间推移而变差
  4. 打印文档中的文本成一直线,而人类无需在白纸上成直线地写一行文本
  5. 草书手写使字符的分离和识别具有挑战性
  6. 手写文本可以向右旋转,这与所有文本笔直放置的打印文本相反
  7. 与合成数据相比,收集标记好的数据集来学习并不便宜

用例

医疗保健和制药

患者处方数字化是医疗保健/制药行业的主要痛点。 例如,罗氏(Roche)每天处理数百万PB的医学PDF。 手写文本检测具有关键影响的另一个领域是患者登记和表格数字化。 通过在其服务工具包中添加手写识别功能,医院/药品可以显着改善用户体验

保险

一个大型的保险业每天要收到超过20万份文件,处理索赔的延迟可能会严重影响公司。 索赔文档可以包含各种不同的手写样式,并且处理索赔的纯手工自动化将完全减缓流程

如何使用机器学习轻松进行手写识别
来源:-https://www.researchgate.net/figure/mages-of-handwriting-bank-cheques-from-different-countries-a-Brazilian-1-b-American_fig2_226705617

银行业

人们定期签发支票,而支票在大多数非现金交易中仍起着主要作用。 在许多发展中国家,当前的支票处理程序要求银行员工阅读并手动输入支票上的信息,并验证诸如签名和日期之类的条目。 由于每天都要在银行处理大量支票,因此手写文本识别系统可以节省成本和人工时间

在线图书馆

通过上传图像扫描以访问整个世界,大量的历史知识正在被数字化。 但是,这种努力并不是很有用,直到可以识别出图像中的文本(可以对其进行索引,查询和浏览)为止。 手写识别在使中世纪和20世纪的文件,明信片,研究报告等方面变得活泼起着关键作用。

方法

手写识别方法大致可分为以下两种类型

如何使用机器学习轻松进行手写识别
  1. 在线方法 :-在线方法涉及数字笔/手写笔,并且可以访问笔画信息,书写文字时的笔位置,如右上图所示。 由于他们倾向于掌握大量有关所写文本的信息,因此可以非常准确地对它们进行分类,并且文本中不同字符之间的分界变得更加清晰
  2. 离线方法 :- 离线方法涉及在写下文本后对其进行识别,因此不会获得书写过程中涉及的笔划/方向的信息,并且可能会添加来自源(即纸张)的一些背景噪音。

在现实世界中,携带带有传感器的数字笔来捕获笔画信息并不总是可能/可扩展的,因此离线识别文本的任务是一个更相关的问题。因此,现在我们将讨论解决离线文本识别问题的各种技术。

技术

解决手写识别的最初方法涉及机器学习方法,如隐马尔可夫模型(HMM)、SVM等。对初始文本进行预处理后,进行特征提取以识别关键信息,例如循环、拐点、长宽比等。具有个性的。这些生成的特征现在被输入到分类器(例如 HMM)以获得结果。由于手动特征提取阶段及其有限的学习能力,机器学习模型的性能相当有限。特征提取步骤因每种语言而异,因此不可扩展。随着深度学习的出现,手写识别的准确性得到了巨大的提高。让我们讨论一下手写识别深度学习领域的一些著名研究

多维递归神经网络

我们知道,RNN/LSTM 可以处理顺序数据来识别时间模式并生成结果。但它们仅限于处理一维数据,因此不能直接应用于图像数据。为了解决这个问题,本文作者提出了多维RNN/LSTM结构,如下图所示

如何使用机器学习轻松进行手写识别

以下是一般RNN和多维RNN之间的区别。 在一般的RNN中,隐层说我在时间i-1中从先前的隐层接收状态。 在多维RNN中,例如说一个二维RNN,隐藏层(i,j)从多个先前的隐藏层(即(i-2,j)和(i,j-1))接收状态,从而从这两者捕获上下文图像中的高度和宽度,这对于通过网络清楚地了解本地区域至关重要。 类似于BI-LSTM如何从t-1和t + 1接收信息,这进一步扩展为不仅从先前的层而且从将来的层获取信息。 类似地,二维MDRNN隐藏层i现在可以接收信息(i-1,j),(i,j-2),(i + 1,j),(i,j + 1),从而捕获所有方向的上下文

如何使用机器学习轻松进行手写识别

整个网络结构如上所示。 使用MDLSTM只是从上述MDRNN讨论中用LSTM块代替RNN块。 输入被分为3×4大小的块,现在将其馈送到MDSTM层中。 该网络具有MDLSTM层的分层结构,后面是串联的前馈(ANN)层。 然后将最终输出转换为一维矢量,并将其提供给CTC函数以生成输出

连接主义者的时间分类(CTC) 是一种用于处理语音识别、手写识别等任务的算法。其中只有输入数据和输出转录可用,但没有提供对齐细节,即音频中的特定区域如何用于语音或图像中的特定区域如何用于手写与特定字符对齐。简单的启发式方法(例如为每个字符提供相同的区域)是行不通的,因为每个字符所占用的空间大小因人而异、因时而异。

对于我们的手写识别用例,将特定句子的输入图像区域视为输入 X=[x1,x2,...,**],而预期输出为 Y=[y1,y2,...,y ** U]。给定 X,我们应该找到准确的 Y。CTC 算法的工作原理是获取输入 X 并给出所有可能的 Y 的分布,使用它我们可以对最终输出进行预测。

CTC 使用基本字符(例如)来区分输入区域中的重复字符和重复字符。例如,特定字符可以跨越多个输入区域,因此 CTC 将连续输出相同的字符。示例:- 输入 james,CTC 的输出是 jjaammmees。最终的输出是通过折叠重复的输出而得出的,因此我们得到了 james。但现在要呈现重复字符,在 hello 中说“l”,我们需要进行适当的分隔,因此所有输出都用连字符 (-) 分隔。现在 hello 的输出可能是 h-ee-ll-lll-oo,如果折叠起来将变成 hello 而不是 helo。有关 CTC 如何工作的更多信息,请参见此处 CTC.

在基于每个位置的最高概率的简单启发式对 CTC 的输出进行解码时,我们可能会得到在现实世界中可能没有任何意义的结果。为了解决这个问题,我们可以使用不同的解码器来改善结果。让我们讨论不同类型的解码

  1. 最佳路径解码 :-这是我们到目前为止讨论的通用解码。 在每个位置,我们获取模型的输出,并以最高的概率找到结果。
  2. 波束搜索解码 :-不是每次光束搜索都从网络获取单个输出,而是建议保持每个概率最高的多个输出路径,并以新的输出来扩展链,而丢弃具有较小概率的路径以保持波束大小不变。 通过这种方法获得的结果比使用贪婪方法更准确
  3. 使用语言模型进行波束搜索 :- 束搜索提供了比网格搜索更准确的结果,但它仍然无法解决获得有意义的结果的问题。为了解决这个问题,我们可以使用语言模型和波束搜索,使用模型和语言模型的概率来生成最终结果。

生成精确解码结果的更多细节可以在此查看。 刊文

编码器-解码器和注意力网络

具有编码器-解码器网络的 Seq2Seq 模型最近在解决语音识别、机器翻译等任务中很受欢迎,因此已经通过部署额外的注意力机制扩展到解决手写识别的用例。让我们讨论一下该领域的一些开创性研究

扫描,参加和阅读

在这项具有开创性的著作《 Scan,Attend and Read(SAR)》中,作者提出了将基于注意力的模型用于端对端手写识别的用法。 该研究的主要贡献是文本的自动转录而无需将其分割成几行作为预处理步骤,因此可以扫描整个页面并给出结果。

如何使用机器学习轻松进行手写识别

SAR使用基于MDLSTM的架构,该架构类似于我们上面讨论的架构,但在最后一层稍有改动。 在最后一个线性层(即上图中的最后一个Sum块)之后,特征图在垂直维度上折叠起来,并应用最终的softmax函数获得输出。

如何使用机器学习轻松进行手写识别

SAR体系结构由充当特征提取器的MDLSTM体系结构组成。 最终的具有softmax输出和CTC损失的折叠模块由注意模块和LSTM解码器代替。 所使用的注意力模型是基于内容的注意力和基于位置的注意力的混合组合,将在下一篇文章中进行详细说明。 解码器LSTM模块采用先前的状态,先前的关注图和编码器功能来生成最终的输出字符和状态向量,以进行下一次预测。

参与,参与和拼写

本文提出了一种基于注意力的手写单词识别序列到序列模型。 拟议的架构包含三个主要部分:编码器,由CNN和双向GRU组成;关注机制,专注于相关功能;解码器,由单向GRU形成,能够拼写相应的单词;逐个字符。

如何使用机器学习轻松进行手写识别

编码器使用 CNN 来提取视觉特征。使用预先训练的 VGG-19-BN 架构作为特征提取器。输入图像被转换为​​特征图 X,然后通过按列分割所有通道并将它们组合起来以获得顺序信息,将其重新整形为 X'。 X' 通过使用双向 GRU 进一步转换为 H。 GRU本质上是类似于LSTM的神经网络,可以捕获时间信息。

此外,在预测解码器的输出时,采用注意力模型。 本文讨论了探索的两种不同类型的注意力机制。

  1. 基于内容的注意力 :-这背后的想法是找到解码器的当前隐藏状态与编码器的特征图之间的相似性。 我们可以在编码器的特征图中找到最相关的特征向量,这些特征向量可用于预测当前时间步的当前字符。 从这里可以看到更多有关注意力机制如何工作的细节 注意
  2. 基于位置的注意 :- 基于内容的位置机制的主要缺点是存在一个隐含的假设,即位置信息嵌入在编码器的输出中。否则,无法区分从解码器重复的字符输出。例如,考虑单词 Charmander,字符 a 在其中重复两次,如果没有位置信息,解码器将无法将它们预测为单独的字符。为了缓解这种情况,通过使用编码器输出和先前的对齐来预测当前字符及其对齐。有关基于位置的出席如何运作的更多详细信息,请参见 此处.

解码器是单向多层GRU。 在每个时间步t,它从前一个时间步接收输入,并从注意力模块接收上下文向量。 在训练中探索多项式解码和标签平滑以提高泛化能力。

变压器型号

尽管编码器-解码器网络在手写识别方面取得了很好的效果,但由于涉及 LSTM 层,因此在训练中存在瓶颈,因此无法并行化。最近 Transformer 非常成功,并取代了 LSTM 来解决各种语言相关的任务。现在让我们讨论如何将基于转换器的模型应用于手写识别。

注意阅读内容

在这项工作中,作者建议在视觉和文本阶段都使用基于变压器的体系结构,该体系使用多头注意力自我注意层,因此可以学习字符识别以及要解码的字符序列的语言相关性。 由于语言知识已嵌入到模型本身中,因此不需要使用语言模型的任何其他后处理步骤,因此具有预测不属于词汇表的输出的能力。 为此,文本编码是在字符级别而不是单词级别进行的。 由于变压器架构允许针对每个区域或每个角色并行训练模型,因此大大简化了训练过程。

如何使用机器学习轻松进行手写识别

网络架构由以下组件组成

  1. 视觉编码器 :-提取相关特征并在不同角色位置应用多头视觉自我注意
  2. 文字记录器 :-它的任务是获取文本输入,对其进行编码,对多头语言进行自我关注并在视觉和文本功能上相互关注。
视觉编码器

Resnet50 主干用于额外的功能,如上图所示。 Resnet3 Fc 输出的 50 维特征图被传递到时间编码模块,该模块通过保持相同的宽度以及 (f x h, w) 的形状来重塑为 2d。将其输入到全连接层以将形状减小为 (f, w),最终的输出为 Fc'。此外,Fc' 中还添加了位置编码 TE,以保留 Vaswani 在 Transformer 论文中提到的位置信息。有关变压器架构如何设计的更多信息,请参见 此处。 输出通过一个完全连接的层,以获得形状为(f,w)的最终特征图。 最终输出通过具有8个头的多头注意力模块传递,以获得丰富的视觉特征图

文字记录器

输入文本通过编码器传递,该编码器生成字符级嵌入。 这些嵌入与时间位置相结合,类似于使用时间编码器模块在Visual Encoder中的方式。 然后,此结果将传递到与视觉编码器中的注意力模块相似的多头语言自我注意力模块。 沿着视觉编码器的视觉特征生成的文本特征将传递到一个相互注意的模块,该模块的任务是对齐并组合从图像和文本输入中学习的特征。 输出通过softmax函数传递以获得最终结果。

在对测试数据进行评估时,转录不可用。 因此,仅将起始令牌<S>作为输入传递,并且将第一预测字符反馈到系统,该系统输出第二预测字符。 在循环中重复此推理过程,直到产生序列符号<E>的末尾或达到最大输出长度N为止。

手写文字生成

手写文本生成是生成真实手写文本的任务,因此可用于扩充现有数据集。众所周知,深度学习需要大量数据进行训练,而获取不同语言的大量标记手写图像语料库是一项繁琐的任务。为了解决这个问题,我们可以使用生成对抗网络来生成训练数据。让我们在这里讨论一种这样的架构

拼字游戏

ScrabbleGAN遵循一种半监督的方法来合成手写文本图像,这些文本在样式和词典上都十分通用。 它具有生成不同长度图像的能力。 生成器还可以操纵生成的文本样式,这使我们能够确定文本是否必须为草书或说出笔触的粗细。

如何使用机器学习轻松进行手写识别

该架构包含一个基于BigGAN的全卷积生成器。 对于输入中的每个字符,选择一个相应的过滤器,并将所有值串联在一起,然后将其乘以一个噪声矢量z,该噪声矢量控制生成的文字样式。 从上面可以看出,为每个单独的字符生成的区域重叠,因此有助于生成连接的递归文本,并允许不同字符大小的灵活性。 例如,m占据大部分空间,而e和t占据有限的面积。 为了使整个单词或句子保持相同的样式,样式向量z对于所有字符均保持恒定。

基于 BigGAN 架构的卷积判别器用于对图像的生成风格看起来是假的还是真的进行分类。鉴别器不依赖于字符级注释,因此不基于类条件 GAN。这样做的优点是不需要标记数据,因此来自不可见语料库的数据(不属于训练数据的一部分)可以用于训练鉴别器。与鉴别器一起,训练文本识别器 R 来分类生成的文本是否有意义或是否是乱码。识别器基于 CRNN 架构,去掉了循环头,使识别器稍微弱一些,即使文本不清楚也无法识别。将 R 的输出中生成的文本与提供给生成器的输入文本进行比较,并将相应的惩罚添加到损失函数中。

ScrabbleGAN生成的输出如下所示

如何使用机器学习轻松进行手写识别

数据集

  1. IAM :-IAM数据集包含约100k英文单词的图像,其中包括657位不同作者撰写的单词。 训练,测试和验证集包含互斥的作者编写的词链接:- http://www.fki.inf.unibe.ch/databases/iam-handwriting-database
  2. CVL :-CVL数据集由七个手写文档组成,由约310名参与者撰写,产生了约83k单词作物,分为训练集和测试集链接:- https://cvl.tuwien.ac.at/research/cvl-databases/an-off-line-database-for-writer-retrieval-writer-identification-and-word-spotting/
  3. 犯罪 :-包含60位作者写的约1300k图像的法语单词,对应于每个人写的约5封邮件。 http://www.a2ialab.com/doku.php?id=rimes_database:start

指标:-

字符错误率 :-计算为Levenshtein距离,它是将一个字符串转换为另一个字符串所需的字符替换(Sc),插入(Ic)和删除(Dc)的总和,除以Groundtruth(Nc)

如何使用机器学习轻松进行手写识别

字错误率 :-计算为将一个字符串转换为另一个字符串所需的单词替换(Sw),插入(Iw)和删除(Dw)的总和除以groundtruth中的单词总数(Nw)

如何使用机器学习轻松进行手写识别

训练自己的手写识别模型

现在让我们看看如何训练我们自己的手写文本识别模型。我们将在 IAM 数据集上进行训练,但您也可以在自己的数据集上训练模型。让我们讨论一下设置所涉及的步骤

时间

要从中下载IAM数据集寄存器 此处。 一旦注册,就从这里下载words.tgz 此处。 这包含手写文字图像的数据集。 还可以从以下位置下载注释文件word.txt 此处.

如果要使用自己的数据集,则需要遵循IAM数据集的数据结构。

如何使用机器学习轻松进行手写识别

上图显示了 AIM 数据集文件夹结构的外观。这里a01、a02等代表父文件夹,每个文件夹都有数据的子文件夹。每个子文件夹都有一组图像,其中文件夹名称作为前缀添加到其文件名中。

另外,我们需要一个注释文件来提及图像文件的路径和相应的转录。 例如,考虑上面带有文本提名的图像,下面是注​​释文件words.txt中的表示形式

a01-000u-01-00确定156 VBG提名

  1. a01-000u-01-00->格式为a01-000u的行的单词ID
  2. 正常/错误->分段输出质量指标
  3. 156->灰度以对包含该单词的行进行二值化
  4. 395 932 441 100->以x,y,w,h格式围绕此单词的边界框
  5. VBG->这个单词的语法标签。 这是动词格伦德
  6. 提名->这个词的抄写

建筑学 :-

我们将培训具有CTC损失的基于CRNN的体系结构。 使用CNN提取传递到RNN的视觉特征,并使用贪婪的解码器将CTC损失应用于末端以获取输出。

如何使用机器学习轻松进行手写识别

产品培训

我们将使用来自 此处 训练我们的模型。 请按照以下步骤准备数据

python checkDirs.py

运行上面的命令,您应该看到类似以下的输出

[确定]字/
[确定]字/ a01 / a01-000u /
[确定] words.txt
[确定] test.png
[OK] words/a01/a01-000u/a01-000u-00-00.png

现在您已经准备好开始训练。

转到根目录并执行

python main.py --train

成果

经过约50个时期的训练后,字符错误率(CER)为10.72%,而单词错误率(WER)为26.45%,因此单词准确度为73.55%。 下图中可以看到一些预测。

如何使用机器学习轻松进行手写识别

该模型能够在很大程度上准确地预测角色,但是在少数情况下会遭受诸如可怕地预测为不幸,故事被预测为凝视的情况。 这些问题可以通过将语言模型与解码器一起使用作为后处理步骤来解决,解码器可以生成有意义的单词并纠正简单的错误。

总结

尽管技术方面取得了重大进展,有助于更好地识别手写文本,但是与OCR相比,HTR尚无法解决问题,因此尚未在工业中广泛使用。 但是,随着技术发展的步伐以及诸如变压器等模型的推出,我们可以期望HTR模型很快会变得司空见惯。

要对此主题进行更多研究,您可以从 此处

延伸阅读

时间戳记:

更多来自 人工智能与机器学习