ctpn文字检测定位学习笔记

Task

  • 看懂ctpn原理并能概述
  • 初步看源码,为以后能做框架更换

Reference

概述

本篇基本是搬运哒,建议参见Reference

首先放一张流程图~流程图

注:“FC”不是全连层,是卷积层,获得的张量也不是linear的,

流程共可分为6步:

  • 首先VGG提取特征,获得大小为 N \times C\times H\times W 的conv5 feature map。

    注:C 为颜色通道数

  • 之后在conv5上做 3×3 的滑动窗口,即每个点都结合周围 3×3 区域特征获得一个长度为 3×3×C 的特征向量。输出 N \times9C\times H\times W 的feature map,该特征显然只有CNN学习到的空间特征。这些特征将用于预测该位置k个anchor对应的类别信息,位置信息。

  • 再将这个feature map进行Reshape

\text{Reshape:} \ N\times 9C\times H \times W \rightarrow (NH) \times W \times 9C\\

  • 然后以 \text{Batch}=NH 且最大时间长度 T_\text{max}= W 的数据流输入双向LSTM,学习每一行的序列特征。双向LSTM输出 (NH) \times W\times 256 ,再经Reshape恢复形状:

\text{Reshape:}\  (NH)  \times W \times 256\rightarrow N \times256\times H\times W\\

该特征既包含空间特征,也包含了LSTM学习到的序列特征。

  • 然后经过“FC”卷积层,变为 N \times512\times H\times W 的特征

  • 最后经过类似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如何从N \times C\times H\times W 变为N \times9C\times H\times W
  • 为何使用双向LSTM

    CNN学习的是感受野内的空间信息,LSTM学习的是序列特征。对于文本序列检测,显然既需要CNN抽象空间特征,也需要序列特征(毕竟文字是连续的)。双向LSTM可以捕捉句子前向后向的信息

    e.g.

    1
    我的手机坏了,我打算____一部新手机。

    假设使用LSTM对空白部分填词。如果只看横线前面的词,“手机坏了”,那么“我”是打算“修”还是“买”还是“大哭一场”?双向LSTM能看到后面的词是“一部新手机“,那么横线上的词填“买“的概率就大得多了。显然对于文字检测,这种情况也依然适用。

  • 如何通过FC层输出产生图2-b中的Text proposals

    概述见流程,这里再放一个示意图

    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确定最终的文本位置,即文本线构造算法

    详细请见,讲的非常好,例子一看就懂的

    `构造文本线示意图`
    

    proposals

    **关键词提要**: 先正向后反向最后对比score
    

Loss

分为三部分,类似于RPN,但又有所区别,搬运:

  • Anchor Softmax loss:该Loss用于监督学习每个Anchor中是否包含文本。 s_i^*=\{0,1\} 表示是否是Groud truth。

  • Anchor y coord regression loss:该Loss用于监督学习每个包含为本的Anchor的Bouding box regression y方向offset,类似于Smooth L1 loss。其中 v_js_i 中判定为有文本的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

作者太感人了,写的挺好懂~