《Detecting Text in Natural Image with Connectionist Text Proposal Network》论文阅读之CTPN

前言

2016年出了一篇很有名的文本检测的论文:《Detecting Text in Natural Image with
Connectionist Text Proposal Network》,这个深度神经网络叫做CTPN,直到今天这个网络框架一直是OCR系统中做文本检测的一个常用网络,极大地影响了后面文本检测算法的方向。

这个算法很有创新,我打算一步一步介绍其闪光点。

摘要

问题分析

文本检测不是一件简单的任务,尤其是复杂场景下的文本检测,非常具有挑战性。自然场景下的文本检测有如下几个难点:

  • 文本存在多种分布,文本排布形式多样;
  • 文本存在多个方向;
  • 多种语言混合。

文字目标的特殊性,一个很大的先验是,文字总是水平排列的。文字的特征总感觉体现在edge上。

自然场景文字检测的难点在于:小目标,遮挡,仿射畸变。本文使用VGG16,只使用conv5,可能对小文字的检测效果不好。

文本检测和一般目标检测的不同——文本线是一个sequence(字符、字符的一部分、多字符组成的一个sequence),而不是一般目标检测中只有一个独立的目标。这既是优势,也是难点。优势体现在同一文本线上不同字符可以互相利用上下文,可以用sequence的方法比如RNN来表示。难点体现在要检测出一个完整的文本线,同一文本线上不同字符可能差异大,距离远,要作为一个整体检测出来难度比单个目标更大。

因此,作者认为预测文本的竖直位置(文本bounding box的上下边界)比水平位置(文本bounding box的左右边界)更容易。

Top-down先检测文本区域,再找出文本线)的文本检测方法比传统的bottom-up的检测方法(先检测字符,再串成文本线)更好。自底向上的方法的缺点在于没有考虑上下文,不够鲁棒,系统需要太多子模块,太复杂且误差逐步积累,性能受限。
 

本文中利用RNN和CNN的无缝结合可以提高检测精度。CNN用来提取深度特征,RNN用来序列的特征识别(2类),二者无缝结合,用在检测上性能更好。

具体的说,作者的基本想法就是去预测文本的竖直方向上的位置,水平方向的位置不预测。因此作者提出了一个vertical anchor的方法。与faster rcnn中的anchor类似,但是不同的是,vertical anchor的宽度都是固定好的了,论文中的大小是16个像素。而高度则从11像素到273像素变化,总共10个anchor.

同时,对于水平的文本行,其中的每一个文本段之间都是有联系的,因此作者采用了CNN+RNN的一种网络结构,检测结果更加鲁棒。

基于检测的方法能很好地解决水平文字的检测问题,缺点是对于非水平的文字不能检测。

网络结构为RPN,针对文字检测的特点做了一些修改,最重要的有两点,

一是改变了判断正负样本的方法,不同于物体检测,文字检测中proposal如果只框住了一行文字中的几个文字其实也算正样本,而用IOU计算的话会被当成负样本,所以判断正负样本只需要计算proposal与ground truth高度的overlap就可以了。

第二点是anchor的选取,既然我们判断正负样本的时候不考虑宽度,自然选anchor的时候也不用选择不同宽度的了,只需要固定宽度然后根据具体任务选择几个合适的高度就可以了。其他地方和RPN基本一样。

 

过程及思想


我们回顾一下Faster RCNN(请阅读《论文阅读之Faster R-CNN》)做目标检测的一个缺点就是,没有考虑带文本自身的特点。文本行一般以水平长矩形的形式存在,而且文本行中每个字都有间隔。针对这个特点,CTPN剔除一个新奇的想法,我们可以把文本检测的任务拆分,第一步我们检测文本框中的一部分,判断它是不是一个文本的一部分,当对一幅图里所有小文本框都检测之后,我们就将属于同一个文本框的小文本框合并,合并之后就可以得到一个完整的、大的文本框了,也就完成了文本的检测任务。这个想法真的很有创造性,有点像“分治法”,先检测大物体的一小部分,等所有小部分都检测出来,大物体也就可以检测出来了。

 

如图所示,左边的图是直接使用Faster RCNN中的RPN来进行候选框提取,可以看出,这种候选框太粗糙了,效果并不好。而右图是利用许多小候选框来合并成一个大文本预测框,可以看出这个算法的效果非常不错,需要说明的是,红色框表示这个小候选框的置信度比较高,而其他颜色的候选框的置信度比较低,我们可以看到,一个大文本的边界都是比较难预测的,那怎么解决这个边界预测不准的问题呢?后面会提到。

刚提到CTPN的其中一个闪光点,即检测小框代替直接检测大文本框。除了这个新意,CTPN还提出了在文本检测中应加入RNN来进一步提升效果。为什么要用RNN来提升检测效果?文本具有很强的连续字符,其中连续的上下文信息对于做出可靠决策来说很重要。我们知道RNN常用于序列模型,比如事件序列,语言序列等等,那我们CTPN算法中,把一个完整的文本框拆分成多个小文本框集合,其实这也是一个序列模型,可以利用过去或未来的信息来学习和预测,所以同样可以使用RNN模型。而且,在CTPN中,用的还是BiLSTM(双向LSTM),因为一个小文本框,对于它的预测,我们不仅与其左边的小文本框有关系,而且还与其右边的小文本框有关系!这个解释就很有说服力了,如果我们仅仅根据一个文本框的信息区预测该框内含不含有文字其实是很草率的,我们应该多参考这个框的左边和右边的小框的信息后(尤其是与其紧挨着的框)再做预测准确率会大大提升。

如上图所示,如果我们单纯依靠1号框内的信息来直接预测1号框中否存在文字(或者说是不是文本的一部分),其实难度相当大,因为1号框只包含文字的很小一部分。但是如果我们把2号框和3号框的信息都用上,来预测1号框是否存在文字,那么我们就会有比较大的把握来预测1号框确实有文字。我们还可以看看为什么边缘的文本框的置信度会较中间的低呢?个人认为很大一部分原因就在于因为这些框都位于总文本的边缘,没有办法充分利用左右相邻序列的信息做预测(比如位于最左的文本框丢失了其右边的信息)。这就是双向LSTM的作用,把左右两个方向的序列信息都加入到学习的过程中去。

我们已经对CTPN这个算法的总体思路有了一点理解,那关键问题来了,我们怎么把这些小文本框准确地检测出来呢?

CTPN借助了Faster RCNN中anchor回归机制,使得RPN能有效地用单一尺寸的滑动窗口来检测多尺寸的物体。当然CTPN根据文本检测的特点做了比较多的创新。比如RPN中anchor机制是直接回归预测物体的四个参数(x,y,w,h),但是CTPN采取之回归两个参数(y,h),即anchor的纵向偏移以及该anchor的文本框的高度,因为每个候选框的宽度w已经规定为16个像素,不需要再学习,而x坐标直接使用anchor的x坐标,也不用学习,所以CTPN的思路就是只学习y和h这两个参数来完成小候选框的检测!跟RPN相类似,CTPN中对于每个候选框都使用了K个不同的anchors(k在这里默认是10),但是与RPN不同的是,这里的anchors的width是固定的16个像素,而height的高度范围为11~273(每次对输入图像的height除以0.7,一共K个高度)。当然CTPN中还是保留了RPN大多数的思路,比如还是需要预测候选框的分数score(该候选框有文本和无文本的得分)。

这么多小尺度候选框怎么才能串联成一个完整的文本行呢?

文本行构建很简单,通过将那些text/no-text score > 0.7的连续的text proposals相连接即可。文本行的构建如下。首先,为一个proposal Bi定义一个邻居(Bj):Bj−>Bi,其中:

  1. Bj在水平距离上离Bi最近
  2. 该距离小于50 pixels
  3. 它们的垂直重叠(vertical overlap) > 0.7

另外,如果同时满足Bj−>Bi和Bi−>Bj,会将两个proposals被聚集成一个pair。接着,一个文本行会通过连续将具有相同proposal的pairs来进行连接来构建。

步骤:

第一,首先,使用VGG16作为base net提取特征,得到conv5_3的特征作为feature map,大小是W×H×C;

第二,然后在这个feature map上做滑窗,窗口大小是3×3。也就是每个窗口都能得到一个长度为3×3×C的特征向量。这个特征向量将用来预测和10个anchor之间的偏移距离,也就是说每一个窗口中心都会预测出10个text propsoal。

第三,将每一行的所有窗口对应的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因为一个anchor用的是中心位置的高(y坐标)和矩形框的高度两个值表示的,所以一个用2k个输出。(注意这里输出的是相对anchor的偏移),k个side-refinement这部分主要是用来精修文本行的两个端点的,表示的是每个proposal的水平平移量。这边注意,只用了3个参数表示回归的bounding box,因为这里默认了每个anchor的width是16,且不再变化(VGG16的conv5的stride是16)。回归出来的box如Fig.1中那些红色的细长矩形,它们的宽度是一定的。

第六,这是会得到密集预测的text proposal,所以会使用一个标准的非极大值抑制算法来滤除多余的box。 
第七,用简单的文本线构造算法,把分类得到的文字的proposal(图Fig.1(b)中的细长的矩形)合并成文本线。


网络结构

接下来我们就较为细节地学习一下这个CTPN经典网络。

首先CTPN的基础网络使用了VGG16用于特征提取,在VGG的最后一个卷积层CONV5,CTPN用了3×3的卷积核来对该feature map做卷积,这个CVON5 特征图的尺寸由输入图像来决定,而卷积时的步长却限定为16,感受野被固定为228个像素。卷积后的特征将送入BLSTM继续学习,最后接上一层全连接层FC输出我们要预测的参数:2K个纵向坐标y,2k个分数,k个x的水平偏移量。看到这里大家可能有个疑问,这个x的偏移到底是什么,为什么需要回归这个参数?如果需要X的参数,为什么不在候选框参数回归时直接预测成(x,y,h)三个参数呢,而要多此一举把该参数单独预测?这个X的作用作者提到这也是他们论文的一大亮点,称之为Side-refinement,我理解为文本框边缘优化。我们回顾一下上面提到的一个问题,文本框检测中边缘部分的预测并不准确。那么改咋办,CTPN就是用这个X的偏移量来精修边缘问题。这个X是指文本框在水平方向的左边界和右边界,我们通过回归这个左边界和右边界参数进而可以使得我们对文本框的检测更为精准。在这里想举个例子说明一下回归这个x参数的重要性。

我们观察下图,第一幅图张我们看到我们有很多小候选框,位于左边的候选框我标记为1、2、3、4号框,1号框和2号框为蓝色,表明得分不高我们不把这两个框合并到大文本框内,对于3号框和4号框那就比较尴尬了,如果取3号框作为文本框的边缘框,那么显然左边边缘留白太多,精准度不够,但如果去掉3号框而使用4号框作为左边缘框,则有些字体区域没有检测出来,同样检测精度不足。这种情况其实非常容易出现,所以CTPN采取了Side-refinement 思路进一步优化边缘位置的预测即引入回归X参数,X参数直接标定了完整文本框的左右边界,做到精确的边界预测。第二幅图中的红色框就是经过Side-refinement后的检测结果,可以看出检测准确率有了很大的提升。 side-refinement确实可以进一步提升位置准确率,在SWT的Multi-Lingual datasets上产生2%的效果提升。

再看多几幅图,体验一下Side-refinement后的效果。

1.输入为3*600(h)*900(w),首先vgg-16提取特征,到conv5-3时(VGG第5个block的第三个卷积层),大小为512*38*57。
2.im2col层 512*38*57 ->4608 * 38 * 57 其中4608为(512*9 (3*3卷积展开))
3.而后的lstm层,每个lstm层是128个隐层 57*38*4608 ->57*38*128 reverse-lstm同样得到的是57*38*128。(双向lstm没有去研 究,但我个人理解应该是左边的结果对右边会产生影响,同样右边也会对左边产生影响,有空再去看) merge后得到了最终lstm_output的结果 256* 38 * 57
4.fc层 就是一个256*512的矩阵参数 得到512*38*57 fc不再展开;
5.rpn_cls_score层得到置信度 512*38*57 ->20*38*57 其中20 = 10 * 2 其中10为10个尺度 同样为512*20的参数,kernel_size为1的卷积层;
6.rpn_bbox_pre层 得到偏移 512*38*57 ->20*38*57。同样是十个尺度 2 * 10 * 38 * 57 
因为38*57每个点每个scale的固定位置我们是知道的。而它与真实位置的偏移只需两个值便可以得到。 
假设固定位置中点( Cx,Cy) 。 高度Ch。实际位置中点(x,y) 高度h 
则log(h/Ch)作为一个值 
(y-Cy) / Ch作为一个值 
20 * 38 * 57 便是10个尺度下得到的这两个值。有了这两个值,我们便能知道真实的文本框位置了。
 

方法细节


k个anchor尺度和长宽比设置

宽度都是16,k = 10,高度从11~273(每次除于0.7)

回归的高度和bounding box的中心的y坐标如下,带*的表示是groundTruth,带a的表示是anchor 


Side-refinement 


文本线构造算法(多个细长的proposal合并成一条文本线) 
主要思想:每两个相近的proposal组成一个pair,合并不同的pair直到无法再合并为止(没有公共元素) 
判断两个proposal,Bi和Bj组成pair的条件: 
Bj->Bi, 且Bi->Bj。(Bj->Bi表示Bj是Bi的最好邻居) 
Bj->Bi条件1:Bj是Bi的邻居中距离Bi最近的,且该距离小于50个像素 
Bj->Bi条件2:Bj和Bi的vertical overlap大于0.7

训练


对于每一张训练图片,总共抽取128个样本,64正64负,如果正样本不够就用负样本补齐。这个和faster rcnn的做法是一样的。

训练图片都将短边放缩到600像素。
 

 

本文工作基于faster RCNN , 区别在于

1.改进了rpn,anchor产生的window的宽度固定为3。
2.rpn后面不是直接接全连接+分类/回归,而是再通过一个LSTM,再接全连接层。 坐标仅仅回归一个y,而不是x1, y1, x2, y2
3.添加 side-refinement offsets(可能这个就是4个回归值中的其中2个)
 

最后总结一下CTPN这个流行的文本检测框架的三个闪光点:

  • 将文本检测任务转化为一连串小尺度文本框的检测;
  • 引入RNN提升文本检测效果;
  • Side-refinement(边界优化)提升文本框边界预测精准度。

当然,CTPN也有一个很明显的缺点:对于非水平的文本的检测效果并不好。CTPN论文中给出的文本检测效果图都是文本位于水平方向的,显然CTPN并没有针对多方向的文本检测有深入的探讨。那对于任意角度的文本检测应该采取什么的算法思路呢?后面将介绍的SegLink算法给出了一个新奇的解决方案。

 

 

 

 

全文翻译:

Detecting Text in Natural Image with Connectionist Text Proposal Network 中文版 中英文对照

参考链接:

1.https://www.cnblogs.com/skyfsm/p/9776611.html

 

 

你可能感兴趣的:(OCR,Paper,Reading)