zh

数据解决方案

请填写姓名

手机号码格式错误

请填写手机号码

请填写公司全称

请填写企业邮箱

需求描述不能为空

提交成功!感谢您支持数据堂。

填写格式错误请重新填写

确定

需求描述格式错误且最少输入5个字符

暂无数据

语音合成

首页>数据实验室>全部动态>一文带你读懂 OCR

一文带你读懂 OCR

来源:数据堂2019-12-30


简介

OCR,或光学字符识别,是最早的计算机视觉任务之一,因为在某些方面它不需要用到深度学习。因此,早在2012年深度学习热潮之前,OCR就有了各种不同的应用,有些甚至可以追溯到1914年 。 

这使得很多人认为OCR的挑战已经“解决”,不再具有挑战性。另一种来自相似来源的观点认为OCR不需要深度学习,换句话说,对OCR使用深度学习是多余的。  

任何从事计算机视觉或机器学习的人都知道,没有解决任务这回事,这种情况也没有什么不同。相反,OCR只能在非常特定的用例中产生非常好的效果,但是一般来说,它仍然被认为是具有挑战性的。  

此外,对于某些不需要深度学习的OCR任务,确实有很好的解决方案。然而,要真正走向更好、更普遍的解决方案,深度学习将是必须的。

 

OCR的类型

正如我之前提到的,OCR的含义不止一个。在最一般的意义上,它指的是从所有可能的图像中提取文本,无论是一本书的标准打印页面,还是一幅随意有涂鸦的图像(“ 自然环境下  ”)。在这期间,你可能会发现很多其他的任务,比如识别车牌,验证码,街道标志等等。 

虽然每一种选择都有其自身的困难,但显然“自然环境下”的任务是最困难的。  

左侧:印刷的文本。右侧:户外的文本

从这些例子中,可以得出OCR任务的一些属性:  

文本密度:在打印/书写的页面上,文本密度很大。然而,给定一个街道标志的图像,文本是稀疏的。  

文本结构:页面上的文本是有结构的,大部分是严格的行,而文本在野外可能分散在各处,以不同的角度旋转。  

字体:印刷字体更容易,因为它们比那些繁杂的手写字体更有结构。 

字符类型:文本可能来自不同的语言,它们之间可能有很大的不同。此外,文本的结构可能不同于数字,例如房屋编号等。  

人工制品:显然,户外照片比舒适的扫描仪噪音大得多。  

位置:一些任务包括裁剪/居中文本,而在其他任务中,文本可能位于图像中的随机位置。  

 

License plates

另一个在实践中不是很难并有用的普通挑战是车牌识别。与大多数OCR任务一样,此任务需要检测牌照,然后识别它的字符。由于板的形状相对恒定,一些方法在实际识别数字之前使用简单的整形方法。以下是网络上的一些示例:

OpenALPR示例。汽车类型s abonus

OpenALPR是一个非常强大的工具,没有涉及深度学习,可以识别来自不同国家的车牌

该代码仓库提供了CRNN模型的实现(将进一步讨论)以识别韩国车牌。

Supervise.ly,一家数据公用事业公司,撰写了关于使用其工具生成的人工数据训练车牌识别器的文章(人工数据也将进一步讨论)

 

 CAPTCHA

由于互联网上充满了机器人,通常的做法是将它们与真人分开,这是视觉任务,特别是文本阅读,即CAPTCHA。许多这些文本是随机的和扭曲的,这会使得计算机很难阅读。我不确定开发CAPTCHA的人是否预测了计算机视觉的进步,但是今天的大多数文本CAPTCHAs并不是很难解决,特别是如果我们不是一次同时解决所有这些问题。

Adam Geitgey提供了一个很好的教程来解决一些深度学习的CAPTCHA,其中包括再次合成人工数据。

 

PDF OCR

OCR最常见的场景是打印OCR或pdf OCR。打印文档的结构化特性使得解析它们变得更加容易。大多数OCR工具(例如Tesseract)主要用于解决此任务,并取得了良好的效果。因此,我不会在这篇文章中详细阐述这项任务。

 

OCR in the wild

这是最具挑战性的OCR任务,因为它将所有一般计算机视觉挑战(例如噪声,照明和人工)引入OCR。此任务的一些相关数据集是coco-text和SVT数据集,它们再次从街景图像中提取文本。


合成文本

SynthText不是数据集,也许甚至不是一项任务,但提高训练效率的一个好主意是生成人工数据。由于文本的平坦性,在图像上添加随机字符或单词看起来比任何其他对象更自然。

我们之前已经看到一些数据生成用于更容易的任务,如CAPTCHA和车牌。在野外生成文本有点复杂。该任务包括考虑图像的深度信息。幸运的是,SynthText是一个很好的工作,它接收带有上述注释的图像,并智能地生成单词(来自新闻组数据集)。


SynthText流程图:右上角是图像的分割,右下角是深度数据。左下角是图像的表面分析,根据文本将其分散在图像上。

为了使添加的文本看起来真实有用,SynthText库为每个图像采用两个掩模,一个是深度,另一个是分割。如果您想使用自己的图像,也应添加此数据。

建议您检查这个代码仓库并自行生成一些图像。您应该注意repo使用一些过时版本的opencvmaptlotlib,因此可能需要进行一些修改。


Mnist

虽然不是真正的OCR任务,但是不可能写出OCR后不包括Mnist示例。最著名的计算机视觉挑战并不会真正考虑OCR任务,因为它一次只包含一个字符(数字),而且只包含10位数字。但是,它可能暗示为什么OCR被认为是容易的。另外,在某些方法中,每个字母将被单独检测,然后Mnist(分类)模型变得相关。


策略

正如我们所看到和暗示的那样,文本识别主要是两步任务。首先,您希望检测图像中的文本外观,可能是密集的(如打印文档中)或稀疏(如野外文本)。

在检测到行/字级别之后,我们可以从大量解决方案中再次选择,这些解决方案通常来自三种主要方法:

传统计算机视觉技术。

专业的深度学习。

标准深度学习方法(检测)。

 

让我们来具体看看每一个:

1. 传统计算机视觉技术

如前所述,计算机视觉很长一段时间内解决了各种文本识别问题。你可以在网上找到很多例子:

伟大的阿德里安·罗斯布鲁克在他的网站上有大量的教程,比如这个,这个和更多。

Stack overflow还有一些这种类型的

经典CV方法通常声称:

应用滤波器以使字符从背景中脱颖而出。

应用轮廓检测逐个识别字符。

应用图像分类来识别字符。

 

显然,如果第二部分做得好,第三部分很容易使用模式匹配或机器学习(例如Mnist)。

然而,轮廓检测对于通用性非常具有挑战性。它需要大量的手动微调,因此在大多数问题中变得不可行。

我已经找到了困难的方法,当你开始调整这些参数时,你可以减少这些错误,但不幸的是会导致其他错误。换句话说,如果你的任务不简单,那么这些方法就不适用。

 

2. 专业的深度学习

大多数成功的深度学习方法都具有普遍性。但是,考虑到上述属性,专用网络非常有用。

我将在这里研究一些突出方法的无穷无尽的样本,并将对提供它们的文章做一个非常快速的总结。与往常一样,每篇文章都以“任务X(文本识别)最近引起关注”开始,并继续详细描述他们的方法。仔细阅读这些文章将揭示这些方法是从以前的深度学习/文本识别工作中组合而成的。

结果也被全面描述,但由于设计上的许多差异(包括数据集中的微小差异),实际比较是不可能的。实际了解这些方法在您的任务中的表现的唯一方法是获取他们的代码(最好的情况是:找到官方repo,找到非官方但评价很高的repo,自己实施)并尝试使用您的数据。

因此,我们总是更喜欢带有较好文章的repo,如果可能的话甚至有demo。

 

EAST

EAST(高效准确的场景文本检测器)是一种简单而强大的文本检测方法。使用特殊的网络。

与我们将要讨论的其他方法不同,它仅限于文本检测(不是实际识别),但它的稳健性值得一提。另一个优点是它也被添加到open-CV库(从版本4开始),因此您可以轻松使用它(请参阅此处的教程)。

该网络实际上是众所周知的U-Net的一个版本,它有助于检测大小不同的特征。该网络的底层前馈主干(如文章中所示,见下图)可能不同,文中使用PVANet,但opencv实现使用Resnet。显然,它也可以预先训练(例如用imagenet)。与在U-Net中一样,特征是从网络中的不同级别提取的。


最后,网络允许两种类型的输出旋转边界框:带有旋转角度(2X2 + 1个参数)的标准边界框或“四边形”,它只是一个带有所有顶点坐标的旋转边界框。

CRNN

卷积递归神经网络是2015年的一篇文章,该文章提出了一种混合(或三重混合?)端到端架构,旨在通过三步法捕捉文字。

这个想法如下:第一级是标准的完全卷积网络。网络的最后一层被定义为要特征层,并分为“特征列”。

然后,将特征列馈送到输出序列的深双向LSTM,用于查找字符之间的关系。

最后,第三部分是转录层。它的目标是采用凌乱的字符序列,其中一些字符是多余的而其他字符是空白的,并使用概率方法来统一并理解它。

这种方法称为CTC损失,可在此处阅读。该层可以与具有或不具有预定义词典一起使用,这可以促进单词的预测。

本文使用固定文本词典达到很高的准确率(> 95%),并且在没有固定文本词典的情况下成功率不同。

 

STN-net/SEE

SEE  - 半监督端到端场景文本识别,是Christian Bartzi的作品。他和他的同事应用真正的端到端策略来检测和识别文本。他们使用非常弱的监督(他们称之为半监督,与通常的意思不同)。因为他们只使用文本注释训练网络(没有边界框)。这允许他们使用更多数据,但是使他们的训练过程非常具有挑战性,并且他们讨论了使其工作的不同技巧,例如不训练具有两行以上文本的图像(至少在训练的第一阶段)。

该论文的早期版本称为STN OCR。在最后的论文中,研究人员对他们的方法和表现进行了改进,并且他们在高质量的结果的基础上更加强调他们的方法的通用性。


STN-OCR提示使用空间变换器(= STN,与最近的谷歌变压器无关)的策略。

他们训练两个级联网络,其中第一个网络,即变换器,学习图像上的变换,以输出更容易解释的子图像。

然后,另一个顶部有LSTM的前馈网络(嗯......似乎我们之前已经看过它)来识别文本。

研究强调了使用resnet(它们使用两次)的重要性,因为它为早期层提供了“强大”的传播。但是现在这种做法很受欢迎。

无论哪种方式,这都是一种有趣的尝试方法。

 

3.标准的深度学习方法

如标题所示,在检测到“单词”之后,我们可以应用标准的深度学习检测方法,例如SSD,YOLO和Mask RCNN。由于网上有大量信息,我不打算详细说明这些方法。

我必须说这是目前我最喜欢的方法,因为我喜欢深度学习的是“端到端”的哲学,你应用一个强大的模型,通过一些调整将解决几乎所有问题。在本文的下一部分中,我们将看到它实际上是如何工作的。

然而,SSD和其他检测模型在涉及密集的类似类时受到挑战,如此处所述。事实上,深度学习模型识别数字和字母比识别更具挑战性和精心设计的物体(如狗,猫或人类)要困难得多。它们达不到所需的准确度,因此,专业方法茁壮成长。

 

本文转载自网络

Copyright datatang.com 数据堂(北京)科技股份有限公司 京ICP备11010828号 京公网安备 11010802026079号法律声明与隐私权政策

语音合成(TTS)_数据堂