Detecting Text in Natural Image with Connectionist Text Proposal Network
tags: CTPN, Faster-RCNN, LSTM
CTPN和Faster R-CNN出自同系,根据文本区域的特点做了专门的调整,一个重要的地方是RNN的引人,笔者在实现CTPN的时候也是直接在Faster-RCNN基础上改的。理解了Faster R-CNN之后,CTPN理解的难度也不大,下面开始分析这篇论文。
作者提供的CTPN demo源码:https://github.com/tianzhi0549/CTPN
基于TensorFlow的CTPN开源代码:https://github.com/eragonruan/text-detection-ctpn
简介
传统的文字检测是一个自底向上的过程,总体上的处理方法分成连通域和滑动窗口两个方向。基于连通域的方法是先通过快速滤波器得到文字的像素点,再根据图像的低维特征(颜色,纹理等)贪心的构成线或者候选字符。基于滑动窗口的方法是通过在图像上通过多尺度的滑窗,根据图像的人工设计的特征(HOG,SIFT等),使用预先训练好的分类器判断是不是文本区域。但是这两个途径在健壮性和可信性上做的并不好,而且滑窗是一个非常耗时的过程。
卷积网络在2012年的图像分类上取得了巨大的成功,在2015年Faster R-CNN在物体检测上提供了非常好的算法框架。所以用深度学习的思想解决场景文字检测自然而然的成为研究热点。对比发现,场景文字检测和物体检测存在两个显著的不同之处
场景文字检测有明显的边界,例如Wolf 准则 ,而物体检测的边界要求较松,一般IoU为0.7便可以判断为检测正确;
场景文字检测有明显的序列特征,而物体检测没有这些特征;
和物体检测相比,场景文字检测含有更多的小尺寸的物体。
针对以上特点,CTPN做了如下优化:
在CTPN中使用更符合场景文字检测特点的锚点;
针对锚点的特征使用新的损失函数;
RNN(双向LSTM)的引入用于处理场景文字检测中存在的序列特征;
Side-refinement的引入进一步优化文字区域。
算法详解
1. 算法流程
CTPN的流程和Faster R-CNN的RPN网络类似,首先使用VGG-16提取特征,在conv5进行3*3,步长为1的滑窗。设conv5的尺寸是W*H,这样在conv5的同一行,我们可以得到W个256维的特征向量。将同一行的特征向量输入一个双向LSTM中,在双向LSTM后接一个512维的全连接后便是CTPN的3个任务的多任务损失,结构如图1。任务1的输出是2*k,用于预测候选区域的起始y坐标和高度h;任务2是用来对前景和背景两个任务的分类评分;任务3是k个输出的side-refinement的偏移(offset)预测。在CTPN中,任务1和任务2是完全并行的任务,而任务3要用到任务1,2的结果,所以理论上任务3和其他两个是串行的任务关系,但三者放在同一个损失和函数中共同训练,也就是我们在Faster R-CNN中介绍的近似联合训练。
图1:CTPN的结构
2. 数据准备
和RPN的要求一样,CTPN输入图像的尺寸无硬性要求,只是为了保证特征提取的有效性,在保证图片比例不变的情况下,CTPN将输入图片的resize到600,且保证长边不大于1000。
3. CTPN的锚点机制
作者通过分析RPN在场景文字检测的实验发现RPN的效果并不是特别理想,尤其是在定位文本区域的横坐标上存在很大的误差。因为在一串文本中,在不考虑语义的情况下,每个字符都是一个独立的个体,这使得文字区域的边界是很难确定的。显然,文本区域检测和物体检测最大的区别是文本区域是一个序列,如图2。如何我们能根据文本的序列特征捕捉到文本区域的边界信息,应该能够对本文区域的边界识别能够很好的预测。
图2:文本区域的序列特征。
而在目前的神经网络中,RNN在处理序列数据上占有垄断性的优势地位。在RNN的训练过程中,数据是以时间片为单位输入到模型中的。所以,如何将文本区域变成可以序列化输入的顺序成为了CTPN一个重要的要求。如图2所展示的,每一个蓝色矩形是一个锚点,那么一个文本区域便是由一系列宽度固定,紧密相连的锚点构成。所以,CTPN有如下的锚点设计机制:
由于CTPN是使用的VGG-16进行特征提取,VGG-16经过4次max pooling的降采样,得到的_feature_stride=16,_feature_stride体现在在conv5上步长为1的滑窗相当于在输入图像上步长为16的滑窗。所以,根据VGG-16的网络结构,CTPN的锚点宽度w必须为16。对于一个输入序列中的所有锚点,如果我们能够判断出锚点的正负,把这一排正锚点连在一起便构成了文本区域,所以,锚点的起始坐标x也不用预测。所以在CTPN中,网络只需要预测锚点的起始y坐标以及锚点的高度h即可。
在RPN网络中,一个特征向量对应的多个尺寸和比例的锚点,同样的,CTPN也对同一个特征向量设计了10个锚点。在CTPN中,锚点的高度依次是[11,16,23,33,48,68,97,139,198,283],即高度每次除以0.7。根据笔者的经验,根据你的CTPN的应用场景,比如要做一些文本区域较小的检测,这时候你可能需要设计更小的锚点。