深度实践OCR:基于深度学习的文字识别
上QQ阅读APP看书,第一时间看更新

1.1 人工智能大潮中的OCR发展史

在上古时代,人们就有一个梦想——创造能像我们人类一样,具有独立思考和推理能力的智能体。例如,古籍《列子》记载,偃师为周穆王造仿的真人,能歌善舞,且能够执行人类发出的指令。《荷马史诗》也描述过赫菲斯托斯在山上,与仆人熔化链条制作兵器和各种机械人的故事。

直到20世纪50年代,一群怀揣梦想的科学家在美国的达特茅斯学院才正式提出人工智能(Artificial Intelligence)概念,从此开启了人工智能的新纪元。此后,无数科学家投入人工智能领域。随后的几十年里,人工智能三起三落,技术不断推陈出新。其发展脉络如图1-1所示。

图1-1 人工智能发展脉络

与此同时,作为人工智能领域一个非常小的技术,OCR也随着人工智能的发展起起落落。

光学字符识别(OCR)这一概念,最早由德国科学家Tausheck在1929年提出[1]。几年后,美国科学家Handel也提出了文字识别的想法,当然直到计算机的出现,这一想法才得以慢慢实现。汉字识别最早是由IBM公司的工程师Casey与Nagy实现的,他们在1966年发表了首篇汉字识别相关的文章,采用的是模板匹配的方式,可以识别1000个印刷体汉字。之后,OCR技术得到大量研究,经过近60年的发展,并且随着相关技术以及算力的提升,现在已经广泛应用在各个领域。

相较于印刷体西班牙语的识别,印刷体汉字的识别要更难(中文汉字类别多,字体风格也多变)。最早可以追溯的汉字识别,是IBM的基于模板匹配的方法。20世纪70年代,日本东芝综合研究所研制出可以识别2000个单体印刷汉字的识别系统,代表了当时汉字识别的最高水准。与此同时,三洋、松下、富士通等公司也各自在研制印刷体的识别系统。这些系统大多使用基于K-L数字变换的匹配方案,需要大量的专业硬件设备,体积庞大,造价昂贵,所以使用相对有限。

到了20世纪90年代,LeNet5网络的出现开创了深度学习的新纪元,并且在OCR的应用中达到了商用的水平,之后由于种种原因,沉寂了10年。直到2012年,AlexNet网络的出现使得视觉相关的技术进入爆发期,加之此后识别网络和物体检测框架的革新也间接地促进了OCR技术的发展。文字检测领域借鉴了物体检测的经典网络Faster RCNN[3]系列、Yolo[4]系列,发展出一系列文字专用检测技术,如CTPN[5]、TextBox[7]系列、DenseBox等。文字识别领域借鉴了识别网络和序列化网络,演变出以CNN+RNN+CTC以及CNN+RNN+Attention为主流的识别方式。此后,人们逐渐摒弃了传统的字符切割识别方式。

与发达国家相比,我国的OCR技术研究起步较晚,直到20世纪70年代才开始,所以一直处于后继追赶的状态。但是,随着深度学习逐渐变成研究热点,我国迅速走在世界前列。这主要是由于国内出现了一大批富有实干精神的青年研究学者,代表有华中科技大学白翔教授组、华南理工大学金连文教授组、中国科学院深圳先进技术研究院的乔宇教授组、中科院自动化所刘成林教授组、清华大学丁晓青教授组、北京大学高良才教授组、北京科技大学殷绪成教授组,以及澳洲阿德莱德大学的沈春华教授组等。同时,在工业界,大量公司走在世界前列,例如阿里巴巴、腾讯、百度、商汤、旷视、华为、云从、依图、海康威视、科大讯飞等。当然,发达国家也有很多相关的研究机构,例如牛津大学VGG视觉组,以及Google、Facebook、Adobe等公司。

除了上述因素,OCR相关的会议也促进了OCR技术的发展。比较著名的会议有:ICDAR(文档分析与识别国际会议)、DAS(文档分析系统国际研讨会)、DPR(文档识别与检索国际会议)、ICPR(模式识别国际会议)、ICFHR(手写识别国际前沿会议)等。除了相关性比较高的、通用类别的视觉三大会议——CVPR(国际计算机视觉与模式识别会议)、ECCV(欧洲计算机视觉国际会议)、ICCV(国际计算机视觉大会),相关的人工智能会议如AAAI(人工智能促进协会)等都经常发表一些高质量的OCR领域的论文。

根据OCR技术的发展过程,本书将OCR技术大概划分为两个发展阶段:传统OCR技术方法和基于深度学习的OCR技术方法。除了OCR以外,通常还有另外两个相关的专有名词——DAR和STR。其中,DAR(Document Analysis and Recognition,文档图像分析和识别)是文档图像处理领域的一个更宽泛的概念;STR(Scene Text Recognition,场景文字识别)主要针对自然场景中文字的检测与识别,是OCR的一个重要分支。过去,OCR的定义为将印刷体中的字符从纸质文档中识别出来。随着技术的发展,OCR的内涵已经发生了变化,不再局限于识别印刷体中的文字。可见,随着技术的发展,OCR的内涵在不断拓宽。

1.1.1 传统OCR方法一般流程

文字识别从本质上可以归类为序列化标注问题,主要目标是寻找文本串图像到文本串内容的映射,这一点与自然语言处理中的一些任务非常类似。当然,与自然语言处理相比,文字识别又有不小的区别,因为其具有一些独特性。首先是局部特性,文本串中的局部会直接体现在整个识别目标当中;其次是组合特性,文本串的内容组合千变万化,例如,常用的英文单词有几万个,而汉字的组合就更多了,因为汉字的组成单元常用的有6000多个,加上繁体字和生僻字足有10000个,组合出来的情况千变万化。基于上面的考量,一种直接的方法是先将其切分成单字,然后识别单字的类别,之后将结果串起来。这种切分到基本单元的方法在深度学习之前的几十年是通用方法,其流程如图1-2所示。

图1-2 垂直投影分割法

当然,在实际操作中,还会增加一些预处理。一般分解流程如图1-3所示。

图1-3 传统OCR识别流程

1)图像输入:对于不同的图像来说,因为有着不同的格式和压缩方式,所以需要使用不同的方法进行解码。

2)图像预处理:主要包括二值化、去噪声、倾斜较正等,具体操作说明如下。

❑ 二值化:摄像头采集到的图像,一般都是彩色图像。彩色图像所含信息量巨大,常含有很多与文字无关的信息,所以对于图像的内容,需要进行简单的前景与背景分离,即先对彩色图像进行处理,使图像只包含前景信息与背景信息。简单地将前景信息定义为黑色,背景信息定义为白色,这就是二值化图。

❑ 去噪:对于不同场景下的文字,我们对噪声的定义也是不同的,需要根据噪声的特征进行去噪。

❑ 倾斜较正:很多情况下,获得的文字都是比较随意的,不可避免地会产生倾斜,这就需要在识别之前先对相关的内容进行校正。

3)版面分析:对文档图片分段落、分行的过程,称为版面分析。由于实际文档的多样性、复杂性,目前还没有一个固定、统一的切割模型。

4)字符切割:因为需要对每个字做识别,所以需要将版式的文字切割成一个个单字,以用于后续识别器的识别。

5)字符识别:该研究在比较早的时期就有模板匹配,后来以特征提取为主。文字的位移,笔画的粗细、断笔、粘连、旋转等因素极大地增加了特征提取的难度。

6)版面恢复:人们希望识别后的文字,仍然像原文档图片那样排列着,段落、位置和顺序都不变地输出到Word文档和PDF文档等。

7)后处理:根据语言模型,对识别的结果进行语义校正。

除了上面比较基础的流程外,传统的OCR方法也在随着图像处理和模式识别的发展,演变出很多方法。例如,基于传统的手工设计特征(Handcraft Features),包括基于连通域的方式、投影分析,以及基于HOG的检测框描述。例如,MSER[2,9-10][9-10](Maximally Stable Extremal Regions)方法是首先得到字符候选集,并且将文字候选区域看作连通图的顶点,然后将文本行的寻找过程视为Clustering过程(因为来自相通文本行的文本通常具有相似性),之后的识别则是基于统计机器学习方法(Adaboost、SVM等),如图1-4所示。

图1-4 MSER流程

1.1.2 基于深度学习OCR方法一般流程

相较而言,以往OCR的概念更多的是限定为针对文档的识别,之后OCR的概念被逐步拓宽为通用的文字图像识别,主要是自然场景文字图像识别。自然场景图像的信息更加丰富,鉴于其极大的多样性和复杂性,自然场景图像中文字检测和识别的难度大于扫描图像中的文字。比如说,文字可能来自不同的语言,在每一种语言下,可能还包含多种字母。每种字母又可以有不同的大小、字体、颜色、亮度、对比度等。同时,文字的排列和对齐方式也不尽相同,横向、竖向、弯曲的情况都有可能。图像的非文字区域可能有与文字区域相似的纹理,比如窗户、树叶、栅栏、砖墙等。因为拍摄角度的问题,图像文字还存在形变问题(透视变换、仿射变换等)。此外,光照、低对比度、模糊断裂、残缺文字等也提升了文本检测和识别的难度。

上面提到的传统的OCR处理方法,使用了大量的图像处理的相关知识,而且基本上是合乎人类视觉处理逻辑的。首先是数据的预处理,然后是数据的特征提取、特征降维等,之后送入一些典型的分类器(例如SVM、Softmax等)进行分类,最后通过后处理进行数据结构化。这样处理似乎是合理的,其实引入了很多问题。首先,整个处理流程的工序太多,而且是串行的,导致错误不断被传递放大,例如,每一步都是90%的正确率,正确率看似很高,但是经过五步的错误叠加之后为0.95=0.59049,结果就已经不及格。其次,整个过程涉及太多的人工设计,而人工设计并不一定能够抓住问题的本质。例如文字的二值化这一预处理,参与过实际调整二值化参数项目的人深有感触,这个阈值在一些情况下很难调整好,甚至在很多情况下还是自相矛盾的。因为本质上模型的复杂度较低且无法充分拟合数据分布,因此难免会出现“按下葫芦浮起瓢”的现象。实际处理过程中会过滤掉很多有用的信息。然后,在一些背景稍微复杂或者变体文字的情况下,传统方法基本会失效,模型的泛化性偏弱。版面分析(连通域方式)以及投影变换(行切分)的方式只能限定处理相对简单的场景,一旦场景变为自然场景(例如,街拍、复杂的广告、菜单等),基本上就会失效。最后,传统方法对单字的识别完全没有考虑到上下文的语义关联信息(局部和整体是相关的)。为了解决上述问题,传统方法进行了很多组合,例如,对识别的结果进行动态路径搜索,搜索最优的路径。路径寻优过程中,经常需要结合文字的外观特征以及语言模型进行处理,这里的前后处理存在非常多的耦合,导致实际系统中的识别模块往往需要堆砌非常多的算法。即使如此,传统方法也存在很多完全无法处理的问题,例如手写字体、验证码等存在非常多的粘连,根本无法进行切分。而深度学习的自适应学习驱动方式,能够很好地应对这些问题,因为要做的参数预处理的流程基本上少了很多,而且基本上做到了端到端的处理。

如图1-5所示,基于深度学习的OCR方法将一些繁杂的流程分成两个主要步骤,一个是文本检测(主要用于定位文本的位置),另一个是文本识别(主要用于识别文本的具体内容)。

图1-5 传统OCR方法向基于深度学习方法的OCR方法演进