文本检测模型之CTPN
思路
- 将文本定位框拆分成一个个等宽(论文中为16)的小文本框,然后只需在y方向上做回归。这里仍然使用了rpn(可看faster rcnn),唯一不同的是这里得到的候选区域(region proposal )是一个等宽不等高的。这种小文本框也规避了网络感受野不足的问题。
- 使用了cnn+rnn的组合,这里加入rnn使得宽度方向上或者说水平方向上形成一种联系(长短时记忆),所以即使文字间距较大,也能将文本连起来。(对长文本尤其是字符间距过大的文本效果友好)
- 通过网络及一系列处理后得到等宽的小文本框,然后将小文本框根据一定规则合并成大文本框
- 由于设置成等宽小文本框,如果不对x方向进行回归,那么合并后的文本框边缘可能是不太精细的,所以论文中又提出了边界精修(Side-refinement),文中提到这里的x回归只用两侧的锚框来做,来修正边缘。回归方式与回归y一毛一样。
优缺点
优点:
- 对水平文本效果很好,比较鲁棒,通过改变后处理的锚框合并方式也可处理10度以内的倾斜文本
- 对长文本尤其是字距过大的长文本效果好。
缺陷:
- 对于角度较大的的文本,效果一字谓之曰:“炸”,尤其对于密集型倾斜文本。
- 有时侯会出现水平方向粘连问题,将两个你想分开的文本连在一起。
实现过程
论文中basenet用的是vgg16,整体的流程如图:
首先图片假设resize成了长1200,宽608,即
1200
∗
608
1200*608
1200∗608,经过vgg16卷积后,由于有4个stride为2 的pooling,那么在conv5后输出的map大小为
(
1200
/
16
)
∗
(
608
/
16
)
=
75
∗
38
(1200/16)*(608/16)= 75*38
(1200/16)∗(608/16)=75∗38,然后接一个
3
∗
3
3*3
3∗3的卷积,map大小依旧不变仍为
75
∗
38
75*38
75∗38,然后在进入rnn后在输出结果上用三个
1
∗
1
1*1
1∗1的卷积分别输出2K个y方向的回归结果,2K个文本非文本的分类结果,K个的x方向上的回归结果,其中K为一个预测点上设置的anchor的个数,由于是在
75
∗
38
75*38
75∗38个点上回归,那么一共就有
75
∗
38
∗
K
75*38*K
75∗38∗K个anchor,论文中K为10,那么就有
75
∗
38
∗
10
=
28500
75*38*10=28500
75∗38∗10=28500个anchor,得到这些anchor后,就需要对这些anchor打上标签(文本与非文本即1和0)。
如何标定正负样本
标定正样本:
方式一:与gt(事先将标注好的框处理成定宽的小文本框,假设一个64*12的框可以得到4个
16
∗
12
16*12
16∗12的小文本框,这些小文本框就是gt)的交叠面积大于0.7的标记为正样本
方式二:与每个gt交叠最大的一个anchor标记为正样本(为啥还要用方式二,因为只用方式一,生成的anchor与gt的交叠面积万一很少有达到0.7的,导致正样本稀少,难以训练)
标定负样本:
与gt交叠面积小于0.3 的标记为负样本。
Loss函数
共分成三个,第一个监督文本与非文本分类,第二个回归y方向上的坐标,第三个回归x方向上的坐标用来修正边缘,其中带星为gt参数,
λ
1
=
1
,
λ
2
=
2
λ_1=1,λ_2=2
λ1=1,λ2=2
文本线构造算法
主要思想:每两个相近的proposal组成一个pair,合并不同的pair直到无法再合并为止(没有公共元素)
判断两个proposal,Bi和Bj组成pair的条件:
- Bj->Bi, 且Bi->Bj。(Bj->Bi表示Bj是Bi的最好邻居)
- Bj->Bi条件1:Bj是Bi的邻居中距离Bi最近的,且该距离小于50个像素
- Bj->Bi条件2:Bj和Bi的vertical overlap大于0.7
一些小细节
- k个anchor的设置如下:宽度都是16像素,高度从11~273像素变化(每次乘以1.4)
- 这里只回归y方向上的坐标,说是坐标其实是一组比较参数,计算方式:
其中有星号的代表gt计算的参数,带a的代表anchor的参数
3. Side-refinement用来回归修正边缘的精确度,计算方式:
论文和代码
论文:https://arxiv.org/pdf/1609.03605.pdf
代码:tf版本,tf版本的ctpn
我根据这个tf版本改的pytorch版本,对pytorch感兴趣的可以看看,效果不错:我的pytorch_ctpn
部分结果如下:
上图中,第一幅图没加side refinement,第二幅图加了side refinement,加了之后文本框会收的更紧一些。
目前有个新思路,之后会有个ctpn的改进版本。