CTPN(Detecting Text in Natural Image with Connectionist Text Proposal Network)算法详解

《Detecting Text in Natural Image with Connectionist Text Proposal Network》,发表在ECCV2016,算是一个使用比较多效果较好的较为经典的一个文字检查算法了,CVPR2017年中的一篇名为SegLink的文章灵感也来自于此。代码地址:https://github.com/tianzhi0549/CTPN,这是其中的一个作者提供的代码,我看的是tensorflow版本的实现,tensorflow版本代码地址:https://github.com/eragonruan/text-detection-ctpn

首先要明确的是这篇文章提出的算法是针对水平文本来做的,倾斜和竖直的文本不适用,如果不知道RPN网络的最好先看一下Faster R-cnn,这样更容易弄懂这篇文章介绍的算。

文章思路是借鉴RPN网络,但是RPN是最初提出来是在Faster R-cnn中,是用来做物体检测的。文章认为不同于物体检测,文本的长度是不固定的,它的长宽比也不像通常物体那么有规则,如果单纯用RPN提出的框来检测文本,很容易出现误差的情况,所以文章将一个文本框分成多个宽为16的小框组成,如下图所示(左边为直接采用RPN检测文本框的结果,右边为RPN输出多个小框来检测文本的结果)。这样通过检测出的多个小框组成最终的文本框能够得到更为准确的结果。下面来看一下它的具体算法。

1.png

一、网络结构

文章采用了CNN和RNN结合的网络架构,backbone采用的是VGG16,如下图所示。


2.png

输入一张图片后,经过VGG卷积后得到,提取出最后一层卷积的feature map称为conv5,将得到的conv5经过3\times 3的卷积,将卷积后的结果输入一个双向的RNN层,最后经过一层全连接层得到输出结果。输出有三个结果,一个是anchor的分数,一个是anchor回归的参数,一个是新提出的side-refinement输出(这个稍后会讲)

还要提一下的是,这个网络的架构。文章中先是说明了直接使用CNN的结果来输出最终结果,但是文中认为文字检测还有上下文的关系,所以加入RNN能有效的提高检测效果。文章另一个版本是将CNN的输出输入RNN,这样实现了CNN和RNN的无缝连接,也提高了检测效果,对比如下图所示,上边为只有CNN的输出结果,下边为CNN和RNN的输出结果

3.png

二、标签的生成

因为这里网络的输出不是一个文本框,而是文本框的一部分,所以训练的时候,标签也是文本框的一部分。groundtruth就是将标定的文本框(一般为任意的四边形)变成一个矩形(例如可以求最小外接矩形),得到矩形后将矩形按照宽为16划分为对个小的矩形,这些小矩形就是groundtruth,它们一起组成文本框。

又因为采用了RPN的结构,RPN网络的输出是不同尺寸的anchor(文章采用了10中anchor,这些anchor宽都为16,高不同,高从11到273,从11开始依次除以0.7得到)。所以正样本和负样本是一系列的anchor box。

正样本定义为:

  1. 与groundtruth的IoU>0.7的anchor为正
  2. 与groundtruth的Iou最大的anchor为正(这个条件是为了对小文本框的支持更好)

将与groundtruth的IoU<0.5的anchor定义为负样本。

其他的设定与RPN相同,比如输出的是anchor的分数和anchor的回归值,但是这里的回归只有y值和y方向的中心点位置,因为anchor的宽是固定的16。

还有一点不一样的是这里输出除了有anchor的分数和anchor的回归值外,还会输出一个叫side-refinement的信息。文章认为因为存在y方向的回归操作所以在y方向的输出比较准确,但是文本框被序列化为宽16像素的小框组成,这样可能会导致水平方向的输出不是很准,如下图所示(红框为利用side-refinement操作后的结果,黄框为未使用side-refinement操作的结果)。这里回归的是组成文本框的头和尾的小框的位置(tensorflow版本的代码并未实现这一部分)。


4.png

三、损失函数的定义

损失函数定义如下

L(s_{j}, v_{j}, o_{k})=\frac{1}{N}\sum_{i}L^{cl}_{s}(s_{i},s^{*}_{i})+\frac{\lambda_{1}}{N_{v}}{L^{re}_{v}(v_{j},v^{*}_{j})}+\frac{\lambda_{2}}{N_{o}}\sum_{k}L^{re}_{o}(o_{k}, o^{*}_{k})

训练时每个anchor是一个训练样本,i为minibatch中一个anchor的索引。s_{i}是对一个anchor预测的分数值,s^{*}_{i}=\{0,1\}为真值。j为valid anchors中的索引,valid anchors定义为s^{*}_{j}=1的anchor或者与groundtruth的IoU>0.5的anchor。v_{j}v^{*}_{j}分别是预测的回归值和真实的回归值。k值为side-anchor,side-anchor定义为离标定的文本框左侧或者右侧的水平距离在一定值(例如32像素)的anchor。o_{k}o^{*}_{k}为预测的回归值和真实的回归值。L^{cl}_{s}为softmax loss,L^{re}_{v}L^{re}_{o}为smooth L1计算的回归损失。\lambda_{1}=1.0\lambda_{2}=2.0。式中N_{s},N_{v},N_{o}分别为参与各损失函数计算的anchor box的个数。

损失函数中,v=\{v_{c},v_{h}\}v^{*}=\{v^{*}_{c},v^{*}_{h}\},计算方式如下

v_{c}=(c_{y}-c^{a}_{y})/h^{a},v_{h}=log(h/h^{a})
v^{*}_{c}=(c^{*}_{y}-c^{a}_{y})/h^{a},v^{*}_{h}=log(h^{*}/h^{a})

其中c^{a}_{y}h^{a}是anchor box的中心点的y坐标和高。相似的,c_{y}h为预测值,c^{*}_{y}h^{*}为groundtruth。

损失函数中,oo_{*}计算方式如下。
o=(x_{side}-c^{a}_{x})/w^{a},o^{*}=(x^{*}_{side}-c^{a}_{x})/w^{a}

其中,x_{side}表示的是文本框的side anchor的x坐标,相似的x^{*}_{side}为真值。w^{a}=16表示anchor的宽。

四、输出回归后的anchor的合成方式

如何将输出的anchor合成为文本框,判断两个anchor属于同一个文本框应满足下列条件:

  1. 两个框的水平距离是最近的
  2. 两个框的水平距离小于50像素
  3. 两个框垂直方向的重叠大于0.7

如果两个anchor相互都满足上述条件则认为它们属于同一个文本框。

具体实现可以参考tensorflow版本代码,因为实现和文章还有些不一样的地方,比如anchor的大小,实现的anchor的高取值为[11, 16, 23, 33, 48, 68, 97, 139, 198, 283]而不是文章中的11到273,还有代码没有实现L^{re}_{o}的计算等等。

到这里CTPN就介绍完了。

中文本定位与识别的评测方法

欢迎加入OCR交流群:785515057(此群已满)
欢迎加入OCR交流群2:826714963

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容