文本检测学习笔记——边界聚类,笔画分割,语句段落分类
搬以前写的博客【2014-02-28 10:24】
2.21 ~2.27 这一周在阅读一篇比较长的文献
Localizing Text in Scene Images by Boundary Clustering, Stroke Segmentation, and String Fragment Classification
By Chucai Yi
1. 杂谈
从题目Localizing Text,可以看出文章主要是在做一个工作 ——— 文字定位。文字定位,也可以说是文字检测,是自然语言处理中的一个领域,也就是我毕业设计的主要方向。说到文字检测,先说说文字处理,字面上来看要做的事情就是把生活中的各种文字通过计算机程序来处理,用于某种用途,文字处理的例子很多,比如比较火的搜狗照相翻译功能,只需对着文字摄像,即可自动识别文字然后翻译,再比如车牌号识别系统。如何做文字处理呢?一般用于计算机做文字处理的数据类型是图片,也就是说文字处理是找到一篇图片中的文字,给他做定位,提取出来,然后识别。文字检测很显然,是文字处理的第一步过程,把文字位置找到的过程。而文字检测也分很多种,简单的像打印文档图片的文字检测,之所以说简单,因为打印文档字体规范,黑色为文字白色为背景,简单的一个颜色作为判别标准即可对文字做提取,然后识别,再难一些如视频中的文字检测以及拥有复杂背景图片的文字检测,因为没有简单的判别标准去直接定位文字,而需要多种算法结合起来,而我的工作就是从复杂背景图片下做文字检测。比如下面这种。
图片中包含有窗户,树叶电线杆等杂物,颜色也多种多样,就不能单纯的以颜色或者其他参数作为标准去提取文字。那么在这种背景下,该如何去做定位工作呢,当前这个研究领域中有很多人在做这个方向的研究,算法也有很多很多,但大多数不能完全100%的准确解决这个问题,所以更好的算法需要被踢出来,这也是研究的意义所在。
2.文章主体
文章名为《基于 (1)边界聚类,(2)笔画分割和(3)语句片段分类的自然场景图片的文字检测》。自然场景图片也就是复杂背景图片。也许你不知道提到的(1)(2)(3)究竟是在说什么,这样的词汇会让人不懂,但是可以简单理解为这三个处理过程就是使一张自然场景图片中不是文字的部分被一步一步的被去掉最后得到文字位置的过程。下面针对这三步讲一讲:
(1)边界聚类
边界聚类这个词可以分成两个部分:边界、聚类。聚类也就是clustering,把拥有相同性质的基本单元聚到一起,这里基本元素是图像像素,性质是什么还不知道,但是肯定与边界有关;再说边界,边界指的是图像中的边沿区域、边缘、物体轮廓,也就是edge,从像素的角度就是图片中颜色突变部分的那些像素,也就是说像素的灰度变化大,梯度高。在上面那张图里,文字轮廓房屋边角都是边界。那么这篇文章是怎么根据边界来做分类的呢?实际上对于文字边界和其他物体的边界来说,有一个很明显的区别,文字的边界内部是笔画(stroke),外部是附着面(attachment surface),笔画和附着面都有各自的颜色,而且在一片连续的区域内颜色基本一致,而对于其他物体,窗户树叶等形状颜色不规则的物体就没有这个性质。那么依据这种边界两侧的区域内颜色不同,但是两侧颜色分别一致的特点,我们对整张图片中的像素进行分类。除此之外,图片中不同位置的文字一般不属于一个字母,也就说边界在图片中的大致位置也是我们分类的依据之一,一般图片中的文字都是水平的(用于测试的图片都是),所以横坐标不一样但纵坐标一样我们也视为文字的位置一样,那么对于每一个边界像素来说,用于做分类的特征就包含边界两侧颜色对(color1,color2)以及纵坐标(y),特征向量X={color1,color2,y}。
在分类的过程中,第一步就是找出所有的边界像素(edge pixel),第二步是对这些边界像素分类。
第一步 边界检测
这里,文章中用到的方法是,Canny边缘检测器(Canny edge detector),Canny检测器要完全讲明白比较麻烦,有机会会专门补充,不过我们只需要知道他如何工作,Canny检测器的输入是一张RGB图片,输出是一张二值图,前景色是边界像素(集合为P),其他部分是背景色,也就是他可以给出所有的边界像素的位置。
第二步 分类
首先要用到K-means聚类算法,对这些边界像素做第一次分类,K-means聚类依据特征向量X={color1,color2,y},在欧式空间中,把每一个边界像素点所在的位置标出来,然后根据这些点之间的欧氏距离来把他们分成K类,每一类的特征向量X的值比较接近,因此每一类的特征都比较相似,特征相似说明很有可能是同一个文字(或物体)的边界,因而完成了分类。
仅用K-means聚类我们其实已经完成了分类工作,但是为了分类的准确性和稳健性,文章中,建立了高斯混合模型(GMM)用于优化分类,我们知道图片一般会明显的分成很多个部分(边界像素类),前一步分类已经大致把图片分成的几个部分给勾勒出来了,但是具体某一个边界像素是不是一定属于它在那个边界像素类呢,K-means中我们仅仅用到了欧氏距离就绝对的认为属于某一个边界像素类,那么实际上我们用概率模型来定义会比较恰当。对于每一个部分(边界像素类)来说,某一个像素的特征向量x离这个部分中心点(平均值)越远,属于这个部分概率低,离这个部分中心点越近,属于这个部分的概率高,这个性质正好符合高斯分布。那么任一像素都有一个特征x(p),x(p)在哪个分布下的概率更高,那么我们可以认为这个像素p就在那个边界像素类中。对于整张图来说,我们便应用混合高斯模型GMM来定义。
基于高斯混合模型我们可以用EM算法来迭代求解最准确的参数,求出最准确参数后,依据概率来对边界像素分类。
那么边界聚类的主要工作就是把整张图分成了几大部分,每一个文字和物体都是一部分,以边界像素的形式,但是其他非文字物体没有被除去,如下图所示。
(2) 笔画分段
得到第一部中的边界像素层后,其实我们其实离文字还很远,边界像素层只是一些列连在一起的边界像素,只是一个轮廓,他们可能是一个文字,但是仅仅有轮廓我们无法做后续的工作,我们要从这个轮廓中,把笔画找到并填上颜色,相同颜色的连成一个连通域,这个过程中就有一个颜色分配COLOR ASSIGNMENT的过程,把这些边界像素周围所有的像素(一定范围内不是边缘但是离边缘很近,这样一来笔画会被颜色填满)做颜色赋值,其他区域不管,颜色值由该区域的均值特征向量x中的color1,color2来决定,这些像素要么被赋予color1,要么被赋予color2,那么按我们之前的想法,文字边界周围的像素十分明确,外部的附着面都是一个颜色,内部的笔画又是另外一个颜色,在这个分配过程中,文字边界周围的像素被分为了两大类一类是附着面,一类是笔画,同时文字内部也被颜色填满了。然而,非文字物体也会进行这样的过程,会带来一定的问题。文中有两个方法来解决这个问题。
一是DCA,直接颜色赋值。对文字非文字都做颜色赋值,非文字物体即使也连成了连通域,成为可能的候选文字,但是它不符合语句的特征,在后面的过程中会被排除。
二是ICA,先找出含有笔画特征的那些边界层,有了笔画特征,才对他做颜色赋值,没有笔画特征的非文字物体,直接不考虑。ICA在检测笔画特征时用到了一个水平垂直笔画探测器,利用笔画两侧像素梯度相近,梯度方向相反的特点。
那么在笔画分段这部分,把之前每一个边界像素层中的边界像素周围附上了颜色,要么是附着面颜色要么是文字颜色,两种颜色的像素分别连接成连通域后,都成为了可能的候选文字语句,在后续的过程中排除。如果使用了ICA算法,那么会提前去掉一部分非文字物体的干扰。
得到了可能的候选文字语句,那么接下来的任务就是要 通过语句之间的位置特征再作进一步排除。
(3)语句分类器
第一步 布局分析
对于前一步得到文字候选连通域,首先尽可能的把多个文字候选连通域连接成一个语句片段,连接成语句片段的方法之一是Adjacent character grouping,这个算法在另外一篇文章中有详细介绍,这个算法认为的语句特征包括相邻文字应该水平对齐,文字之间距离合适,文字大小相近,文字颜色相近,等等。如果他们符合语句的特征,那么予以保留,否则删除,另外文章也提出了 two-component grouping算法专门针对只有两个字母的语句(如is),约束条件包含以下几个方面:
-
其中一个的中心应该在另外一个的水平范围内,y’-height/6
-
高度比大于0.83小于1.2,宽度比大于0.5小于2
3. 距离不超过更宽CC的2倍,也不少于12,满足要求的CC也被当成语句片段
这两个算法都是用于把大文字合成为语句,对与小文字(大小文字的界限是像素高度为12)来说没有太好的方法,而且小文字常常连通成一整个连通域,因此,文章中把高度小于12且宽高比大于4的连通域直接当成语句来看。
布局分析就是把这些文字候选对象组合成语句,这个过程中,大部分背景杂物因为不满足语句的特征所以被除去了。但是获得的语句只是一个粗略的估计,也不能保证我们获得的就是正确的语句,那么我们最后使用一个机器学习的过程来生成这样一个分类器,把剩下的候选语句做判别,这里的判定机制是一个基于SVM的分类器,那么分类器首先有一个训练的过程。
第二步 训练集的获得
把数据库里的图片经过前面的处理后,最后确实是文字的作为正样本,被排除的语句片段当做反样本,再添加上自己人工获得的一些正反面样本用于SVM分类器学习,既然是学习,最好输入的样本有统一的形式,把这些语句片段,也就是图片补丁归一化到统一的大小,同时把正样本统一成白色前景,黑色背景。
第三步 获得用于训练特征向量
SVM分类器的训练除了需要样本,还需要一个多维特征向量,每个样本都有自己的特征向量,文字的特征向量有相似性,因此可以被归为一类,为了找出这些特征,我们需要用到Gabor滤波器来获取特征点,再有特征点计算出特征向量。如何通过Gabor滤波器获取特征点呢,要讲清楚Gabor滤波器如何获取特征点又是需要一篇文章单独讲述,见这里。
有了特征点之后,文章中提到分别在 梯度图、笔画宽度图、和笔画分布位置图 三张图中,根据这些特征点在这三幅图里面对应的值,在不同的模板下,计算出特征向量。
具体如下:
1.先把图片分区,因为不同位置上图片的特征点的数量不一样,所以为了丰富特征向量,我们可以把一张图片按10种不同的划分方式来做分区。一种模板对应一种划分方式,在模板pi下,划分出不同区域x1,x2,x3...
2.针对模板pi下区域xij的所有特征点,计算出梯度图中的梯度值,分别计算出梯度幅度和梯度方向,把他们分别求和再求平均值,得到sum(pi梯度幅度)、mean(pi梯度幅度)、sum(pi梯度方向)、mean(pi梯度方向),根据区域大小加权之后,得到一共4*10=40个值
3.针对模板pi下区域xij的所有特征点,计算出笔画宽度图中的笔画宽度,分别求和、求平均值,得到sum(pi笔画宽度)、mean(pi笔画宽度),根据区域大小加权之后,得到一共2*10=20个值,再求所有区域中特征点笔画宽度方差deta,用deta/mean表示笔画宽度的一致性,越小一致性越高, 为了均衡值的数量,deta扩展为20维,也就是2*10+20=40;
4.针对xi区域中的所有像素计算前景像素和总像素的比例ratio(pi),共18个区域;
最后一共98维的向量用于做为输入的特征向量,用于SVM的输入。由此可以得到想要的分类器,把语句片段做分类,分类后属于文字这一类的,我们就认为是最终的语句。
至此,本篇文章结束。
总结
文章总体上用到了文字笔画、附着面的颜色双重一致性,又用到笔画文字的几何特征(大小面积水平对齐等),还用到了文字之间的关联性,最后用Gabor过滤器保证了笔画特征,用SVM分类器的学习过程保证了算法的鲁棒性。其中关于GMM模型下EM算法的使用,Gabor滤波器检测纹理特征,都是值得我们学习的地方。