OCR——简介
文字识别也是图像领域一个常见问题。然而,对于自然场景图像,首先要定位图像中的文字位置,然后才能进行文字的识别。
所以一般来说,从自然场景图片中进行文字识别,需要包括2个步骤:
文字检测:解决的问题是哪里有文字,文字的范围有多少
文字识别:对定位好的文字区域进行识别,主要解决的问题是每个文字是什么,将图像中的文字区域进转化为字符信息。
1、CTPN原理——文字检测
1.1、简介
CTPN是在ECCV 2016提出的一种文字检测算法。CTPN结合CNN与LSTM深度网络,能有效的检测出复杂场景的横向分布的文字,效果如下图,是目前比较好的文字检测算法。
CTPN算法的提出,出于以下几点:
(1)、假设文本是水平的;
(2)、文本可以看做由每一个“字母”组成的。这里的字母可以认为是小片段。之所以有这样的想法,是因为基于通用目标检测的算法难以适应文字检测的场景,如上图中的文字,长度方面变化幅度很大。
因此作者将文本在水平方向解耦,分成每一个小片,然后将文本行的检测转化为小片的检测,最后利用规则将属于同一水平行的小片组合成文本行。化繁为简。
1.2、CTPN模型创新点
CTPN的创新点主要由以下三点:
(1)、将文本行拆分为slice进行检测,这样在检测过程中只需要对文本的高度进行先验性的设置anchor。
(2)、作者认为文本具有时序性,即和阅读习惯一直,从左到右。因此作者加入RNN获取这种语义性。
(3)、后处理算法:文本连接算法。
1.3、CTPN与RPN网络结构的差异
如上图所示,左图为RPN,右图为CTPN的网络结构。可以看到,CTPN本身就是RPN,唯一不同的是加入了双向LSTM获取时序方向的信息,使得模型可以序列性的预测文本的小片。
当然这里的不同之处主要有以下几点:
(1)、双向LSTM对文本行方向编码
(2)、标签构造方式不同:CTPN使用水平方向的切片框作为回归目标。
1.4、CTPN网络结构
原始CTPN只检测横向排列的文字。CTPN结构与Faster R-CNN基本类似,但是加入了LSTM层(CNN学习的是感受野内的空间信息,LSTM学习的是序列特征。对于文本序列检测,显然既需要CNN抽象空间特征,也需要序列特征,毕竟文字是连续的)。假设输入N Images:
CTPN的整体结构与流程:
1.首先通过BackBone架构网络VGG16进行特征的提取,其Conv5层输出N x C x H x W的特征图,由于VGG16的卷积网络中经过4个池化层累计的Stride为16。也就是Conv5层输出的Feature map中一个像素对应原图的16像素。
2.然后在Conv5上做3 x 3的滑动窗口,即每个点都结合周围3 x 3区域特征获取一个长度为3 x 3 x C的特征向量。如下图所示,输出为N x 9C x H x W的Feature map,该特征依然是由CNN学习到的空间特征。
3.之后继续对上一步输出的Feature map进行Reshape操作:
4.然后以Batch = NH且最大时间长度Tmax=W的数据流输入Bi-LSTM,学习每一行的序列特征。Bi-LSTM输出为(N H) x W x 256,再经Reshape回复形状:
该特征既包含了空间特征,也包含了Bi-LSTM学习到的序列特征。
5.再然后经过“FC”层,变为N x 512 x H x W的特征
6.最后经过类似Faster RCNN的RPN网络,获得Text Proposals。
Bi-LSTM的输出输入至FC中,最终模型三个输出:
文本小片的坐标偏移(y, h)。这里作者没有对起始坐标进行预测,因为这部分在标签构造过程有固定的偏移,因此只需要知道文本的y, h,利用固定的偏移可以构造出完整的文本行。
1.5、如何通过FC层输出产生Text proposals?
CTPN通过CNN和BLSTM学到一组“空间 + 序列”特征后,在"FC"卷积层后接入RPN网络。这里的RPN与Faster R-CNN类似,分为两个分支:
左边分支用于Bounding Box Regression。由于FC Feature map每个点配备了10个Anchor,同时只回归中心y坐标与高度2个值,所以RPN_bboxp_red有20个Channels;
右边分支用于Softmax分类Anchor。
1.6、竖直Anchor定位文字位置
由于CTPN针对的是横向排列的文字检测,所以其采用了一组(10个)等宽度的Anchors,用于定位文字位置。Anchor宽高为:
需要注意,由于CTPN采用VGG16模型提取特征,那么Conv5 Feature map的宽高都是输入Image的宽高的1/16。同时FC与Conv5 width和height都相等。如下图所示,CTPN为FC Feature map每一个点都配备10个上述Anchors。
这样设置Anchors是为了:
1.保证在x方向上,Anchor覆盖原图每个点且不相互重叠。
2.不同文本在y方向上高度差距很大,所以设置Anchors高度为11-283,用于覆盖不同高度的文本目标。
注意:Anchor大小为什么对应原图尺度,而不是conv5/fc特征尺度?
这是因为Anchor是目标的候选框,经过后续分类+位置修正获得目标在原图尺度的检测框。那么这就要求Anchor必须是对应原图尺度!除此之外,如果Anchor大小对应conv5/FC尺度,那就要求Bounding box regression把很小的框回归到很大,这已经超出Regression小范围修正框的设计目的。
获得Anchor后,与Faster R-CNN类似,CTPN会做如下处理:
1.Softmax判断Anchor中是否包含文本,即选出Softmax Score大的正Anchor;
2.Bounding box regression修正包含文本的Anchor的中心y坐标与高度。
注意,与Faster R-CNN不同的是,这里Bounding box regression不修正Anchor中心x坐标和宽度。具体回归方式如下:
其中,v=(v_c,v_h)是回归预测的坐标,v=(v^{*}_{c},v^{*}_{h})是Ground Truth,c^{a}_{y}和h^{a}是Anchor的中心y坐标和高度。Bounding box regression具体原理请参考之前文章。
Anchor经过上述Softmax和 方向bounding box regeression处理后,会获得下图所示的一组竖直条状text proposal。后续只需要将这些text proposal用文本线构造算法连接在一起即可获得文本位置。
在论文中,作者也给出了直接使用Faster R-CNN RPN生成普通proposal与CTPN LSTM+竖直Anchor生成text proposal的对比,如图8,明显可以看到CTPN这种方法更适合文字检测。
1.7、文本线构造算法
在上一个步骤中,已经获得了一串或多串text proposal,接下来就要采用文本线构造办法,把这些text proposal连接成一个文本检测框。
为了说明问题,假设某张图有上图所示的2个text proposal,即蓝色和红色2组Anchor,CTPN采用如下算法构造文本线:
1.按照水平x坐标排序Anchor;
2.按照规则依次计算每个Anchor boxi的pair(boxj),组成pair( boxi,boxj);
3.通过pair( boxi,boxj)建立一个Connect graph,最终获得文本检测框.
下面详细解释。假设每个Anchor index如绿色数字,同时每个Anchor Softmax score如黑色数字。
文本线构造算法通过如下方式建立每个Anchor boxi的pair( boxi,boxj):
正向寻找:
1.沿水平正方向,寻找和 boxi水平距离小于50的候选Anchor;
2.从候选Anchor中,挑出与 boxi竖直方向overlapv > 0.7的Anchor;
3.挑出符合条件2中Softmax score最大的boxj
再反向寻找:
1.沿水平负方向,寻找和boxj水平距离小于50的候选Anchor;
2.从候选Anchor中,挑出与boxj竖直方向overlapv > 0.7的Anchor;
3.挑出符合条件2中Softmax score最大的boxk
最后对比scorei和scorek:
1.如果scorei >= scorek,则这是一个最长连接,那么设置Graph(i,j)=True;
2.如果scorei < scorek,说明这不是一个最长的连接(即该连接肯定包含在另外一个更长的连接中)。
举例说明,如上图,Anchor已经按照x顺序排列好,并具有图中的Softmax score(这里的score是随便给出的,只用于说明文本线构造算法):
对于i=3的box3,向前寻找50像素,满足overlapv > 0.7且score最大的是box7,即j=7;box7反向寻找,满足 overlapv > 0.7且score最大的是box3,即k=3。由于score3 >= score3,pair( box3,box7)是最长连接,那么设置Graph(3,7)=True
对于box4正向寻找得到box7;box7反向寻找得到box3,但是score4 < score3,即pair( box4,box3)不是最长连接,包含在pair( box3,box7)中。
然后,这样就建立了一个N X N的Connect graph(其中N是正Anchor数量)。遍历Graph:
1.Graph(0,3)=True且Graph(3,7)=True,所以Anchor index 1→3→7组成一个文本,即蓝色文本区域。
2.Graph(6,10)=True且Graph(10,12)=True,所以Anchor index 6→10→12组成另外一个文本,即红色文本区域。
这样就通过Text proposals确定了文本检测框。
1.8、CTPN的训练策略
该Loss分为3个部分:
Anchor前后景分类误差:该Loss用于监督学习每个Anchor中是否包含文本。s^{*}_{i}={0,1}表示是否是Groud truth。
竖直方向坐标偏移回归误差:该Loss用于监督学习每个包含为本的Anchor的Bouding box regression y方向offset,类似于Smooth L1 loss。其中vj是si中判定为有文本的Anchor,或者与Groud truth vertical IoU>0.5。
边界处Anchor x的矫正误差:该Loss用于监督学习每个包含文本的Anchor的Bouding box regression x方向offset,与y方向同理。
前两个Loss存在的必要性很明确,但这个Loss有何作用作者没有解释(从训练和测试的实际效果看,作用不大)说明一下,在Bounding box regression的训练过程中,其实只需要注意被判定成正的Anchor,不需要去关心杂乱的负Anchor。这与Faster R-CNN类似。
1.9、CTPN小结
1.由于加入LSTM,所以CTPN对水平文字检测效果超级好。
2.因为Anchor设定的原因,CTPN只能检测横向分布的文字,小幅改进加入水平Anchor即可检测竖直文字。但是由于框架限定,对不规则倾斜文字检测效果非常一般。
3.CTPN加入了双向LSTM学习文字的序列特征,有利于文字检测。但是引入LSTM后,在训练时很容易梯度爆炸,需要小心处理