OCR技术浅析

Python014

OCR技术浅析,第1张

姓名:吴兆阳  学号:14020199009

转自机器人学习研究会

嵌牛导读:OCR(Optical Character Recognition,光学字符识别)的概念早于1920年代便被提出,一直是模式识别领域中重要的研究方向。近年来,随着移动设备的快速更新迭代,以及移动互联网的快速发展,使得OCR有更为广泛的应用场景,从以往的扫描文件的字符识别,到现在应用到自然场景中图片文字的识别,如识别身份证、银行卡、门牌、票据及各类网络图片中的文字。

嵌牛鼻子:ORC技术

嵌牛提问:什么是ORC,如何使用?

嵌牛正文:

以深度学习兴起的时间为分割点,直至近五年之前,业界最为广泛使用的仍然是传统的OCR识别技术框架,而随着深度学习的崛起,基于这一技术的OCR识别框架以另外一种新的思路迅速突破了原有的技术瓶颈(如文字定位、二值化和文字分割等),并已在工业界得到广泛应用。

笔者针对业务中的身份证照片文字识别需求分别尝试了传统OCR识别框架及基于深度学习的OCR识别框架。下面就以身份证文字识别为例分别简要介绍两种识别框架。

传统OCR技术框架

如上图所示,传统OCR技术框架主要分为五个步骤:

首先文本定位,接着进行倾斜文本矫正,之后分割出单字后,并对单字识别,最后基于统计模型(如隐马尔科夫链,HMM)进行语义纠错。可按处理方式划分为三个阶段:预处理阶段、识别阶段和后处理阶段。其中关键在于预处理阶段,预处理阶段的质量直接决定了最终的识别效果,因此这里详细介绍下预处理阶段。

预处理阶段中包含了三步:

定位图片中的文字区域,而文字检测主要基于连通域分析的方法,主要思想是利用文字颜色、亮度、边缘信息进行聚类的方式来快速分离文字区域与非文字区域,较为流行的两个算法分别是:最大极值稳定区域(MSER)算法及笔画宽度变换(SWT)算法,而在自然场景中因受到光照强度、图片拍摄质量和类文字背景的干扰,使得检测结果中包含非常多的非文字区域,而目前从候选区域区分出真正文字区域主要两种方法,用规则判断或轻量级的神经网络模型进行区分;

文本区域图像矫正,主要基于旋转变换和仿射变换;

行列分割提取出单字,这一步利用文字在行列间存在间隙的特征,通过二值化并在投影后找出行列分割点,当在文字与背景的区分度较好时,效果很好,而拍摄的图片中光照、摄像质量的影响,并且文字背景难以区分时,常造成错误分割的情况。

下面介绍基于传统OCR框架处理身份证文字识别:

身份证识别技术流程与上述框架稍微有所差异。对该问题,已知先验信息:a.证件长宽固定;b.字体及大小一致;c.文本相对于证件位置固定;d.存在固定文字。因此,处理该问题的思路为:先定位目标物体(证件),矫正后提取文字进行识别,最后进行语义纠错,如下图:

目标物体定位并矫正。基于现有的先验信息,定位最后的方法为采用模板关键点特征匹配的方法,并利用模板上特征点及目标图像特征点坐标之间的关系进行透视变换,以定位目标物体,如下图所示。接着,基于四角的坐标,进行旋转、仿射、尺寸的变换,并提取出目标物体的俯视图。

因文字位置相对固定,接着便分割出文字区域,二值化后,行列分割出单个字符。这里的技术难点在于二值化,二值化效果的好坏直接影响字符分割,并最终影响识别结果。受光照和拍摄质量的影响,全局二值化难以设置统一的阈值,而自适应二值化算法易受到阴影及模糊边界的干扰。所以在这边尝试过许多方法,测试下来未发现在任何情形下效果都满足要求的方法。

分割出单字后接着用分类器进行识别,并在这步基于统计上的先验信息定义了一个简单的优化函数,可看做1-gram语言模型。先验信息为:2400(总共660273)汉字的使用频率之和为99%以上。定义的优化函数为:

式中,Pi为该字出现的概率,confi为置信度值。

下图给出了示例:

因上述的优化过程中假定各状态相互独立并与上一状态没有联系,故不可避免存在语义上的错误。而如何基于现有的输出序列,对序列进行语义上的修正,那么最直观的想法就是用隐马尔可夫模型(Hidden Markov Model,HMM)解决这个问题,其基于观察序列,求出最优隐序列。其可以抽象为如下图的过程。在给定O序列情况下,通过维特比算法,找出最优序列S:

传统OCR冗长的处理流程以及大量人工规则的存在,使得每步的错误不断累积,而使得最终识别结果难以满足实际需求。接下来讨论基于深度学习的OCR。

基于深度学习的OCR识别框架

目前,从技术流程上来说,主要分为两步,首先是检测出图像中的文本行,接着进行序列识别。 可见,基于深度学习的OCR识别框架相比于传统OCR识别框架,减少了三个步骤,降低了因误差累积对最终识别结果的影响。

文本行检测,其又可分为水平行文字检测算法与倾斜文字行检测算法。这里主要介绍下Tian提出算法CTPN,其算法框架如下图。主要思路是将文本行识别看做一个序列识别问题,不同于一般的目标检测问题,引入RNN来利用上下文的信息。

具体流程为:

用VGG16的5个卷积层得到特征图(feature map,W*H*C);

在Conv5的feature map的每个位置上取3*3*C的窗口的特征,这些特征将用于预测该位置k个anchor(anchor的定义和Faster RCNN类似)对应的类别信息,位置信息;

将每一行的所有窗口对应的3*3*C的特征(W*3*3*C)输入到RNN(BLSTM)中,得到W*256的输出;

将RNN的W*256输入到512维的fc层;

fc层特征输入到三个分类或者回归层中。第二个2k scores 表示的是k个anchor的类别信息(是字符或不是字符)。第一个2k vertical coordinate和第三个k side-refinement是用来回归k个anchor的位置信息。2k vertical coordinate表示的是bounding box的高度和中心的y轴坐标(可以决定上下边界),k个side-refinement表示的bounding box的水平平移量。这边注意,只用了3个参数表示回归的bounding box,因为这里默认了每个anchor的width是16,且不再变化(VGG16的conv5的stride是16)。回归出来的box如Fig.1中那些红色的细长矩形,它们的宽度是一定的;

用简单的文本线构造算法,把分类得到的文字的proposal(图Fig.1(b)中的细长的矩形)合并成文本线。

上图为给出基于CTPN的例子,框线部分是算法识别出的文字行,可见在图片光照不均、人工合成及文字背景对比不明显的情形下均有很好的效果。 相比于传统文字定位方法,具有更好的鲁棒性及明显的优势。

文字行识别。近两年比较受关注的主要有两种,一种是CNN+RNN+CTC的方法,另外一种是用attention model+CNN+RNN的方法。这里主要介绍下CNN+RNN+CTC,算法框架由图给出。分为三层,CNN层、RNN层及解码(transcription)层。在CNN层,用于提取图像特征,利用Map-to-Sequence表示成特征向量;在RNN层,用双向LSTM识别特征向量,得到每列特征的概率分布;在解码层,利用CTC和前向后向算法求解最优的label序列。因此,该方法能够识别不定长的文字行。

两个例子:

Out:辽宁省长海县广鹿乡沙尖

Out:河南省邓州市九龙乡姚营

随着人工智能的热度上升,图像识别这一分领域也渐渐被人们所关注。图像识别中最贴近我们生活的可能就是 OCR 技术了。可能很多同学还不知道什么是 OCR。我们先来看下 OCR 的定义:

今天就来简单分析下 OCR 技术的原理,不会涉及具体的算法讲解和推导,毕竟每一个算法都能占很长的篇幅,每一个算法都能重新开一篇来写。

从整体上来说,OCR一般分为两个大步骤:图像处理以及文字识别。

识别文字前,我们要对原始图片进行预处理,以便后续的特征提取和学习。这个过程通常包含:灰度化、二值化、降噪、倾斜矫正、文字切分等子步骤。每一个步骤都涉及了不同的算法。我们以下面这张原始图片为例,进行每个步骤的讲解。

灰度化(gray processing),在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。说通俗一点,就是将一张彩色图片变为黑白图片。

灰度化一般有分量法、最大值法、平均值法、加权平均法四种方法对彩色图像进行灰度化。

一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,最常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(binaryzation)。

二值化的黑白图片不包含灰色,只有纯白和纯黑两种颜色。

二值化里最重要的就是阈值的选取,一般分为固定阈值和自适应阈值。 比较常用的二值化方法则有:双峰法、P参数法、迭代法和OTSU法等。

现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,称为含噪图像或噪声图像。减少数字图像中噪声的过程称为图像降噪(Image Denoising)。

图像中噪声的来源有许多种,这些噪声来源于图像采集、传输、压缩等各个方面。噪声的种类也各不相同,比如椒盐噪声,高斯噪声等,针对不同的噪声有不同的处理算法。

在上一步得到的图像中可以看到很多零星的小黑点,这就是图像中的噪声,会极大干扰到我们程序对于图片的切割和识别,因此我们需要降噪处理。降噪在这个阶段非常重要,降噪算法的好坏对特征提取的影响很大。

图像降噪的方法一般有均值滤波器、自适应维纳滤波器、中值滤波器、形态学噪声滤除器、小波去噪等。

对于用户而言,拍照的时候不可能绝对的水平,所以,我们需要通过程序将图像做旋转处理,来找一个认为最可能水平的位置,这样切出来的图,才有可能是最好的一个效果。

倾斜矫正最常用的方法是霍夫变换,其原理是将图片进行膨胀处理,将断续的文字连成一条直线,便于直线检测。计算出直线的角度后就可以利用旋转算法,将倾斜图片矫正到水平位置。

对于一段多行文本来讲,文字切分包含了行切分与字符切分两个步骤, 倾斜矫正 是文字切分的前提。我们将 倾斜矫正 后的文字投影到 Y轴,并将所有值累加,这样就能得到一个在y轴上的直方图。

直方图的谷底就是背景,峰值则是前景(文字)所在的区域。于是我们就将每行文字的位置给识别出来了。

字符切分和行切分类似,只是这次我们要将每行文字投影到 X轴。

但要注意的是,同一行的两个字符往往挨的比较紧,有些时候会出现垂直方向上的重叠,投影的时候将他们认为是一个字符,从而造成切割的时候出错(多出现在英文字符);也有些时候同一个字符的左右结构在X轴的投影存在一个小间隙,切割的时候误把一个字符切分为两个字符(多出现在中文字符)。所以相较于行切分,字符切分更难。

对于这种情况,我们可以预先设定一个字符宽度的期望值,切出的字符如果投影超出期望值太大,则认为是两个字符;如果远远小于这个期望值,则忽略这个间隙,把间隙左右的“字符”合成一个字符来识别。

预处理完毕后,就到了文字识别的阶段。这个阶段会涉及一些人工智能方面的知识,比较抽象,没法用图片表达,我尽量讲得简单易懂一些。

特征是用来识别文字的关键信息,每个不同的文字都能通过特征来和其他文字进行区分。对于数字和英文字母来说,这个特征提取是比较容易的,总共就 10 + 26 x 2 = 52 个字符,而且都是小字符集。对于汉字来说,特征提取的难度就比较大了,因为首先汉字是大字符集;其次国标中光是最常用的第一级汉字就有3755个;最后汉字结构复杂,形近字多,特征维度就比较大。

在确定了使用何种特征后,还有可能要进行特征降维,这种情况下,如果特征的维数太高,分类器的效率会受到很大的影响,为了提高识别速率,往往就要进行降维,这个过程也很重要,既要降低特征维数,又得使得减少维数后的特征向量还保留了足够的信息量(以区分不同的文字)。

对一个文字图像,提取出特征,丢给分类器,分类器就对其进行分类,告诉你这个特征该识别成哪个文字。分类器的设计就是我们的任务。分类器的设计方法一般有:模板匹配法、判别函数法、神经网络分类法、基于规则推理法等,这里不展开叙述。在进行实际识别前,往往还要对分类器进行训练,这是一个监督学习的过程。成熟的分类器也有很多,有 SVM,CNN 等。

其实就是对于分类器的分类结果进行优化,这一般就要涉及自然语言理解的范畴了。

首先是形近字的处理:举个栗子,“分”和“兮”形近,但是如果遇到“分数”这个词语,就不应该识别为“兮数”,因为“分数”才是一个正常词语。这需要通过语言模型来进行纠正。

其次是对于文字排版的处理:比如一些书籍是分左右两栏的,同一行的左右两栏不属于同一句话,不存在任何语法上的联系。如果按照行切割,就会把左行的末尾和右行的开头连在一起,这是我们不希望看到的,这样的情况需要进行特殊处理。

OCR 的大致原理就是这样。整体上来看,OCR 的步骤繁多,涉及的算法复杂,针对每一个步骤,每一个算法都有许多单独的研究论文,本文无法进行深入探讨。如果从零开始做 OCR,这将是一个浩大的工程。笔者才疏学浅,对于模式识别、机器学习也属于入门阶段,如果有错漏的地方,还请各位斧正。

可以去下载相应的软件1、PDF文件的识别:1)文件可以直接识别的(以文本形式保存的PDF文件):安装acrobat5专业版,注意不是acrobatreader,直接另存为rtf文件(识别整个文件),或者选择工具栏上的文字选择按钮,然后选择文字区域,然后复制到word等中。2)文件不能直接识别的(以图片形式保存的PDF文件):安装office2003,并装上office工具MicrosoftOfficeDocumentImaging(完全安装此工具),然后在打印机里面会增加MicrosoftOfficeDocumentImageWriter打印机,然后将PDF文件打印到此打印机,选择打印形成的文件的保存位置,然后会自动形成一个MDI文件,并且自动用MicrosoftOfficeDocumentImage打开此文件,然后选择“工具”菜单下的“使用ocr识别文本”,识别完成后,在选择“工具”下的,“将文本发送到word”,最后将把整个PDF文件识别输出到word文件中。注意:MicrosoftOfficeDocumentImage可以非常准确的全文件识别转化中文、英文、表格,但是无法将图形输出到word,而是把文件中的所有图形单独形成一个个独立的图片文件,放在相同位置的一个相同名称的文件夹中,因此可用snagit软件将图形打开,然后复制到word中。(所有的识别软件都不能很好的处理图形的识别问题,MicrosoftOfficeDocumentImage的这种处理方法已经是非常好的解决这个问题了。)3)加密的Pdf文件:先下载解密软件,解密后在参看1),2)4)繁体pdf文件:用2)的方法识别到word后,用word中的“工具”--“语言”---“中文繁简转换”2、让JPG上的文字转换到WORD中在日常工作中,我们可能会遇到需要把扫描后的表格或文章再重新修改或排版,然而大家都知道,扫描后的文件格式是图片格式.一般情况下只有高档点的扫描仪可以直接选择扫描成PDF后者WORD格式.但是如果我们只有普通的扫描仪,而又要做到修改扫描后的文档,现在我就来教大家怎么在条件限制下,达到我们的目的.首先我们要准备好OFFICE2003,然后打开OFFCIE工具中的MicosoftOfficeDocumentScanning工具,设置完后,我们就可以在需要修改的图片上右击,选择打印,然后一直下一步,知道选择打印机时,选择MicosoftOfficeDocumentImageWriter,然后将图片打印到文件扩展名为mdi格式的图片格式.打开后选择菜单工具中的"将文本发送到WORD".就是这么简单方便3、caj文件的识别:1)局部文字识别:直接使用caj浏览器的ocr2)全文件识别:打印到MicrosoftOfficeDocumentImageWriter打印机,后面和上面的2)操作一样3)博硕论文全文下载:在线阅读博硕论文,待可以看到最后一页后,不要关闭caj浏览器,到caj安装目录下cache中找到一个较大的文件,拷贝到其他位置即可。然后使用2)全部转化为word。4、超星文件的识别:1)局部文字识别:直接使用超星浏览器的ocr2)全文件识别:打印到MicrosoftOfficeDocumentImageWriter打印机,后面和上面的2)操作一样,要注意的是,超星打印功能有点区别,因为超星是目录和全文分开的,所以打印时,需要分别把目录和正文识别到word中,在合并到一起。打印时要填入打印页码从1到最后一页,不要选择打印全部。此外在打印选项中,还要将页面比例设成真实大小,而不是整宽。注意:识别速度比其他格式要慢很多,请保持耐心,但是最后当你看到轻松的生成全本书的word版本时,你会欣喜若狂的,呵呵。我的试验结果是一本280页的书,识别需要几分钟的时间。3)超星相对比较麻烦一些,如果还有问题,可以先把超星打印成完整的pdf文件,然后在用1、的方法转成word5、其他情况下的识别:使用snagit软件将任何形式的文字可以变成图片,例如使用snagit将屏幕拷贝成图片,然后右键点击图片文件,用microsoftOfficeDocumentImage打开图形,其他和2)一样。注意:其他的各种识别软件请不要在用,因为要么只能识别中文,要么只能识别英文,要么不能识别整个文件,要么不能识别屏幕拷贝图像,要么识别误差很大,要么不能识别表格,要么需要注册,要么识别速度很慢,要么使用不便(和word结合不紧),这些软件包括:紫光ocr,万方pdfocr,尚书,汉王,ScanSoftPDFConverter,pdf2word,以及各种被推荐的软件等等,我都装过,现在都像垃圾一样删除了。只要安装了acrobat专业版,snagit,office2003,现在你可以完美的做任何事,最重要的是这几个软件很好得到。针对一些问题的补充:经过一些试验,发现microsoftOfficeDocumentImage存在一些不稳定的问题,例如在用caj打印到MicrosoftOfficeDocumentImageWriter打印机时,发现用caj5.5版本比较快,(caj5.5不能加升级补丁),而caj5.0有时出现假死机。另外页面显示大时,转化的识别率较高。如果页数多的文件,包括超星,如果有问题,可以分多次转化。再次补充:1、由于虚拟打印到MicrosoftOfficeDocumentImageWriter比较慢,并且形成的虚拟文件很大,1本200多页的书大约是60M,因此会严重影响机器的运行速度和C盘空间以及内存空间,建议配置好的机器一次转化不要超过200页,配置差的不要超过100页,同时打印时在右下角系统栏中会出现打印机图,你可以双击,看到打印任务的进度,以免以为死机了。另外转化完成后请删除c:\windows\temp目录下的虚拟打印文件,否则你的c盘很快会被用光。2、建议如果发生打印到MicrosoftOfficeDocumentImageWriter很慢或者假死的情况,可以先打印到snagit虚拟打印机,会自动生成tiff文件,速度比MicrosoftOfficeDocumentImageWriter快,然后在snagit中,选择打印机为MicrosoftOfficeDocumentImageWriter打印机,(相当于再打印到MicrosoftOfficeDocumentImageWriter打印机),然后选择snagit---outputs下的printer,然后选择snagit----file----finishoutput,即可生成msi文件,其他一样。