文本检测算法CTPN
Detecting Text in Natural Image with Connectionist Text Proposal Network
OCR的第一步是文本检测,首先要定位文字的位置,即文字检测,CTPN是文本检测领域经典算法。
论文地址:https://arxiv.org/abs/1609.03605
CTPN是在ECCV 2016提出的一种文字检测算法。CTPN结合CNN与LSTM深度网络,能有效的检测出复杂场景的横向分布的文字,效果如图1,是目前比较好的文字检测算法。由于CTPN是从Faster RCNN改进而来,本文默认读者熟悉CNN原理和Faster RCNN网络结构。
主要创新点
- 文本检测可以当层目标检测来做,Faster RCNN有效果,但是长宽比不好设定,文本长宽变化很大,不好检测,所以将将大的文本框切分为一系列宽度固定的小文本框进行检测,这样在检测过程中只需要对文本的高度进行先验性的设置anchor。
- 作者认为文本具有时序性,即和阅读习惯一直,从左到右。因此作者加入RNN获取这种语义性。
- 后处理算法:文本连接算法
标签构造
如上图所示,给定一个文本的标注框,这里为(x, y, w, h)。作者沿着水平方向进行切分,偏移为16个像素。这样就得到了一系列的文本小片。这里左右标记为红色的小片,作者将他们(落在左右两端50像素以内的小片)作为side refinement时候的标签,用来约束网络对文本起始和终止点的矫正。至于这里取偏移为16的原因,是因为conv5的stride为16,相当于feature map中的一个像素对应标签的16的宽度。当然,这里关于感受野,conv5中的感受野为228x228,因此文本行anchor的高度最大不能超过228,如果超出则网络不能很好的进行预测。
CTPN网络结构
原始CTPN只检测横向排列的文字。CTPN结构与Faster R-CNN基本类似,但是加入了LSTM层。假设输入为B张图片
- 首先VGG提取特征,获得大小为 BxCxHxW的conv5 feature map。
- 之后在conv5上做 [公式] 的滑动窗口,即每个点都结合周围3x3区域特征获得一个长度为 [公式] 的特征向量。输出 Bx9CxHxW的feature map,该特征显然只有CNN学习到的空间特征。 注意这一步不是卷积,没有计算过程。
- 再将这个feature map进行Reshape
Nx9CxHxW ->(NH)xWx9C - 然后以 Batch=NH且最大时间长度 的数据流输入双向LSTM,学习每一行的序列特征。双向LSTM输出 [公式] ,再经Reshape恢复形状:
该特征既包含空间特征,也包含了LSTM学习到的序列特征。 - 然后经过“FC”卷积层,变为 [公式] 的特征
- 最后经过类似Faster R-CNN的RPN网络,获得text proposals,如图2-b。
为何使用双向LSTM?
文本线构造算法
在上一个步骤中,已经获得了图7所示的一串或多串text proposal,接下来就要采用文本线构造办法,把这些text proposal连接成一个文本检测框。
再反向寻找:
- 沿水平负方向,寻找和 [公式] 水平距离小于50的候选Anchor
- 从候选Anchor中,挑出与 [公式] 竖直方向 [公式] 的Anchor
- 挑出符合条件2中Softmax score最大的 [公式]
最后对比 [公式] 和 [公式] :
如果 [公式] ,则这是一个最长连接,那么设置 [公式]
如果 [公式] ,说明这不是一个最长的连接(即该连接肯定包含在另外一个更长的连接中)。
训练策略
由于作者没有给出CTPN原始训练代码,所以此处仅能根据论文分析。
明显可以看出,该Loss分为3个部分:
- Anchor Softmax loss:该Loss用于监督学习每个Anchor中是否包含文本。 [公式] 表示是否是Groud truth。
- Anchor y coord regression loss:该Loss用于监督学习每个包含为本的Anchor的Bouding box regression y方向offset,类似于Smooth L1 loss。其中 [公式] 是 [公式] 中判定为有文本的Anchor,或者与Groud truth vertical IoU>0.5。
- Anchor x coord regression loss:该Loss用于监督学习每个包含文本的Anchor的Bouding box regression x方向offset,与y方向同理。前两个Loss存在的必要性很明确,
说明一下,在Bounding box regression的训练过程中,其实只需要注意被判定成正的Anchor,不需要去关心杂乱的负Anchor。这与Faster R-CNN类似。
总结
- 由于加入LSTM,所以CTPN对水平文字检测效果超级好。
- 因为Anchor设定的原因,CTPN只能检测横向分布的文字,小幅改进加入水平Anchor即可检测竖直文字。但是由于框架限定,对不规则倾斜文字检测效果非常一般。
- CTPN加入了双向LSTM学习文字的序列特征,有利于文字检测。但是引入LSTM后,在训练时很容易梯度爆炸,需要小心处理。
改进思路
CTPN中的双向LSTM过于笨重,因此我们需要思考如何替代它。发现有人使用conv1x7替代双向LSTM,实验可行。
CTPN的算法虽然是2016的算法,但是其针对水平长行的检测现在也是工业级的,算法鲁棒。而这个算法也是文字检测领域对RPN的应用之一。CTPN就讲解这么多,具体还需要阅读论文,阅读代码。