首页 > 编程知识 正文

ctpn论文,ctpn网络

时间:2023-05-03 06:17:13 阅读:159071 作者:2307

1、一些资源

1.1、原始论文: https://arxiv.org/pdf/1609.03605.pdf

1.2、一些熟练的中文博客,可以先看中文博客再看原论文:

3359 blog.csdn.net/z Chang 81/article/details/78873347

3359 blog.csdn.net/sigai _ csdn/article/details/80800131

3359 Zhan.zhi Hu.com/p/34757009

3359 Zhan.zhi Hu.com/p/43145228

http://www.neurta.com/node/390

1.3、代码(tf版及caffe版):https://github.com/ycg 09/Chinese _ ocr

33559 github.com/tianzhi 0549/ctpn

2、论文解读

2.1算法效果

首先分析文本检测的特征。 文本检测与通用目标检测不同的——文本线为一个sequence (一个由字符、字符的一部分、多个字符组成的sequence ),通用目标检测并非只有一个独立的目标。 要检测完整的文本线,同一文本线上的字符差异很大,可能会有距离,作为整体检测比单一目标难度更大——。 因此,作者认为文本的垂直位置(文本bounding box的上下边界)比水平位置(文本bounding box的左右边界)更容易预测,ctpn的亮点1,创新性地提出了veer,另外,同一文本线上的不同文字相互由于可以用sequence的方法例如RNN表示,所以将高亮2、lstm导入网络,进而与cnn无缝对接,发挥lstm的存储作用,从前后的anchor序列中提取这种相互关系的特征,将fc层首先通过上图的图像感受ctpn的效果,然后具体看数字的正确比较。 如下所示。

2.2算法配置

先看图,接下来说明该算法整体的结构图

1、在VGG16的前5个conv stage (直到con V5 )中得到featuremap ) w*h*c ),其中c是特征图的个数为512

2、在Conv5的feature map的每个位置取3*3*512*512([filter_height,filter_width,in_channels,out_channels] )

的窗口进行卷积,得到W*H*512的特征图。 这些特征用于预测该位置的k个anchor(anchor的定义与Faster RCNN类似)对应的类别和位置信息。

3、将通过每行3*3*512的卷积获得的512维特征向量输入到双向lstm。 lstm的隐含层节点数为128,双向为256。 如果不考虑batchsize,则为、

总共H*W个512维特征向量进入双向lstm,w也表示与时间序列相似。 输出为128,两个lstm之一从1张到w,另一个以从w到1的顺序输入到lstm。 最终BLSTM得到256维的特征,在将短边缩放为600的情况下,各有一个lstm0.14s,有没有lstm的

4、最后连接两个光纤通道。 fc的输入是BLSTM的输出256D的特征,输出为512D,共有H*W个。 请注意,有些代码是使用fc为1*1的卷积实现的。 1*1卷积可以减少参数,但效果几乎没有区别。 (

其中第一个fc计算bbox,bbox应该是h*w*4,由于在ctpn中只预测了h和y的值,因而只有h*w*2。 第二个fc计算score,分别表示背景score和作为文本的score,损失函数是softmax loss

ctpn的num_anchors(k )=10在整个图像中有w*h*num_anchors*2两个score和coordinate。 这里默认每个anchor的width为16 (请参阅)

细长矩形,它们的宽度是一定的,都是16。所以,每次在做训练之前先要把标注的文本行变成16宽的小框,ctpn的代码里面有这个脚本。高度从11~283(每次除以0.7),Anchor必须是对应原图尺度!

这样看来side-refinement并没有在代码里面实现,但是在后面论文里面的loss里面有体现

当然anchor_scale也可以设置成宽度为[8,16,32]这种多尺度的情况,那么每个像素点的num_anchors(k)=30了。

回归的高度h及中心坐标y,和gt(带*)的高度h和中心坐标y的计算方式如下,带a的表示是anchor,损失函数是smooth L1:

score阈值设置:0.7 (+NMS),

5、用文本线构造算法,把分类得到的文字的proposal(上中的细长的矩形,score>0.7)合并成文本线。

主要思想:每两个相近的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

固定要regression的box的宽度和水平位置会导致predict的box的水平位置不准确,所以作者引入了side-refinement,用于水平位置的regression,损失函数是smooth L1函数

where xside is the predicted x-coordinate of the nearest horizontal side (e.g., left or right side) to current anchor. x∗ side is the ground truth (GT) side coordinate in x-axis, which is pre-computed from the GT bounding box and anchor location. cax is the center of anchor in x-axis. wa is the width of anchor, which is fixed, wa = 16 

作者解释,side-proposals被定义为开始和结束提议,仅使用side-proposal的偏移量来细化最终的文本行边界框。 side-refinement进一步提高了定位精度,使得SWT和 Multi-Lingual datasets的性能提高约2%。 另外,作者说在第一张图里面的模型结构中同时预测了side-refinement的偏移量,它不是通过额外的后处理步骤计算出来的,这一点体现在loss function里,但是代码中并没有这部分,可能代码是爱好者写的,并不是作者的源代码,所以会有出入,后面的loss function的补充里面有说明这一点。

具体详细如何做的,可以参考的http://www.neurta.com/node/390,写的比较详细

有side-refinement和没有side-refinement的对比:

下图是整个ctpn结构的代码部分,可以帮助理解

补充:

模型的loss function

 

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(score>0.7),或者与Groud truth vertical IoU>0.5。smooth L1第三部分side-refinement:这部分是比较迷糊人的,因为在tf版的代码里面并没有实现,取而代之的是regular L2损失,在论文里面的loss里面则是side-refinement损失,smooth L1,k是最左侧或者最右侧的side-proposal的index,后续可以加入这部分的loss看一下效果

 ,  是各任务的权重系数,  ,  ,  是归一化参数,表示对应任务的样本数量。

训练细节

每个minibatch同样采用“Image-centric”的采样方法,每次随机取一张图片,然后在这张图片中采样128个样本,并尽量保证正负样本数量的均衡。卷积层使用的是Image-Net上无监督训练得到的结果,权值初始化使用的是均值为0,标准差为0.01的radhs分布。SGD的参数中,遗忘因子是0.9,权值衰减系数是0.0006。前16k次迭代的学习率是0.001,后4k次迭代的学习率是0.0001。

由于加入LSTM,所以CTPN对水平文字检测效果超级好。CTPN加入了双向LSTM学习文字的序列特征,有利于文字检测。但是引入LSTM后,在训练时很容易梯度爆炸,需要小心处理。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。