OCR技术与深度学习的关系与应用

  • 传统技术OCR,特指应用领域,比如:识别身份证,银行卡,驾照,车牌等。
  • 应用深度学习的OCR技术,可以使用在泛领域的文字、文档识别等。

一、简单介绍

OCR的英文全称是Optical Character Recognition,中文叫做光学字符识别;它是一种存在已久的计算机视觉任务,在某些特定领域它表现的非常好,根本不需要如今火热的深度学习的技术。

在2012年如日中天的深度学习之前,OCR有许多不同的实现,这可以追溯到1914年。可能会有人说,OCR技术的挑战已经都被解决了?答案是:NO!使用深度学习的神经网络来训练OCR的任务会更精准,应用领域更多。

通常来说,任何实践过计算机视觉或者机器学习的人都知道,不存在已经解决的任务,这种情况也不例外。相反,在一些特定的领域,OCR会产生一个很好的结果,所以某一些OCR的任务,还是非常具有挑战性的,所以使用深度学习来训练OCR的识别任务还是非常有挑战性的。

看完本篇文章你会知道:

1.你的车在北京,为什么收到来自上海的超速罚款?

2.为什么一些app上扫描银行卡号时,个别字母识别不出来?

3.深度学习比传统的OCR技术要好吗?

4.深度学习的识别文字原理和框架是什么?

5.如何直接使用OCR文本识别功能?我会尽量说的小白一点,方便不同专业的同学都能看懂^_^

二、OCR的种类

OCR的应用有多种领域,之前也提过。简单的说,就是在图片上提取文字,图片上的文字排版越标准,识别的就越精准,比如印刷的书的某一页,或者标准的打印文档;当然也能识别涂鸦,也就是在极不规范的原素材上识别。我们日常中常见的OCR应用领域有车辆牌照、自动识别验证码、街景标志等等。

每种OCR任务都有自己不同的难度,俗话说“in the wild”是最难的。

image.png

列举几个常用的OCR任务的属性:

  1. 文本密度: 印刷体、书写体的文字密度都很高;但是在一张街景的图片上,文字确实很稀疏的
  2. 文本的结构: 页面上的文本是结构化的,大多数情况下是按严格的行排列的,而野外的文本则可能以不同的旋转方式散布在各处。
  3. 字体: 打印字体比较容易,因为它们比嘈杂的手写字符更结构化。
  4. 字符类型: 文本可能以不同的语言出现,而彼此之间可能会有很大不同。此外,文字的结构可能与数字不同,例如门牌号码等。
  5. 伪影: 显然,室外图像比舒适的扫描仪要嘈杂得多。
  6. 位置: 某些任务包括裁剪/居中的文本,而在其他任务中,文本可能位于图像中的随机位置。

三、SVHN数据集

SVHN(街景房号数据集)是一个很好的起点。顾名思义,这是从Google街景视图中提取的房屋编号数据集。任务难度中等。数字有各种形状和书写样式,但是每个门牌号都位于图像的中间,因此不需要检测。图像的分辨率不是很高,它们的排列可能有些奇怪。

SVHN数据集 :

 ufldl.stanford.edu/housenumber…

image.png

四、车辆牌照

另一个共同的挑战是车牌识别,这在实践中不是很困难也没有用。与大多数OCR任务一样,此任务需要先检测车牌,然后识别其字符。由于车牌的形状相对恒定,因此某些方法在实际识别数字之前使用简单的整形方法。以下是网上的一些示例:

image.png

OpenALPR是一种非常强大的工具,无需进行深度学习即可识别来自不同国家的车牌。

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

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

OpenAIPR地址:

github.com/openalpr/op…

CRNN-Keras地址:

github.com/qjadud1994/…

五、CAPTCHA

由于互联网上到处都是机器人,视觉任务(特别是文本阅读,又称为验证码)是一种不同于真实人类的常见做法。这些文本中有许多是随机的和失真的,这将使计算机更难阅读。我不确定开发CAPTCHA的人能否预测计算机视觉的进步,但是当今大多数文本CAPTCHA都很难解决,尤其是如果我们不尝试一次解决所有问题。

image.png

Adam Geitgey提供了一个很好的教程,可以通过深度学习解决一些验证码,包括再次合成人工数据。

Tutorial :medium.com/@ageitgey/h…

六、PDF OCR

OCR最常见的情况是印刷体/pdf OCR。打印文档的结构化性质使解析它们变得更加容易。大多数OCR工具(例如Tesseract)主要用于解决此任务并取得良好的效果。因此,在这篇文章中,我不会对这个任务进行过多的阐述。

Tesseract是开源的且非常有名的OCR识别库,也是所有开源领域最好的一个OCR开源库:

github.com/tesseract-o…

七、在自然环境下的OCR

这是最具挑战性的OCR任务,因为它将所有常规的计算机视觉挑战(例如噪音,照明和伪影)引入了OCR中。此任务的一些相关数据集是coco文本,而SVT数据集再次使用街景图像从中提取文本。

image.png

八、Synth Text

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

前面我们已经看到了一些数据生成,例如CAPTCHA和车牌之类的更轻松的任务。在野外生成文本要复杂一些。任务包括考虑图像的深度信息。幸运的是,SynthText是一项不错的工作,它可以接收带有上述注释的图像,并且可以智能地撒入单词(来自新闻组数据集)。

image.png

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

为了使“散布”的文本看起来逼真实用,SynthText库为每个图像提供了两个蒙版,一个是深度蒙版,另一个是分段。如果您想使用自己的图像,也应该添加此数据。

建议检查仓库并自行生成一些图像。您应该注意,仓库使用了一些过时的opencv和maptlotlib版本,因此可能需要进行一些修改。

image.png

九、MNIST

尽管这并不是真正的OCR任务,但无法撰写有关OCR的文章,也不包括Mnist示例。 最著名的计算机视觉挑战并不是一项考虑周全的OCR任务,因为它一次只包含一个字符(数字),只有10个数字。但是,它可能暗示为什么OCR被认为是容易的。此外,在某些方法中,每个字母都将被单独检测,然后类似于Mnist(分类)模型

image.png

策略 Strategies

正如我们已经看到和暗示的那样,文本识别主要是一个两步任务。首先,您想检测图像中文本的外观,可能是密集的(如在打印文档中)还是稀疏的(如自然环境下的文本)。

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

  • 经典的计算机视觉技术。
  • 专门的深度学习。
  • 标准深度学习方法(检测)。

让我们检查一下每个方法:

1.经典的计算机视觉技术

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

  • 伟大的阿德里安·罗斯布鲁克(Adrian Rosebrook)在他的网站上有大量的教程,例如本教程,本教程以及更多。
  • StackOverflow也有一些类似的宝石,如链接:

www.pyimagesearch.com/2017/07/17/…

www.pyimagesearch.com/2017/07/24/…

www.pyimagesearch.com/category/op…

stackoverflow.com/questions/9…

经典CV方法通常声称:

  1. 应用滤镜以使字符从背景中脱颖而出。
  2. 应用轮廓检测以一一识别字符。
  3. 应用图像分类以识别字符

显然,如果第二部分做得很好,那么第三部分就很容易通过模式匹配或机器学习(例如Mnist)进行学习。

然而,轮廓检测对于一般化而言是非常具有挑战性的。它需要大量的手动微调,因此在大多数问题中变得不可行。例如,让我们从此处在SVHN数据集的某些图像上应用简单的计算机视觉脚本。最初尝试时,我们可能会取得很好的结果:

image.png

image.png

但是当字符彼此靠近时,事情开始破裂:

image.png

image.png

我发现很难解决的问题是,当您开始弄乱参数时,可以减少此类错误,但不幸的是会导致其他错误。换句话说,如果您的任务不简单,这些方法就不可行。

2.专门的深度学习方法

大多数成功的深度学习方法在通用性方面都非常出色。但是,考虑到上述属性,专用网络可能非常有用。

我将在这里检查一些主要方法的详尽示例,并对提供这些方法的文章做一个非常简要的总结。与往常一样,每篇文章的开头都带有“任务X(文本识别)最近引起关注”,并继续详细描述其方法。仔细阅读文章将揭示这些方法是从以前的深度学习/文本识别作品中组合而成的。

还对结果进行了详细描述,但是由于设计上的许多差异(包括数据集上的细微差异),实际比较是不可能的。真正了解这些方法在您的任务上的性能的唯一方法是获取它们的代码(最糟糕的是:找到正式的回购协议,找到非正式但评级很高的回购协议,由您自己实施)并在您的数据上进行尝试。

因此,我们将始终偏爱带有良好回购协议的文章,如果可能的话,甚至是演示。

十、EAST

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

与我们将要讨论的其他方法不同,它仅限于文本检测(而不是实际识别),但是其健壮性值得一提。

另一个优点是,它也已添加到open-CV库(从版本4开始)中,因此您可以轻松使用它(请参见此处的教程)。

www.pyimagesearch.com/2018/08/20/…

该网络实际上是众所周知的U-Net的一个版本,可用于检测大小可能有所不同的功能。该网络的基础前馈“词干”(如本文中所述,请参见下图)可能非常— PVANet用于本文中,但是opencv实现使用Resnet。显然,它也可以进行预训练(例如使用imagenet)。与在U-Net中一样,从网络的不同级别提取特征。

image.png

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

image.png

如果现实生活的结果如上图所示,则识别文本不会花费很多精力。但是,现实生活中的结果并不完美。

十一、CRNN
卷积递归神经网络是2015年的一篇文章,其中提出了一种混合(或三杂项)端到端架构,旨在通过三步方法捕获单词。

想法如下:第一层是标准的全卷积网络。网络的最后一层被定义为要素层,并分为“要素列”。在下图中看到,每个这样的功能列如何表示文本中的特定部分

image.png

之后,将特征列输入到深度双向LSTM中,该LSTM输出序列,并用于查找字符之间的关系。

image.png

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

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

使用固定文本词典,本文达到了较高的准确率(> 95%),而没有此词典,则成功率会有所不同。

十二、STN-net/SEE

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

本文有一个较早的版本,称为STN OCR。在最后的论文中,研究人员改进了他们的方法和演示文稿,此外,由于结果的高质量,他们更加强调了其方法的通用性。

image.png

名称STN-OCR暗示使用空间变换器的策略(= STN,与最近的Google变换器无关)。

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

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

这里的研究强调了使用resnet的重要性(它们使用了两次),因为它向早期层提供了“强大”的传播。但是,如今这种做法已经很普遍了。

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

十三、总结

我们可以应用标准的深度学习检测方法来检测单词,例如SSD,YOLO和Mask RCNN。这些模型,在快速的物体定位,人物扫描中有大量使用,具体使用方法,可以搜索百度或者谷歌,有很多在线教程可供使用。

深度学习我必须说这是当前我最喜欢的方法,因为这是一个“端到端”哲学,您可以在其中应用一个强大的模型,并进行一些参数调整可以解决几乎所有问题。

但是,对于密集型相似类,SSD和其他检测模型面临了一些挑战。因为事实上,深度学习模型发现识别数字和字母要比识别更具挑战性和复杂性的对象(例如狗,猫或人)困难得多,它们往往无法达到所需的精度。

免费在线体验OCR识别功能

ai.baidu.com/tech/ocr/ge…

文章来自一点资讯资讯产品研发团队

猜你喜欢

转载自juejin.im/post/7018813430719053838