文本检测模型之CTPN

文本检测模型之CTPN

思路

  1. 将文本定位框拆分成一个个等宽(论文中为16)的小文本框,然后只需在y方向上做回归。这里仍然使用了rpn(可看faster rcnn),唯一不同的是这里得到的候选区域(region proposal )是一个等宽不等高的。这种小文本框也规避了网络感受野不足的问题。
  2. 使用了cnn+rnn的组合,这里加入rnn使得宽度方向上或者说水平方向上形成一种联系(长短时记忆),所以即使文字间距较大,也能将文本连起来。(对长文本尤其是字符间距过大的文本效果友好)
  3. 通过网络及一系列处理后得到等宽的小文本框,然后将小文本框根据一定规则合并成大文本框
  4. 由于设置成等宽小文本框,如果不对x方向进行回归,那么合并后的文本框边缘可能是不太精细的,所以论文中又提出了边界精修(Side-refinement),文中提到这里的x回归只用两侧的锚框来做,来修正边缘。回归方式与回归y一毛一样。

优缺点

优点:

  1. 对水平文本效果很好,比较鲁棒,通过改变后处理的锚框合并方式也可处理10度以内的倾斜文本
  2. 对长文本尤其是字距过大的长文本效果好。

缺陷:

  1. 对于角度较大的的文本,效果一字谓之曰:“炸”,尤其对于密集型倾斜文本。
  2. 有时侯会出现水平方向粘连问题,将两个你想分开的文本连在一起。

实现过程

论文中basenet用的是vgg16,整体的流程如图:
文本检测模型之CTPN
首先图片假设resize成了长1200,宽608,即1200608,经过vgg16卷积后,由于有4个stride为2 的pooling,那么在conv5后输出的map大小为(1200/16)(608/16)= 7538,然后接一个33的卷积,map大小依旧不变仍为7538,然后在进入rnn后在输出结果上用三个11的卷积分别输出2K个y方向的回归结果,2K个文本非文本的分类结果,K个的x方向上的回归结果,其中K为一个预测点上设置的anchor的个数,由于是在7538个点上回归,那么一共就有7538K个anchor,论文中K为10,那么就有7538*10=28500个anchor,得到这些anchor后,就需要对这些anchor打上标签(文本与非文本即1和0)。

如何标定正负样本

标定正样本:

方式一:与gt(事先将标注好的框处理成定宽的小文本框,假设一个6412的框可以得到4个1612的小文本框,这些小文本框就是gt)的交叠面积大于0.7的标记为正样本
方式二:与每个gt交叠最大的一个anchor标记为正样本(为啥还要用方式二,因为只用方式一,生成的anchor与gt的交叠面积万一很少有达到0.7的,导致正样本稀少,难以训练)

标定负样本:

与gt交叠面积小于0.3 的标记为负样本。

Loss函数

文本检测模型之CTPN
共分成三个,第一个监督文本与非文本分类,第二个回归y方向上的坐标,第三个回归x方向上的坐标用来修正边缘,其中带星为gt参数,λ1=1,λ2=2λ_1=1,λ_2=2

文本线构造算法

主要思想:每两个相近的proposal组成一个pair,合并不同的pair直到无法再合并为止(没有公共元素)
判断两个proposal,Bi和Bj组成pair的条件:

  1. Bj->Bi, 且Bi->Bj。(Bj->Bi表示Bj是Bi的最好邻居)
  2. Bj->Bi条件1:Bj是Bi的邻居中距离Bi最近的,且该距离小于50个像素
  3. Bj->Bi条件2:Bj和Bi的vertical overlap大于0.7

一些小细节

  1. k个anchor的设置如下:宽度都是16像素,高度从11~273像素变化(每次乘以1.4)
  2. 这里只回归y方向上的坐标,说是坐标其实是一组比较参数,计算方式:
    文本检测模型之CTPN

其中有星号的代表gt计算的参数,带a的代表anchor的参数
3. Side-refinement用来回归修正边缘的精确度,计算方式:
文本检测模型之CTPN

论文和代码

论文:https://arxiv.org/pdf/1609.03605.pdf
代码:tf版本,tf版本的ctpn
我根据这个tf版本改的pytorch版本,对pytorch感兴趣的可以看看,效果不错:我的pytorch_ctpn

目前有个新思路,之后会有个ctpn的改进版本。