无痛的CPTN

CTPN算法背景

水平行文本

CTPN算法的提出,出于以下几点:

  • 假设文本是水平的

  • 文本可以看做由每一个"字母“组成的。这里的字母可以认为是小片段

之所以有这样的想法,是因为基于通用目标检测的算法难以适应文字检测的场景,如上图中的文字,长度方面变化幅度很大。因此作者将文本在水平方向解耦,分成每一个小片,然后将文本行的检测转化为小片的检测,最后利用规则将属于同一水平行的小片组合成文本行。化繁为简。

CTPN创新点

RPN v.s. CTPN

CTPN的创新点主要由以下三点:

  • 将文本行拆分为slice进行检测,这样在检测过程中只需要对文本的高度进行先验性的设置anchor。

  • 作者认为文本具有时序性,即和阅读习惯一直,从左到右。因此作者加入RNN获取这种语义性。

  • 后处理算法:文本连接算法

CTPN与RPN网络结构的差异

灵魂画手版本网络结构

如上图所示,作图为RPN,右图为CTPN的网络结构。可以看到,CTPN本身就是RPN,唯一不同的是加入了双向LSTM获取时序方向的信息,使得模型可以序列性的预测文本的小片。当然这里的不同之处主要有以下几点:

  • 双向LSTM对文本行方向编码

  • 标签构造方式不同:CTPN使用水平方向的切片框作为回归目标

具体还需根据以下图进行理解:

具体网络结构

CTPN的整体结构:

  • 骨干网络为VGG16,其输出为conv5层的输出,stride为16。也就是featur map中的一个像素对应原图的16像素。

  • feature map编码输入BLSTM。对于conv5的输出(N, C, H, W), W方向作为时序方向,因此需要reshape得到(N, W, H*C)作为LSTM的输入。

  • BILSTM的输出输入至FC中,最终模型三个输出:文本小片的坐标偏移(y, h)。这里作者没有对起始坐标进行预测,因为这部分在标签构造过程有固定的偏移,因此只需要知道文本的y, h,利用固定的偏移可以构造出完整的文本行。

  • 边界校准:因为模型没有对文本的起始做约束,因此会存在文本头和尾的小片的预测会多多少少的超出来。因此需要做小部分的微调。

标签构造

标签构造

如上图所示,给定一个文本的标注框,这里为(x, y, w, h)。作者沿着水平方向进行切分,偏移为16个像素。这样就得到了一系列的文本小片。这里左右标记为红色的小片,作者将他们(落在左右两端50像素以内的小片)作为side refinement时候的标签,用来约束网络对文本起始和终止点的矫正。至于这里取偏移为16的原因,是因为conv5的stride为16,相当于feature map中的一个像素对应标签的16的宽度。当然,这里关于感受野,conv5中的感受野为228x228,因此文本行anchor的高度最大不能超过228,如果超出则网络不能很好的进行预测。

网络输出

网络输出

其中,竖直方向坐标的构造如下面式子所示:

这里C为anchor的中心坐标,h为anchor的高度。上下两行分别对应预测值与anchor的相对位置,真值与anchor的相对位置。

边界anchor的矫正:

side refinement

除了所有的小片回归y, h;其中红色的anchor还需额外的回归水平坐标x,式子如下:

原理与上述竖直方向的计算方式类似,只针对处于边界的anchor进行计算。

后处理算法:文本线构造

文本线构造方法

文本线的图参考至知乎专栏https://zhuanlan.zhihu.com/p/34757009。

小结

CTPN中的双向LSTM过于笨重,因此我们需要思考如何替代它。发现有人使用conv1x7替代双向LSTM,亲手实验了一下,以上是效果图。CTPN的算法虽然是2016的算法,但是其针对水平长行的检测现在也是工业级的,算法鲁棒。而这个算法也是文字检测领域对RPN的应用之一。CTPN就讲解这么多,具体还需要阅读论文,阅读代码。

代码链接以及文章链接如下:

arxiv.org/abs/1609.03…

github.com/tianzhi0549

github.com/eragonruan/…