CTPN算法背景
水平行文本CTPN算法的提出,出于以下几点:
-
假设文本是水平的
-
文本可以看做由每一个"字母“组成的。这里的字母可以认为是小片段
之所以有这样的想法,是因为基于通用目标检测的算法难以适应文字检测的场景,如上图中的文字,长度方面变化幅度很大。因此作者将文本在水平方向解耦,分成每一个小片,然后将文本行的检测转化为小片的检测,最后利用规则将属于同一水平行的小片组合成文本行。化繁为简。
CTPN创新点
RPN v.s. CTPNCTPN的创新点主要由以下三点:
-
将文本行拆分为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就讲解这么多,具体还需要阅读论文,阅读代码。
代码链接以及文章链接如下:
https://arxiv.org/abs/1609.03605
https://github.com/tianzhi0549
https://github.com/eragonruan/text-detection-ctpn
欢迎关注微信公众号 10分钟深度学习,每天10分钟阅读深度学习
网友评论