面板英文
【OCR技术系列之五】⾃然场景⽂本检测技术综述(CTPN,SegLink,EAST)
⽂字识别分为两个具体步骤:⽂字的检测和⽂字的识别,两者缺⼀不可,尤其是⽂字检测,是识别的前提条件,若⽂字都找不到,那何谈⽂字识别。今天我们⾸先来谈⼀下当今流⾏的⽂字检测技术有哪些。
⽂本检测不是⼀件简单的任务,尤其是复杂场景下的⽂本检测,⾮常具有挑战性。⾃然场景下的⽂本检测有如下⼏个难点:
⽂本存在多种分布,⽂本排布形式多样;
⽂本存在多个⽅向;
多种语⾔混合。
我们先从直观上理解⽂本检测任务。给定⼀张图⽚,我们需要找出这张图⾥⽂字出现的所有位置位置,那这个任务其实跟⽬标检测任务差别不⼤,即找出每个物体在图⽚中的位置,并标出该包围框⾥的物体的类别。⽽⽂本检测就是,找出每个⽂本在图⽚中出现的位置,因为我们的类别只有2个(有⽂字和没⽂字),看起来就像⼀个简单的单类别⽬标检测的任务,⾃然⽽然我们就会想到⽤经典的⽬标检测⽹络来进⾏⽂本检测,⽐如经典的Faster R-CNN。
Faster RCNN
Faster RCNN来做⽂本检测从任务上分析是可⾏的,毕竟⽂本说到底还是⼀个Object。我们回顾⼀下Faster RCNN做⽬标检测的关键步骤有哪些:
1. 基础⽹络做特征提取;
2. 特征送⼊RPN做候选框提取;
3. 分类层对候选框内物体进⾏分类,回归层对候选框的(x,y,w,h)进⾏精细调整。
Faster RCNN做⽂本检测感觉问题不⼤,但是从效果来看,仅套⽤Faster RCNN来做⽂本检测效果并不好,原因在于,⽂本有⾃⼰独有的特点,这种通⽤的⽂本检测框架并不能很好地解决⽂本的这些特点。那⽂本有什么特点呢?我总结如下:
1. ⽂本⼤多数以长矩形形式存在,即长宽⽐⼀般较⼤或较⼩,这与普通的⽬标检测中的物体不⼀样(这些长宽⽐较接近1)
2. 普通物体(⽐如猫)存在明显的闭合边缘轮廓,⽽⽂本没有;
3. ⽂本中包含多个⽂字,⽽⽂字之间是有间隔的,如果检测做得不好,我们就会把每个字都当成⽂本⾏给框出来⽽⾮整⾏作为⽂本框,这与我们的期望不⼀样。
region是什么意思>封闭式英语培训基于以上⽂本检测的特点,我们必须对Faster RCNN这类通⽤⽹络进⾏改进,设计出适合⽂本检测的全新⽹络架构。
CTPN(2016)
2016年出了⼀篇很有名的⽂本检测的论⽂:《Detecting Text in Natural Image with
Connectionist Text Proposal Network》,这个深度神经⽹络叫做CTPN,直到今天这个⽹络框架⼀直是OCR系统中做⽂本检测的⼀个常⽤⽹络,极⼤地影响了后⾯⽂本检测算法的⽅向。
这个算法很有创新,我打算⼀步⼀步介绍其闪光点。我们回顾⼀下Faster RCNN做⽬标检测的⼀个缺点就是,没有考虑带⽂本⾃⾝的特点。⽂本⾏⼀般以⽔平长矩形的形式存在,⽽且⽂本⾏中每个字都有间隔。针对这个特点,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来进⾏连接来构建。
接下来我们就较为细节地学习⼀下这个CTPN经典⽹络。
vho⾸先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 datats上产⽣2%的效果提升。
再看多⼏幅图,体验⼀下Side-refinement后的效果。
最后总结⼀下CTPN这个流⾏的⽂本检测框架的三个闪光点:
将⽂本检测任务转化为⼀连串⼩尺度⽂本框的检测;
引⼊RNN提升⽂本检测效果;
Side-refinement(边界优化)提升⽂本框边界预测精准度。
当然,CTPN也有⼀个很明显的缺点:对于⾮⽔平的⽂本的检测效果并不好。CTPN论⽂中给出的⽂本检测效果图都是⽂本位于⽔平⽅向的,显然CTPN并没有针对多⽅向的⽂本检测有深⼊的探讨。那对
于任意⾓度的⽂本检测应该采取什么的算法思路呢?下⾯的SegLink算法给出了⼀个新奇的解决⽅案。
SegLink(2017)
学习会计的方法
CVPR2017的⼀篇spotlight论⽂《Detecting Oriented Text in Natural Images by Linking Segments》介绍以⼀种可以检测任意⾓度⽂本的检测算法,我们⼀般称这个算法为SegLink,这篇论⽂既融⼊CTPN⼩尺度候选框的思路⼜加⼊了SSD算法的思路,达到了当时⾃然场景下⽂本检测state-of-art的效果。
现在我想先介绍为什么要针对多⽅向的⽂本检测做特定的研究。对于普通⽬标检测,我们并不需要对其做所谓的多⽅向⽬标检测,⽐如下⾯这个检测任务,我们直接把单车和狗的位置找出来即可。盛气凌人
但是对于⽂本检测任务可不⼀样,⽂本的特点就是⾼宽⽐特别⼤或⼩,⽽且⽂本通常存在⼀定的旋转⾓度,如果我们对于带⾓度的⽂本仍然使⽤⽬标检测那个思路回归四个参数(x,y,w,h)来指定⼀个⽬标的位置的话(如下图红⾊框),那显然误差太⼤了,这个检测效果并不是我们所能接受的。作为对⽐,下图的绿⾊框的检测效果才是我们的终极⽬标。那么怎么基于原来经典的⽬标检测算法做相应的优化以适应这种检测效果的要求呢?
范围英语⼀个最直接的思路就是让模型再学习⼀个参数\theta!这个\theta表⽰⽂本框的旋转⾓度,也就是我们最终要回归的参数从原来的(x,y,w,h)变成(x,y,w,h,\theta)。SegLink确实也采取了这个思路,除此之外,他还提出了Segment和Linking两个重要概念,这个才是这篇CVPR论⽂的核⼼创新点。
什么是gment?gment从中⽂上理解为⽂本⾏的⼀部分,这⼀部分可以是⼀个字符或⽂本⾏的任意⼀部分。如下图⽰,黄⾊框表⽰⼀个gment,⼀个完整的⽂本⾏中包含多个gment,每个sgment之间通过link(图中的绿⾊线)连接组合起来。那么Segment做⽂本检测的思路其实跟CTPN的思路很像,先检测⽂本⾏的⼀部分,再把他们连接起来构成⼀个完整⽂本⾏。
我们把图⽚的关键部位放⼤看看细节:⾸先每个gment是有⼀定的重合区域的,然后每两个gment连接的部位是两个gment的中⼼点。每⼀个gment和link仅依靠局部图像的纹理信息即可完成检测,⽽⽆需整张图像的信息。
接下来我们通过分析SegLink的⽹络架构进⼀步理解SegLink如何做到⾼效的多⾓度⽂本检测。下图是SegLink的⽹络架构,显然这个架构采取了SSD的思路,⾸先使⽤VGG16作为backbone进⾏特征提取,其中VGG16的全连接层(fc6,fc7)替换成卷积层(conv6,conv7),再接卷积层conv8到conv11。值得说明的是,conv4~conv11之间的尺⼨依次减少(每⼀层是前⼀层的1/2)。这个做法是为了做多尺度下的⽬标检测,即⼤的feature map擅长做⼩物体的检测,⽽⼩的feature map则擅长检
stimulsoft测⼤物体。借助多个不同尺度的feature map,从6个feature layer上检测gment和link,我们就可以检测出不同尺⼨的⽂本⾏了。
观察后⾯的卷积层可以发现,对不同层的feature map使⽤3×3的卷积层产⽣最终的输出(包括gment和link),不同特征层输出的维度是不⼀样的,因为除了conv4_3层外,其它层存在跨层的link。这⾥gment是text的带⽅向bbox信息(它可能是个单词,也可能是⼏个字符,总之是⽂本⾏的部分),link是不同gment的连接信息(⽂章将其也增加到⽹络中
英语四六级报名网址
⾃动学习)。
当所有gments都被检测出来后,我们就可以通过融合规则(combining gments),将各个feature map的gment的box信息和link信息进⾏融合,得到最终的⽂本⾏。
SegLink所使⽤的⽬标函数由三个部分构成,是否是text的⼆类分类的softmax损失,box的smooth L1 regression损失,是否link的⼆类的softmax损失。λ1和λ2控制权重,最后都设为1。
现在计算⼀下每个feature map输出的参数有哪些呢?
gment的位置信息:(x,y,w,h,\theta),⼀共5个参数
每个gment内的分类分数,即判断框内有字符还是⽆字符的分数(2分类),共2个参数
同层(within-layer)的每个gment的link的分数,表⽰该⽅向有link还是没link(2分类问题),⽽⼀个gment有⼋邻域所以有⼋个⽅向,参数⼀共有2×8=16相邻层(cross-layer)之间也存在link,同样是该⽅向有link还是没link(2分类问题),⽽link的个数是4个,所以参数总数为2×4=8
下图很清楚地表⽰出每个feature map输出的参数有多少个,输出参数总数为(2+5+16+8=31)。假设当前的feature map的尺度为(w,h),那么该层卷积后输出为w×h×31。
这⾥想再谈谈Within-Layer Link和Cross-Layer Link的作⽤。
within-layer link表⽰在同⼀层feature layer⾥,每个Segment与8邻域内的gment的连接状况,如下图(a)所⽰。且每个link有2维,⼀维是正分,表⽰两个gment属于同⼀⽂本,⼀维是负分,表⽰两个gment不属于同⼀⽂本。所以,每个predictor输出16(8×2)维向量。
cross-layer link:在不同的feature layer上有可能会检测到同⼀⽂本的gments,造成冗余,cross-la
yer link的提出就是为了解决这个问题。cross-layer link连接了两个相邻feature layer上的gments,如图(b)所⽰。需要注意的是,由于下采样使后⼀层为前⼀层scale的1/2,定义⼀个gment的cross-layer邻居为前⼀层4邻域更⼩的gment,即前⼀层是后⼀层的邻居,但后⼀层不是前⼀层的邻居,所以conv4_3的feature layer没有cross-layer邻居。图中所⽰的黄框为当前层的gment,蓝框为上⼀层更⼩更细的gment,绿⾊的线代表cross-layer link有连接,属于同⼀⽂本,在后续的combine算法中会将他们融合,即去除了冗余。
读到这⾥我们已经知道如何获取gment和相应的link了,那接下来要做的就是怎么把这些link和gment合并成⼀个完整的⽂本⾏。先贴⼀下论⽂中使⽤到的合并算法:
看起来真的是头都⼤,其实思想很简单,我尝试⽤中⽂解释⼀下:
1. 假设我们有⼀个集合B,⾥⾯有很多相关联的gment待合并;
2. 每⼀个gment都有⾃⼰的⾓度\theta,那我们求集合B中所有gment⾓度的平均值\theta_{b};
3. 求⼀条直线L使得所有gment的中⼼到这条直线的距离最⼩,也就是最⼩⼆乘法线性回归啦;
4. 每个gment的中⼼往直线L做垂直投影;
5. 从所有投影点中选出相距最远的两个点,记做(xp,yp)和(xq,yq);