文本检测算法之CTPN 学习笔记

现有的文本检测方法主要有两大类,一种是基于回归框的检测方法(基于物体检测的方法),如CTPN,EAST,这类方法很难检测任意形状的文本(曲线文本), 一种是基于像素的分割检测器(基于实例分割的方法),这类方法很难将彼此非常接近的文本实例分开,包括PSENet。
文本检测算法之CTPN 学习笔记_第1张图片

1.概述

在2015年Faster R-CNN在物体检测上提供了非常好的算法框架。所以用深度学习的思想解决场景文字检测自然而然的成为研究热点。
Faster R-CNN做目标检测步骤:
文本检测算法之CTPN 学习笔记_第2张图片

  1. 基础网络做特征提取;
  2. 特征送入RPN做候选框提取;
  3. 分类层对候选框内物体进行分类,回归层对候选框的(x,y,w,h)进行精细调整。

详细介绍看这里:https://zhuanlan.zhihu.com/p/31426458

对比发现,场景文字检测和物体检测存在显著的不同之处:

  • 文本大多数以长矩形形式存在,即长宽比一般较大或较小,这与普通的目标检测中的物体不一样
  • 场景文字检测有明显的边界,例如Wolf 准则 [2],而物体检测的边界要求较松,一般IoU为0.7便可以判断为检测正确;
  • 场景文字检测有明显的序列特征,而物体检测没有这些特征;
  • 和物体检测相比,场景文字检测含有更多的小尺寸的物体。

针对以上特点,CTPN《Detecting Text in Natural Image with Connectionist Text Proposal Network》做了如下优化:

  • 在CTPN中使用更符合场景文字检测特点的锚点;
  • 针对锚点的特征使用新的损失函数;
  • RNN(双向LSTM)的引入用于处理场景文字检测中存在的序列特征;
  • Side-refinement的引入进一步优化文字区域。

2.CTPN网络设计

文本检测算法之CTPN 学习笔记_第3张图片
假设输入N张图片:

  • 首先使用VGG16提取特征,获得conv5_3的输出特征作为feature map,大小为N* C* H* W;(C=512)
  • 使用大小3x3,步长为1的滑窗,在feature map上每个点结合周围3x3区域获得一个3x3xC的特征向量,输出Nx9CxHxW的featur map(在这个特征图基础上计算锚点),该特征显然只有CNN学习到的空间特征;
  • 对feature map 进行reshape,即每一行(共N*H行)得到W个9C维的特征向量:
    在这里插入图片描述
  • 总共分为N*H个batch,每个batch为最大时间长度T_max=W的数据流输入双向LSTM,学习每一行的序列特征。每个LSTM层是128个隐层,输入(NH) *W *9C输出(NH) *W *128,Reverse-LSTM同样得到的是(NH) *W *128,合并后双向LSTM输出(NH) *W *256,再经Reshape恢复形状:
    在这里插入图片描述
    该特征既包含空间特征,也包含了LSTM学习到的序列特征。
  • 经过FC层,输出N * 512 * W * H的特征
  • 最后经过类似Faster R-CNN的RPN网络,获得text proposals。
    文本检测算法之CTPN 学习笔记_第4张图片
    左边分支用于bounding box regression。由于fc输出feature map每个点配备了10个Anchor,每个anchor只回归中心y坐标与高度h两个值,所以rpn_bboxp_red有20个channels。
    右边分支用于Softmax分类anchor是否包含文本,所以也是20个channels。
    FC层特征输入到三个分类或者回归层中。(k=10,fc输出feature map每个点对应10个Anchor)
    • 第一个2k vertical coordinate用于预测候选区域的起始坐标y和高度h;
    • 第三个k side-refinement输出的side-refinement的偏移(offset)预测;
      这两个共同用来回归k个anchor的位置信息(可以简单理解为是要确定字符位置的小的矩形框,上面示意图中的红色小长框,宽度固定,默认为16)。
    • 第二个2k scores 表示的是k个anchor的类别信息(是字符或不是字符)。
  • 使用文本构造算法,将得到的一组竖直条状text proposal合并成文本的序列框。
    通过CTPN可以得到候选区域的的得分,如果判定为文本区域的得分大于阈值0.7,则该区域用来构造文本行。文本行是由一系列大于0.7的候选区域的邻居对构成的。如果区域A是区域B的邻居对,需要满足如下条件:
    • A是距离B最近的正文本区域;
    • A和B的距离小于设定阈值(50)个像素值;
    • A和B的竖直方向的重合率大于设定阈值(0.7)。

3.锚点机制

显然,文本区域检测和物体检测最大的区别是文本区域是一个序列。而在目前的神经网络中,RNN在处理序列数据上占有垄断性的优势地位。在RNN的训练过程中,数据是以时间片为单位输入到模型中的。所以,如何将文本区域变成可以序列化输入的顺序成为了CTPN一个重要的要求。
文本检测算法之CTPN 学习笔记_第5张图片
如图所展示的,每一个蓝色矩形是一个锚点,那么一个文本区域便是由一系列宽度固定,紧密相连的锚点构成。所以,CTPN有如下的锚点设计机制:

由于CTPN是使用的VGG-16进行特征提取,VGG-16经过4次max pooling的降采样,得到的feature_stride=16,即在conv5_3的feature map上步长为1的滑窗相当于在输入图像上步长为16的滑窗。所以,根据VGG-16的网络结构,CTPN的锚点宽度w必须为16,所以,每次在做训练之前先要把标注的文本行变成16宽的小框。
对于一个输入序列中的所有锚点,如果我们能够判断出锚点的正负,把这一排正锚点连在一起便构成了文本区域,因此锚点的起始坐标X也不用预测,网络只需要预测锚点的起始Y坐标以及锚点的高度h即可(即垂直方向的坐标和尺度)。
在RPN网络中,一个特征向量对应的多个尺寸和比例的锚点,同样的,CTPN也对同一个特征向量设计了10个锚点。在CTPN中,锚点的高度依次是[11,16,23,33,48,68,97,139,198,283],即高度每次除以0.7。Anchor对应的是原图尺度。

4.损失函数

CTPN使用的是Faster R-CNN的近似联合训练,即将预测,分类,side-refinement作为一个多任务的模型,这些任务的损失函数共同决定模型的调整方向。

4.1 纵坐标损失Lv

文本检测算法之CTPN 学习笔记_第6张图片

4.2 分类损失Ls

Ls为传统的softmax_cross_entropy_loss,其中,i表示所有预测的anchor中的第i个,Si={0,1},Ns为归一化参数,表示所有的anchor的总和。

4.3 side-refinement的损失函数

构造完文本行后,我们根据文本行的左端和右端两个锚点的特征向量计算文本行的相对位移o
文本检测算法之CTPN 学习笔记_第7张图片
其中x_side是由CTPN构造的文本行的左侧和右侧两个锚点的x坐标,即文本行的起始坐标和结尾坐标。所以x*side便是对应的ground truth的坐标,c^a_x 是锚点的中心点坐标,w_a是锚点的宽度,所以是16。side-refinement使用的损失函数是smooth L1函数。
文本检测算法之CTPN 学习笔记_第8张图片

参考:
https://zhuanlan.zhihu.com/p/43145228
https://blog.csdn.net/dulingtingzi/article/details/88355681
https://my.oschina.net/u/876354/blog/3047851

你可能感兴趣的:(算法,深度学习,pytorch)