Detecting Text in Natural Image with Connectionist Text Proposal Network(CTPN)

文本检测其中一个难点在于文本行的长度变化是非常剧烈的。因此如果是采用基于faster rcnn等通用物体检测框架的算法都会面临怎么生成好的text proposal的问题。论文Detecting Text in Natural Image with Connectionist Text Proposal Network提供了另外一个思路,检测一个一个小的,固定宽度的文本段,然后在后处理部分再将这些小的文本段连接起来,得到文本行。检测到的文本段的示意图如下图所示。
在这里插入图片描述
具体的说,作者的基本想法就是去预测文本的竖直方向上的位置,水平方向的位置不预测。因此作者提出了一个vertical anchor的方法。与faster rcnn中的anchor类似,但是不同的是,vertical anchor的宽度都是固定好的了,论文中的大小是16个像素。而高度则从11像素到273像素变化,总共10个anchor。同时,对于水平的文本行,其中的每一个文本段之间都是有联系的,因此作者采用了CNN+RNN的一种网络结构,检测结果更加鲁棒。

问题分析
1、文字目标的特殊性,一个很大的先验是文字总是水平排列的。文本检测和一般目标检测的不同——文本线是一个sequence(多字符构成的一个sequence),而不是一般目标检测中只有一个独立的目标。这既是优势,也是难点。优势体现在同一文本线上不同字符可以互相利用上下文,可以用sequence的方法比如RNN来表示。难点体现在要检测出一个完整的文本线,同一文本线上不同字符可能差异大,距离远,要作为一个整体检测出来难度比单个目标更大——因此,作者认为预测文本的竖直位置(文本bounding box的上下边界)比水平位置(文本bounding box的左右边界)更容易

2、文字的特征体现在edge上。

3、自然场景文字检测的难点在于:小目标,遮挡,仿射畸变。

pipeline
整个算法的流程主要有以下几个步骤:
(1)首先,使用VGG16作为base net提取特征,得到conv5_3的特征作为feature map,大小是W×H×C

(2) 然后在这个feature map上做滑窗,窗口大小是3×3。也就是每个窗口都能得到一个长度为3×3×C的特征向量。这个特征向量将用来预测和10个anchor之间的偏移距离,也就是说每一个窗口中心都会预测出10个text propsoal。

(3) 将上一步得到的特征输入到一个双向的LSTM中,得到长度为W×256的输出,然后接一个512的全连接层,准备输出。

(4) 输出层部分主要有三个输出。2k个vertical coordinate,因为一个anchor用的是中心位置的高(y坐标)和矩形框的高度两个值表示的,所以一个用2k个输出。(注意这里输出的是相对anchor的偏移)。2k个score,因为预测了k个text proposal,所以有2k个分数,text和non-text各有一个分数。k个side-refinement,这部分主要是用来精修文本行的两个端点的,表示的是每个proposal的水平平移量。

(5)该方法得到密集预测的text proposal,所以会使用一个标准的非极大值抑制算法来滤除多余的box。

(6)最后使用基于图的文本行构造算法,将得到的一个一个的文本段合并成文本行。

在这里插入图片描述
CPTN是一种Top-Down的方法(先检测文本区域,再找出文本线)的文本检测方法,该方法比bottom-up的检测方法(先检测字符,再串成文本线)更好。因为CPTN考虑了上下文,更加鲁棒。

方法缺点:非水平文字不能检测。

CPTN最大的亮点在于把RNN引入检测问题。文本检测,先用CNN得到深度特征,然后用固定宽度的anchor来检测text proposal(文本线的一部分),并把同一行anchor对应的特征串成序列,输入到RNN中,最后用全连接层来分类或回归,并将正确的text proposal进行合并成文本线。这种把RNN和CNN无缝结合的方法提高了检测精度。

特点
(1)不是在字符的级别,最终输出是行的级别;
(2)对于每一行,每一个feature-map位置,固定需要回归的框的宽度为16像素,需要预测k个anchor的高度和竖直方向;
(3)side-refinement用来预测每一个anchor的x的坐标,准确率有有效地提升。

与faster-rcnn区别
1、改进RPN,anchor产生的window的宽度固定为3。
2、rpn后面不是直接接全连接+分类/回归,而是再通过一个LSTM,然后再接全连接层。
3、坐标回归一个y,而不是x1,y1,x2,y2.
4、添加side-refinement对水平位置进行regression。

一些细节
vertical anchor

  • k个anchor的设置如下:宽度都是16像素,高度从11~273像素变化(每次乘以1.4)、
  • 预测的k个vertical coordinate的坐标如下
    v c = ( c y − c y a ) / h a v_c=(c_y-c_y^a)/h^a vc=(cycya)/ha, v h = l o g ( h / h a ) v_h=log(h/h^a) vh=log(h/ha)
    v c ∗ = ( c y ∗ − c y a ) / h a v_c^*=(c_y^*-c_y^a)/h^a vc=(cycya)/ha, v h ∗ = l o g ( h ∗ / h a ) v_h^*=log(h^*/h^a) vh=log(h/ha)
  • 与真值IoU大于0.7的anchor作为正样本,与真值IoU最大的那个anchor也定义为正样本,这个时候不考虑IoU大小有没有到0.7,这样做有助于检测出小文本。
  • 与真值IoU小于0.5的anchor定义为负样本。
  • 只保留score大于0.7的proposal

BLSTM

  • 文章使用了双向的LSTM,每个LSTM有128个隐层

  • 加了RNN之后,整个检测将更加鲁棒,具体效果见下图。上图是加了RNN,下图是没有RNN的结果。
    在这里插入图片描述
    训练

  • 对于每一张训练图片,总共抽取128个样本,64正64负,如果正样本不够就用负样本补齐。这个和faster rcnn的做法是一样的。

  • 训练图片都将短边放缩到600像素。

代码注解
reimplement的github地址:https://github.com/eragonruan/text-detection-ctpn

准备训练数据

  • 正如上文所提的,这个网络预测的是一些固定宽度的text proposal,所以真值也应该按照这样来标注。但是一般数据库给的都是整个文本行或者单词级别的标注。因此需要把这些标注转换成一系列固定宽度的box。代码在prepare_training_data这个文件夹。
  • 整个repo是基于RBG大神的faster rcnn改的,所以根据他的输入要求。要再将数据转换为voc的标注形式,这部分代码也在prepare_training_data这个文件夹。

一些预测结果

  • 这个repo没有实现文章中提到的side refinement部分。
  • 以身份证检测做了个例子,但是模型是可以应用到各种水平文本检测的应用中的。
  • 部分检测的结果如下所示:

在这里插入图片描述
参考:http://slade-ruan.me/2017/10/22/text-detection-ctpn/
参考:https://blog.csdn.net/u013102349/article/details/79521331

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值