前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度解析文本检测网络CTPN

深度解析文本检测网络CTPN

作者头像
CristianoC
发布2020-06-02 11:34:00
1.5K0
发布2020-06-02 11:34:00
举报

不同于网上千篇一律讲解CTPN的文章,本文将使用大量可视化过程来帮助大家理解CTPN,完整重现CTPN所有细节。

先用一张动图过一遍CTPN全过程,接下来开始我们的讲解。

目录

  • 文本检测概念初识
  • CTPN总体结构
  • 特殊的anchor
  • 双向LSTM
  • RPN层
  • NMS
  • 文本线构造算法
  • 文本框矫正
  • 损失函数
  • 效果图
  • 参考

文本检测概念初识

OCR(光学字符识别)是CV一个重要的研究领域,OCR分成文本检测和文本识别两个步骤,其中文本准确检测的困难性又是OCR中最难的一环,而本文介绍的CTPN则是文本检测中的一个里程碑的模型。

文本检测有别于一般的目标检测,区别有以下几种:(1)一般的目标检测的每个目标一般是孤立的,所以每个目标的边界框都很明确,而对于文本检测中边界其实没有那么容易界定,因为文本(单词)其实是一个序列,在图像中每个单词中间是有空格的(字母间),对于我们的算法就很难界定这是单词内空格还是单词间空格,这也就分不清我们要检测文本的开始与结束的地方。(2)文本是一个序列,除去空间特征它还具有很重要的序列特征,它的上下文的序列信息对我们检测文本是有帮助的,而传统的目标检测提取的都是空间特征,自然效果不好。(3)文本行的长度变化是不固定而且变化很大,使用通用的检测算法很难生成好的候选框text proposal。

我们来看一下用一般目标检测算法(Faster-RCNN)跟用CTPN效果对比,很明显通用的目标检测算法的检测框会大很多(更不精确)

接下来我们开始讲解CTPN具体原理,本文默认读者了解Faster-RCNN以及LSTM原理,如果不懂的可以移步我前几篇文章。

CTPN总体结构

(1)CTPN第一步和通用的目标检测网络一样,先用一个backbone,这里用的是VGG16来提取空间特征,取VGG的conv5层的输出,输出维度为B × W × H × C(批次batchsize×宽×高×通道数)。这里要注意因为是第五层卷积输出,所以下采样倍数为16,也就是输出的feature map中的每个特征点对应原图16个像素。

(2)接下来我们会对feature map做一个编码,在feature map上使用3×3的滑窗来提取空间特征(也就是卷积),经过滑窗后得到的feature map大小依旧是B × W × H × C,但这里的每一个像素点都融合了周围3 × 3的信息(在论文中作者使用caffe中的im2col实现的滑窗操作,将B × W × H × C大小的feature map转换为B × W × H × 9C,本文遵从tf版本)

(3)接着将feature map reshape成(NH) × W × C输入双向LSTM(bi-direcional LSTM)提取每一行的序列特征。最后双向LSTM输出(NH) × W × 256,然后重新reshape回N × 256 × H × W

(4)将输出经过一个卷积层(图中的FC),变成N × H × W × 512

(5)N × H × W × 512 最后会经过一个类似RPN的网络,分成三个预测支路:如上图所示,其中一个分支输出N × H × W × 2k,这里的k指的是每个像素对应k个anchor,这里的2K指的是对某一个anchor的预测

v=[v_c,v_h]

;第二个分支输出N × H × W × 2k,这里的2K指的是2K个前景背景得分,记做

s=[text,non-text]

。最后一个分支输出N × H × W × k,这里是K个side-refinement,预测某个anchor预测

o_k

,这里看不懂没有关系,下面讲解anchor的时候会展开讲。

(6)经过上面步骤,可以得到密密麻麻的text proposal,这里使用nms来过滤掉多余的文本框。

(7)假如理想的话(文本水平),会将上述得到的一个文本小框使用文本线构造方法合成一个完整文本行,如果还有些倾斜,会做一个矫正的操作。

以上就是CTPN的架构,看不懂没关系,接下来我会可视化每个过程帮你了解。

特殊的anchor

第一部分有提到,文本长度的剧烈变化是文本检测的挑战之一,作者认为文本在长度的变化比高度的变化剧烈得多,文本边界开始与结束的地方难以和Faster-rcnn一样去用anchor匹配回归,所以作者提出一种vertical anchor的方法,即我们只去预测文本的竖直方向上的位置,不去预测水平方向的位置,水平位置的确定只需要我们检测一个一个小的固定宽度的文本段,将他们对应的高度预测准确,最后再将他们连接在一起,就得到了我们的文本行,如下图所示:

所以,我们对于每个像素点设置的anchor的宽度都是固定的,为16像素(第二部分提到,feature map上的每一点对应原图16个像素),这样就可以覆盖到原图的所有位置,而高度则是从11到273变化,这里我们每个像素点取k=10个anchor。

因为宽度是固定的,所以只需要anchor的中心的y坐标以及anchor的高度就可以确定一个anchor,其中带星号的为ground-truth,没有带星号的则是预测值,带a的则是对应anchor的值,具体那些回归的原理和之前讲解的检测算法一致就不多赘述。

双向LSTM

VGG16提取的是空间特征,而LSTM学习的就是序列特征,而这里使用的是双向LSTM,更好的避免RNN当中的遗忘问题,更完整地提取出序列特征。

RPN层

CTPN的RPN层和Faster R-CNN很像,第一个分支输出的是我们anchor的位置,也就是我们上面讲解anchor提到的两个参数

(V_c,V_h)

,因为每个特征点配置10个anchor,所以这个分支的输出20个channel。

第二个分支则是输出前景背景的得分情况(text/non-text scores),通过softmax计算得分,所以这里也是输出20个channel。我们来可视化一下feature map:很明显可以看出前景背景的交替。

第三个分支则是输出最后水平精修side-refinement的比例

o

,这是由于我们每个anchor的宽是一定的,所以有时候会导致水平方向有一点不准,所以这时候就需要校准一下我们的框(在我自己的实验中这个帮助不大),精修的公式如下:

和anchor一样,带星号的是groundtruth,

X_{side}

表示文本框的左边界或者右边界,

C^a_x

表示anchor中心的横坐标,

W_a

是anchor固定的宽度16像素,所以我们可以把这个

o

理解为一个缩放的比例,来对最后的结果做一个准确的拉伸,下面这张图中红色的就是使用了side-refinement,黄色的则是没有使用的结果。

这里要注意,作者选择与真值IoU大于0.7的anchor作为正样本,与真值IoU最大的那个anchor也定义为正样本,这样做有助于检测出小文本,避免小样本因得分低而被判断为负样本;与真值IOU小于0.5的anchor则定义为负样本,经过RPN之后我们只保留那些正样本。

nms

经过RPN,就会输出密密麻麻的检测框,这时候使用一个nms来过滤掉多的框。

文本线构造方法

经过上一部分我们已经得到了一系列的小的文本框,接下来我们就是用文本线构造方法将他们连起来。论文中说的不太清楚,这里引用白裳的叙述:

假设某张图有图9所示的2个text proposal,即蓝色和红色2组Anchor,CTPN采用如下算法构造文本线:(1)按照水平

x

坐标排序Anchor (2)按照规则依次计算每个Anchor

box_i

pair(box_j)

,组成

pair(box_i,box_j)

(3)通过

pair(box_i,box_j)

建立一个Connect graph,最终获得文本检测框

这只是一个概述,接下来展开叙述。假设每个Anchor index是绿色数字,每个Anchor Softmax score是黑色数字:

首先是正向寻找:(1)沿水平正方向,寻找和

box_i

水平距离小于50的候选Anchor (2)从候选Anchor中,挑出与

box_i

竖直方向IOU>0.7的Anchor (3)挑出符合条件2中Softmax score最大的

box_j

再反向寻找:(1)沿水平负方向,寻找和

box_j

水平距离小于50的候选Anchor (2)从候选Anchor中,挑出与

box_j

竖直方向IOU>0.7的Anchor (3)挑出符合条件2中Softmax score最大的

box_k

最后对比

score_i

score_j

,如果前者大于等于后者,则说明这是一个最长连接,设置

Graph(i,j)=True

;反之则说明这不是一个最长的连接,也就是这个连接包含在另外一个更长的连接中。

这样就建立了一个

N × N

的Connect graph,这个N是正Anchor的数量,紧接着遍历Graph来确定文本检测框,举个例子:

Graph(6,10) = True,Graph(10,15) = True

那么Anchor index6->10->15就组成了一个文本区域,文本框就确定了。

文本框矫正

很多网上的文章忽略了文本框矫正这一点,加入文本并不是理想的,也就是存在倾斜,文本框是需要矫正的,矫正的步骤如下:

(1)上一步我们得到了一些判断为同一个文本序列的anchor,我们首先要求一条直线L使得所有中心到这条直线的距离最小,也就是最小二乘法线性回归。

(2)这时候我们已经得到了每一段文字的基本走向,与此同时我们可以根据每一段里的text proposal得到这段文字的最大区域,我们可视化一下:

(3)现在有了最大范围和拟合出的文本的直线,我们要生成最终符合文字倾斜角度和区域的box,CTPN作者使用一种巧妙方法来生成text proposal:首先求每段text proposal的平均高度,并以此和拟合出的文字中的直线做上下平移,来生成候选区域。这个时候我们生成的box的上下边都是我们刚才的拟合出的直线的平行线,左右边则是由上下边生成的垂线生成的平行四边形。

(4)现在我们生成了一个平行四边形,但是我们传入识别部分肯定是一个矩形,所以作者根据框上下边斜度来对左右两条边做出斜度变化的补偿方法,来确定最终的矩形框。

这里要注意,CTPN在实际当中对一些倾斜样本的鲁棒性还是略显不足的。

损失函数

CTPN的损失函数如上图,一眼看上去又是一个Muti-task的loss,分为三个部分:(1)LS:每个anchor是否是正样本的classification loss(2)Lv:每个anchor的中心y坐标和高度loss(3)L0:文本区域两侧精修的x损失,和Faster-RCNN一样,以上的loss都采用smooth L1 loss,

\lambda

是权重系数,

N

则是归一化系数,这部分很清晰没什么好讲的。

效果图

这是去年做的银行卡号识别项目的效果图,可以看出CTPN对这种横向的文字检测效果还是很好的:

对于场景中的文本检测效果也是不错:

参考

(1)paper https://arxiv.org/abs/1609.03605

(2)文本线构造方法说明:https://zhuanlan.zhihu.com/p/34757009

(3)可视化图片出处:https://www.bilibili.com/video/BV1XJ411k7sf?from=search&seid=9398415273544549231

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 计算机视觉漫谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 文本检测概念初识
  • CTPN总体结构
  • 特殊的anchor
  • 双向LSTM
  • RPN层
  • nms
  • 文本线构造方法
  • 文本框矫正
  • 损失函数
  • 效果图
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档