您好,欢迎访问三七文档
光学字符识别系统摘要:本文设计了一系列的算法,完成了文字特征提取、文字定位等工作,并基于卷积神经网络(CNN)建立了字符识别模型,最后结合统计语言模型来提升效果,构建一个完整的OCR(光学字符识别)系统.在特征提取方面,抛弃了传统的“边缘检测+腐蚀膨胀”的方法,基于一些基本假设,通过灰度聚类、图层分解、去噪等步骤,得到了良好的文字特征,文字特征用于文字定位和模型中进行识别。在文字定位方面,通过邻近搜索的方法先整合特征碎片,得到了单行的文字特征,然后通过前后统计的方法将单行的文字切割为单个字符。在光学识别方面,基于CNN的深度学习模型建立单字识别模型,自行生成了140万的样本进行训练,最终得到了一个良好的单字识别模型,训练正确率为99.7%,测试正确率为92.1%,即便增大图片噪音到15%,也能有90%左右的正确率.最后,为了提升效果,结合了语言模型,通过微信的数十万文本计算常见汉字的转移概率矩阵,由Viterbi算法动态规划,得到最优的识别组合。经过测试,系统对印刷文字的识别有着不错的效果,可以作为电商、微信等平台的图片文字识别工具.关键字:CNN,特征提取,文字定位,单字识别1研究背景和假设关于光学字符识别(OpticalCharacterRecognition,OCR),是指将图像上的文字转化为计算机可编辑的文字内容,众多的研究人员对相关的技术研究已久,也有不少成熟的OCR技术和产品产生,比如汉王OCR、ABBYYFineReader、TesseractOCR等.值得一提的是,ABBYYFineReader不仅正确率高(包括对中文的识别),而且还能保留大部分的排版效果,是一个非常强大的OCR商业软件.然而,在诸多的OCR成品中,除了TesseractOCR外,其他的都是闭源的、甚至是商业的软件,我们既无法将它们嵌入到我们自己的程序中,也无法对其进行改进.开源的唯一选择是Google的TesseractOCR,但它的识别效果不算很好,而且中文识别正确率偏低,有待进一步改进.综上所述,不管是为了学术研究还是实际应用,都有必要对OCR技术进行探究和改进.将完整的OCR系统分为“特征提取”、“文字定位”、“光学识别”、“语言模型”四个方面,逐步进行解决,最终完成了一个可用的、完整的、用于印刷文字的OCR系统.该系统可以初步用于电商、微信等平台的图片文字识别,以判断上面信息的真伪.在本文中,假设图像的文字部分有以下的特征:1.假设要识别的图像字体都是比较规范的印刷字体,如宋体、黑体、楷体、行书等;2.文字与背景应该有比较明显的对比度;3.在设计模型的时候,假设了图片文本是横向排版的;4.文字的笔画应该有一定的宽度,不可以太细;5.同一个文字的色彩应该最多是渐变的;6.一般文字是通过比较密集的笔画成字的,并且很多时候都具有一定的连通性.可以看到,这些特征都是常见的电商宣传海报等的常见特点,因此这些假设都是比较合理的.2分析流程和实验平台实验流程图本文的实验在CentOS7+Python2.7的环境下完成.其中,图像处理部分用到了下列拓展库:Numpy、SciPy、Pandas、Pillow;卷积神经网络模型用到了下述拓展库:Keras、Theano.具体的实验配置后面会进一步谈到.3特征提取作为OCR系统的核心,特征提取是希望找出图像中候选的文字区域特征,以便进行文字定位和文字识别.模仿肉眼对图像与汉字的处理过程。传统的文本分割思路大多数是“边缘检测+腐蚀膨胀+联通区域检测”,如论文[1].然而,在复杂背景的图像下进行边缘检测会导致背景部分的边缘过多(即噪音增加),同时文字部分的边缘信息则容易被忽略,从而导致效果变差.如果在此时进行腐蚀或膨胀,那么将会使得背景区域跟文字区域粘合,效果进一步恶化.在本文中放弃了边缘检测和腐蚀膨胀,通过聚类、分割、去噪、池化等步骤,得到了比较良好的文字部分的特征,这些特征可以直接输入到文字识别模型中进行识别.由于每一部分结果都有相应的理论基础作为支撑,因此能够模型的可靠性得到保证.特征提取流程图3.1图像的预处理首先将原始图片以灰度图像的形式读入,得到一个m×n的灰度矩阵M,其中m,n是图像的长、宽.这样读入比直接读入RGB彩色图像维度更低,同时没有明显损失文字信息.转换为灰度图事实上就是将原来的RGB图像的三个通道以下面的公式整合为一个通道:Y=0.299R+0.587G+0.114B(1)图像本身的尺寸不大,如果直接处理,则会导致文字笔画过小,容易被当成噪音处理掉,因此为了保证文字的笔画有一定的厚度,可以先将图片进行放大.在实验中,一般将图像放大为原来的两倍就有比较好的效果了.不过,图像放大之后,文字与背景之间的区分度降低了.这是因为图片放大时会使用插值算法来填补空缺部分的像素.这时候需要相应地增大区分度.经过测试,在大多数图片中,使用次数为2的“幂次变换”效果较好.幂次变换为rxx(2)其中x代表矩阵M中的元素,r为次数,在这里我们选取为2.然后需要将结果映射到[0,255]区间:255*minmaxminMMMxx(3)其中Mmax,Mmin是矩阵M的最大值和最小值.3.2灰度聚类接着就对图像的色彩进行聚类.聚类的有两个事实依据:1.灰度分辨率:肉眼的灰度分辨率大概为40,因此对于像素值254和255,在肉眼看来都只是白色;2.设计原则:根据一般的审美原则,在考虑海报设计、服装搭配等搭配的时候,一般要求在服装、海报等颜色搭配不超过三种颜色.更通俗地说,虽然灰度图片色阶范围是[0,255],但能感觉到的整体的色调一般不多,因此,可以将相近的色阶归为一类,从而减少颜色分布,有效地降低噪音.事实上,聚类是根据图像的特点自适应地进行多值化的过程,避免了传统的简单二值化所带来的信息损失.由于需要自动地确定聚类数目,因此传统的KMeans等聚类方法被抛弃了,而且经过测试,诸如MeanShift等可行的聚类方法又存在速度较慢等缺陷.因此,自行设计了聚类方法,使用的是“核概率密度估计”的思路,通过求颜色密度极值的方式来聚类.核密度估计:经过预处理的图像,可以对每个色阶的出现次数进行统计,得到如图5的频率分布直方图:图5:对预处理后的图像进行灰色阶统计可以看到,色阶的分布形成了几个比较突出的峰,换言之,存在一定的聚类趋势.然而,直方图的统计结果是不连续的,一个平滑的结果更便于我们分析研究,结果也更有说服力.将统计结果平滑化的方法,就是核密度估计(kerneldensityestimation).核密度估计方法是一种非参数估计方法,由Rosenblatt和Parzen提出,在统计学理论和应用领域均受到高度的重视[2].当然,也可以简单地将它看成一种函数平滑方式.我们根据大量的数据来估计某个值出现的概率(密度)时,事实上做的是如下估算:niihxxknhx11p(4)其中K(x)称为核函数.当h取为1,且K(x)取0,10!,0{kxxx(5)时,就是上述的直方图估计.K(x)这一项的含义很简单,它就是告诉我们在范围h内的xi都算入到x中去,至于怎么算,由K(x−xi/h)给出.可见,h的选择对结果的影响很大,h称之为带宽(bandwidth),它主要影响结果的平滑性.如果K(x)是离散的,得到的结果还是离散的,但如果K(x)是光滑的,得到的结果也是比较光滑的.一个常用的光滑函数核是高斯核:2/221Kxex(6)所得到的估计也叫高斯核密度估计.在这里,使用scott规则自适应地选取h,但需要手动指定一个平滑因子,在本文中,选取为0.2.对于示例图片,我们得到如图6的红色曲线的结果.图6:频率分布的高斯核密度估计极大极小值分割:从图6中可以看出,图像确实存在着聚类趋势.这表现为它有几个明显的极大值和极小值点,这里的极大值点位于x=10,57,97,123,154,极小值点位于25,71,121,142.因此聚类方法是:有多少个极大值点,就聚为多少类,并且以极小值点作为类别之间的边界.对于图3,可以将图像分层5层,逐层处理.分层之后,每一层的形状如下图,其中白色是1,黑色是0.通过聚类将图像分为5个图层可见,由于“对比度”和“渐变性”假设,通过聚类确实可以将文字图层通过核密度估计的聚类方法分离开来.而且,通过聚类分层的思路,无需对文字颜色作任何假定,即便是文字颜色跟背景颜色一致时,也可以获得有效检测.逐层识别:当图像有效地进行分层后,就可以根据前面的假设,进一步设计相应的模型,通过逐层处理的方式找出图像中的文字区域.连通性可以看到,每一层的图像是由若干连通区域组成的,文字本身是由笔画较为密集组成的,因此往往文字也能够组成一个连通区域.这里的连通定义为8邻接,即某个像素周围的8个像素都定义为邻接像素,邻接的像素则被定义为同一个连通区域.定义了连通区域后,每个图层被分割为若干个连通区域,也就是说,我们逐步地将原始图像进行分解,如图9.图9图像分解结构图抗腐蚀能力:将图像分解至连通区域这一粒度后,就不再细分了,下一步开始识别哪些区域是可能的文字区域.这里要求文字具有一定的抗腐蚀能力.因此先来定义腐蚀.腐蚀是一种图像上的形态学变换,一般针对于二值图像,对于二值图像中的非零像素(即取值为1的像素),如果它邻接的像素都为1,则保持不变,否则变为0,这里我们同样采用的是8邻接的定义.可以看到,如果连通区域的边界线越长,那么腐蚀运算对它的“伤害”就越大,反之,如果连通区域的边界线越短,那么腐蚀运算对它的“伤害”就越小.根据以上腐蚀的定义,可以给出一个对文字区域的要求:抗腐蚀要求文字所在的连通区域应当具有一定的抗腐蚀能力。一个面积较大的方形区域,它的抗腐蚀能力是很强的,因为它边界线很短,但这些区域明显不是文字区域,此外,抗腐蚀能力太弱也不可以,比如细长的线条,腐蚀之后可能就消失了,这些也不作为候选的文字区域,上一篇文章中分解后图层4的文字边界线就属于这一类型.这里可以定义一个抗腐蚀能力的指标:连通区域的抗腐蚀能力=该区域被腐蚀后的总面积/该区域被腐蚀前的总面积(7)经过测试,文字区域的抗腐蚀能力大概在[0.1,0.9]这个区间中.经过抗腐蚀能力筛选分解的5个图层,只保留抗腐蚀能力在[0.1,0.9]这个区间中的连通区域。池化操作:到现在为止,得到了5个特征层,虽然肉眼可以看到,文字主要集中在第5个特征层.但是,对于一般的图片,文字可能分布在多个特征层,因此需要对特征层进行整合.首先将5个特征层进行叠加,得到一幅整体的图像特征(称为叠加特征).这样的图像特征可以当作最后的特征输出,但并不是最好的方法.某个区域内的主要文字特征应该已经集中分布在某个特征层中,而不是分散在所有的特征层.因此,得到叠加特征后,使用类似“最大值池化”的方式整合特征,步骤如下:1.直接叠加特征,然后对叠加特征划分连通区域;2.检测每个连通区域的主要贡献是哪个特征层,该连通区域就只保留这个特征层的来源.经过这样的池化操作后,得到的最终特征结果如图11.图11池化后的特征后期处理:对于演示的这幅图像,经过上述操作后,得到的特征图11已经不用再做什么处理了.然而,对于一般的图片,还有可能出现一些没处理好的区域,这时候需要在前述结果的基础上进一步排除.排除过程主要有两个步骤,一个是低/高密度区排除,另外则是孤立区排除.密度排除一种明显不是文字区域的连通区域是低密度区,一个典型的例子就是由表格线组成的连通区域,这样的区域范围较大,但点很少,也就是密度很低,这种低密度区可以排除.首先我们来定义连通区域密度和低密度区:连通区域密度从一个连通区域出发,可以找到该连通区域的水平外切矩形,该区域的密度定义为连通区域密度=连通区域的面积外切矩形的面积×原图像总面积外切矩形的面积(8)低密度区如果一个连通区域的密度小于16,那么这个连通区域定义为低密度区.直觉上的定义应该是连通区域的面积外切矩形的面积,但这里多了一个因子原图像总面积外切矩形的面积,目的是把面积大小这个影响因素加进去,因为文字一般有明显的边界,容易被分割开
本文标题:光学字符识别
链接地址:https://www.777doc.com/doc-2699166 .html