Task
- 看懂ctpn原理并能概述
- 初步看源码,为以后能做框架更换
Reference
概述
本篇基本是搬运哒,建议参见Reference
首先放一张流程图~
注:“FC”不是全连层,是卷积层,获得的张量也不是linear的,
流程共可分为6步:
首先VGG提取特征,获得大小为 的conv5 feature map。
注:C 为颜色通道数
之后在conv5上做 的滑动窗口,即每个点都结合周围 区域特征获得一个长度为 的特征向量。输出 的feature map,该特征显然只有CNN学习到的空间特征。这些特征将用于预测该位置k个anchor对应的类别信息,位置信息。
- 再将这个feature map进行Reshape
- 然后以 且最大时间长度 的数据流输入双向LSTM,学习每一行的序列特征。双向LSTM输出 ,再经Reshape恢复形状:
该特征既包含空间特征,也包含了LSTM学习到的序列特征。
然后经过“FC”卷积层,变为 的特征
最后经过类似Faster R-CNN的RPN网络,获得text proposals
第6步展开:
1
2
3
4
5
6
7
8
9- ①fc层特征输入两个分类或者回归层中。
第二个2k scores 表示的是k个anchor的类别信息(是字符或不是字符),并赋予标签rpn_cls_score。
第一个4k vertical coordinate是用来回归k个anchor的位置信息,并赋予标签rpn_bbox_pred,分别是四个坐标值。此时将4k个vertical coordinate 与第一步得到的坐标做回归。
- ②给每个anchor上标签,并计算真值,以及内部权重和外部权重。最终得到rpn_cls_score,gt_boxes,gt_ishard,dontcare_areas,im_info并记录不同的损失函数用于下一次学习。
- ③将上一部得到的score进行softmax,并得到0-1之间的得分,然后利用reshape将shape从(1,H,W,A*2)变为(1,H,W*A,2).
可能疑惑点
- conv5 feature map如何从 变为
为何使用双向LSTM
CNN学习的是感受野内的空间信息,LSTM学习的是序列特征。对于文本序列检测,显然既需要CNN抽象空间特征,也需要序列特征(毕竟文字是连续的)。双向LSTM可以捕捉句子前向后向的信息
e.g.
1
我的手机坏了,我打算____一部新手机。
假设使用LSTM对空白部分填词。如果只看横线前面的词,“手机坏了”,那么“我”是打算“修”还是“买”还是“大哭一场”?双向LSTM能看到后面的词是“一部新手机“,那么横线上的词填“买“的概率就大得多了。显然对于文字检测,这种情况也依然适用。
如何通过FC层输出产生图2-b中的Text proposals
概述见流程,这里再放一个示意图
具体RPN网络与Faster R-CNN完全一样,所以不再介绍,只分析不同之处。
竖直Anchor定位文字位置
1
2
3
4
5
6
7
8
9
10===========================================================
概述:
采用了一组(10个)等宽度的Anchors
===========================================================
注意点:
conv5 feature map的宽高都是输入Image的宽高的 1/16 ,同时fc与conv5 width和height都相等
===========================================================
作用:
1.保证在 x 方向上,Anchor覆盖原图每个点且不相互重叠。
2.不同文本在 y 方向上高度差距很大,所以设置Anchors高度为11-283,用于覆盖不同高度的文本目标。
如何通过Text proposals确定最终的文本位置,即文本线构造算法
详细请见此,讲的非常好,例子一看就懂的
`构造文本线示意图`
**关键词提要**: 先正向后反向最后对比score
Loss
分为三部分,类似于RPN,但又有所区别,搬运:
Anchor Softmax loss:该Loss用于监督学习每个Anchor中是否包含文本。 表示是否是Groud truth。
Anchor y coord regression loss:该Loss用于监督学习每个包含为本的Anchor的Bouding box regression y方向offset,类似于Smooth L1 loss。其中 是 中判定为有文本的Anchor,或者与Groud truth vertical IoU>0.5。
Anchor x coord regression loss:该Loss用于监督学习每个包含文本的Anchor的Bouding box regression x方向offset,与y方向同理。前两个Loss存在的必要性很明确,但这个Loss有何作用作者没有解释(从训练和测试的实际效果看,作用不大)
注意点
搬运:
由于加入LSTM,所以CTPN对水平文字检测效果超级好。
因为Anchor设定的原因,CTPN只能检测横向分布的文字,小幅改进加入水平Anchor即可检测竖直文字。但是由于框架限定,对不规则倾斜文字检测效果非常一般。
CTPN加入了双向LSTM学习文字的序列特征,有利于文字检测。但是引入LSTM后,在训练时很容易梯度爆炸,需要小心处理。
源码分析
源码来自【Github】keras复现场景文本检测网络CPTN
作者太感人了,写的挺好懂~