• 【华为云技术分享】传统OCR识别综述


    1      引言

    1.1      什么是OCR

    计算机文字识别,俗称光学字符识别,英文全称是Optical Charater Recognition(简称OCR),它是利用光学技术和计算机技术把印刷在或者写在图纸上的文字以文本形式提取出来,并转换成一种计算机能够接受、人又可以理解的格式。OCR技术是实现文字快速录入的一项关键技术。在信息社会时代,每天会产生大量的票据、表单、证件数据,这些数据要电子化,需要利用OCR技术进行提取录入。在深度学习没有全面推广之前,大部分OCR识别都是基于传统的方法进行检测识别。在背景单一、数据场景简单的情况下,传统OCR一般都能达到好的效果,但在一些场景复杂、干扰多的情况下,识别效果不好,这个时候深度学习OCR就能体现出巨大的优势。

    1.2      传统OCR与深度学习OCR

    传统OCR基于图像处理(二值化、连通域分析、投影分析等)和统计机器学习(Adaboot、SVM),提取图片上的文本内容;用到的计算机视觉算法库主要有OpenCV、Halcon、VisionPro等,出于开源、多语言支持和方便易用的考虑,我们通常采用OpenCV进行开发。

    深度学习OCR是利用模型算法能力,替换传统的手动方法,自动检测出文本的类别及位置信息,根据相应位置文本信息自动识别文本内容,一般用到的模型算法:

    检测算法:FasterRCNN、CTPN、FCN等

    识别算法:CRNN、CRNN+CTC、seq2seq-attention等

    2      传统OCR识别流程

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

    1.png

    按处理方式划分为三个阶段:预处理阶段、识别阶段和后处理阶段。首先文本定位,接着进行倾斜文本矫正,分割出单字后,使用人工特征HOG或者CNN特征,结合分类模型对单字进行识别,最后基于统计语言模型(如隐马尔科夫链,HMM)或者规则进行语义纠错。其中关键在于预处理阶段,预处理阶段的质量直接决定了最终的识别效果。

    3      传统矫正算法

    在将图片输入检测之前会首先去对原图进行一次图片矫正操作,确保图片文字是水平方向,提高文本检测的准确性。图像矫正的方法一般有两种:水平矫正,透视矫正,如果原始图像没有太大透视变形的情况,只是图像发生了角度旋转,则推荐使用水平矫正方法;如果图像存在透视变形,则推荐使用透视矫正方法。

    3.1      水平矫正

    进行识别的图像大部分是卡证、票据、表单类数据,这类数据有些是有明显的轮廓边缘,有些没有明显的轮廓边缘,比如:文档型的图像,背景都是白色的,针对这种图像的话可以根据文本的边缘轮廓信息进行霍夫曼直线检测,然后进行角度检测旋转。有些具有明显的边界轮廓矩形的卡证类,可以先检测出最大轮廓然后根据轮廓角度直接旋转即可。

    3.1.1        霍夫曼直线矫正

    图片灰度化转为单通道图后,先使用Canny算子进行边缘检测,让图形的边缘信息凸显出来;再使用霍夫曼变换检测所有可能的直线;然后统计所有直线与水平方向角度并计算平均值;最后根据平均角度对原图以中心点为旋转点进行旋转矫正。

    1.png
     

    矫正效果如下:

    1.png

    3.1.2        轮廓矫正

    首先将图片灰度化去除噪声,进行自适应二值化,然后用形态学闭操作将断开的连成块,最后通过轮廓查找角度,关键操作包含以下两个方面:

    1、  找到最大面积的最小外接矩形,返回最小外接矩形的角度

    2、  找到所有轮廓的最小外接矩形,返回所有外接矩形的平均角度

    具体流程如下:

    1.png

     最大轮廓矫正:

    1.png1.png

    3.2      透视矫正

    3.2.1        背景

    现在移动设备越来越普及情况下,印刷类型图片占比呈下降趋势,主流图片获取都是通过移动设备获得,但是通过移动设备获取录入图片质量,很容易受到当时的光线、角度等影响。有些图片可能存在一定的扭曲变形,直接对这些图片进行文本检测,检测出来的文本会存在一定的漏框少框。为了减少文本漏框少框现象,需在对图片进行文本检测前,先对图片进行透视变换矫正图片。

    3.2.2        矫正原理

    首先进行图片灰度化,去除噪声,稍微膨胀操作,使得轮廓信息更突出,同时使断裂的轮廓连接起来,再使用边缘检测算法检测边缘信息;基于边缘轮廓信息,查找最大面积的边缘轮廓,因为一般最大边缘轮廓就是我们感兴趣区域;得到最大轮廓边缘后,使用拟合四边形的方法,找到分散在感兴趣区域的角点位置,然后根据左上,右下角点位置关系,找到角点的顺序,最后根据角点与目标点的透视映射关系,进行透视变换矫正,得到结果。

    1.png

    矫正结果如下:

    1.png

    4      传统文本检测算法

    4.1      连通域检测文本

    传统图形学方法提取文本位置,一般可以分为两个部分,第一个是连通域的提取,第二个是文字连通域的判别。其中,将图像二值化后,通过连通域提取环节会将所有的连通域找出来作为候选集,然后根据启发式规则算法判断提取的连通域是否是文字连通域。流程如图所示:

     1.png

    当然在文本检测前会有一系列的预处理操作:二值化、版式分析、表格背景和文字区域形态学分离等,预处理后的结果如下图所示:

    1.png

    根据预处理后的文本块,进行轮廓检测,然后使用轮廓的最大外接矩形作为文本块的文本检测区域。

    4.2      MSER检测文本

    MSER的处理过程:对一幅灰度图像取不同的阈值进行二值化处理,阈值从0至255递增,这个递增的过程就好比是一片土地上的水面不断上升,随着水位的不断上升,一些较低的区域就会逐渐被淹没,从天空鸟瞰,大地变为陆地、水域两部分,并且水域部分在不断扩大。在这个“漫水”的过程中,图像中的某些连通区域变化很小,甚至没有变化,则该区域就被称为最大稳定极值区域。在一幅有文字的图像上,文字区域由于颜色(灰度值)是一致的,因此在水平面(阈值)持续增长的过程中,一开始不会被“淹没”,直到阈值增加到文字本身的灰度值时才会被“淹没”。该算法可以用来粗略地定位出图像中的文字区域位置。

    大致流程如下:

    1.png

    5        传统字符切割算法

    在深度学习序列化模型还未兴起的时候,传统文本识别还不能直接对文本行直接进行文字识别,因为词与词的组合、词组与词组的组合无法枚举穷尽,对这些词组直接分类基本不可能。相对于词语、词组,字符的个数可以穷尽,如果把文本识别当做单个字符的识别组合,那么任务就简单很多,因此传统的文本识别都是基于单字符的识别。传统字符分割的流程大致如下图所示:

     1.png1.png

    上述文本检测算法,首先检测出文本行,然后利用连通域、垂直投影或者其他算法,对文本行中的单个字符进行字符分割。

    5.1      连通域轮廓切割

    每个文本行切片的局部图中,单个字符都是一个个独立的对象存在,如果能找到单个独立对象的轮廓信息,那么他的最小外接矩形也能通过一些opencv的函数获取得到;基于连通域的大致流程原理如下:

    1.png

    首先将文本切片二值化,使用opencv的findContours找到可能的单字符轮廓,然后根据经验规则过滤掉一些噪声,最后对轮廓的外接矩形使用NMS过滤些重复框,得到最终的单字符检测框。

    处理流程如下:

    1)二值化:

    1.png

    2)过滤噪声点:

    1.png

    3)NMS过滤:

    1.png

    5.2      垂直投影切割

    文本行的局部图像中,除了文字像素外就是背景像素,单个字符文字区域内的像素在每列的分布和周围的像素分布有差异,字符与字符之间的空隙像素一般比较少,而在文字内像素分布比较多。基于这样的规律,我们将文本行切片二值化变成黑底白字,统计每列中白色像素的个数,得到每列的白色像素的分布,然后根据规律找到黑白像素在列的范围尺度下的分割间隔点,最后根据分割间隔点对文本行进行单字符分割,得到最终结果,此过程处理字符分割的技术称之为垂直投影法字符分割,流程如下图所示:

    1.png

    处理流程如下:

    •  统计每列白色像素个数和画出垂直投影分布

                    1.png

    • 字符分割间隔点修补过滤字符分割过程中存在字符粘连或者字符断裂情况,这样情况的发生是因为,粘连的部分白色像素个数明显高于其他分割点,被当成一个字符处理了。为了能正确分割出字符粘连情况,需要借助额外信息,比如平均字符宽度之类的信息,去裁剪分割点。字符断裂情况是由于有些中文字符具有偏旁部首或者去噪声、腐蚀的太厉害造成有些字符被弄成了两个或者多个;为了能正确分割字符,可以借助平均宽度处理。

    1)      字符粘连

    1.png

    2)      字符断裂

    1.png

    6      传统文本识别算法

    在传统OCR文字识别领域,是将文本行的字符识别看成一个多标签任务学习的过程,也就是多分类问题。中文领域字符识别类别大概有5800,包括常见汉字、标点符号、特殊字符等。英文领域字符识别类别大概有100多种,包括大小写英文、标点符号、特殊字符等。字符分类一般分为:印刷体字符分类和手写体字符分类。印刷体字符分类在特定场景已经可以达到很高的精度,然而在复杂场景中精度仍然比较低,通过数据增强(膨胀、腐蚀等操作)只能解决部分难题。手写体识别在OCR领域一直是技术难题,不仅仅是在传统OCR文字识别领域,深度学习也很难解决,因为每个人的手写字符风格不一,很难统一标准。

    6.1      识别原理

    在字符分类之前,我们首先将字符切片归一化成统一尺寸,参考经典手写字符分类尺寸大小28x28,统一尺寸后根据图像的常见算法去提取特征,比如hog、sift等;最后分类器选择支持向量机、逻辑回归、决策树等,模型训练完成可以集成端到端进行预测识别。大致流程如下:

    1.png

    6.2      识别流程

    使用HOG特征+SVM分类算法去识别单字符,该算法组合已经在经典的手写字符分类中得到了很好的验证。字符之间的差异主要是形状上的差异,而HOG能在光照不变性情况下,将图片的局部形状特征提取出来,同时SVM算法在小样本高维度情况下,具有一定优势,具体流程如下:

    1.png

    7      总结

    传统OCR发展至今,已经解决了大部分简单场景,并且取得很好效果,但是在一些复杂场景,传统OCR面临了巨大的挑战,精度很难满足实际应用需求。虽然基于深度学习的OCR表现相较于传统方法更为出色,但是深度学习技术仍需要在OCR领域进行特化,而其中的关键正是传统OCR方法的精髓。因此我们仍需要从传统方法中汲取经验,使其与深度学习有机结合进一步提升OCR的性能表现。另一方面,作为深度学习的推动力,数据起到了至关重要的作用,因此收集广泛而优质的数据也是现阶段OCR性能的重要举措之一。

    作者:AI-Sky

  • 相关阅读:
    SQL 基础
    MySQL 关于 only_full_group_by 限制
    sarama Kafka客户端生产者与消费者梳理
    Golang context
    常见的限流算法
    Tensorflow2 深度学习十必知
    数据结构与算法稀疏数组详解
    常用数据结构之数组
    技术人创业:失败不是成功,但反思是
    12款大家都在用的产品管理平台
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165052.html
Copyright © 2020-2023  润新知