SegLink(Detecting Oriented Text in Natural Images by Linking Segments)算法详解

《Detecting Oriented Text in Natural Images by Linking Segments》是和EAST同年的一篇发表在CVPR2017的OCR论文。代码地址:https://github.com/bgshih/seglink,这是该文章其中一个作者提供的tensorflow版本代码,网上还有其他实现(我看的是pixellink作者的一个实现https://github.com/dengdan/seglink)。

下面将详细讲解该算法。

一、网络输入输出及网络架构

网络输入输出
在介绍网络之前先介绍一下该网络的输入和输出,这部分算是这个篇文章的一个主要创新点。

首先是输入,因为网络全部采用卷积结构,所有对输入图片大小没有要求,可以是任意大小和任意长宽比,这点比较好理解。这里假定输入图片大小为w_{I}\times h_{I}

然后是输出,输出文章称为segments和links。segments可以理解为是一个一个的小框,这些小框类似于SSD中的default boxes,它们不一定一个框能框一个字,可能就框一个字的一部分,这点要明确。一个segment用公式b=(x_{b},y_{b},w_{b},h_{b}, \theta_{b})表示,其中x_{b},y_{y}表示segment的中心,w_{b},h_{b}表示segment的宽和高,\theta_{b}表示该segment的旋转角。links就是将segments连接起来,说白了就是两个框是不是同一个文本的一个概率值。

至于segmens和links从哪里输出以及输出的是什么东西下面会详细介绍。

网络结构
如下图所示,网络的backbone采用的是VGG-16,将VGG中所有的全连接层改为卷积层(fc6、fc7改为conv6、conv7),并在conv7后面还加了若干个卷积层(conv8_1 - conv11),训练与检测的网络结构类似于SSD,只是这里的feature map是从conv4_3,conv7,conv8_2,conv9_2,conv10_2,conv11这6个层中提取出来的。提取出的6个层依次另命名为l-th (l = 1, ..., 6)层。

图1.png

得到这六层feature map后,每个feature map经过卷积处理得到segments和links,下面介绍一下关于segments和links的检测方法。

Segment的检测方法
上面提到segment的表示方法为b=(x_{b},y_{b},w_{b},h_{b}, \theta_{b})。检测一个segment那么网络需要输出segment的置信度和segment相对于default boxes的五个参数的一个回归偏移量。default boxes的位置可以这样理解,相对于每一个卷积出来的feature map中的每个点都可以找到在原图中的对应点,这个对应于feature map上的在原图中的点就是default boxes的位置,而他们的大小定义如下(注意,default boxes都是没有旋转角的矩形)。

因为提取出的6层feature map,每层都要输出segments,对于大小为w_{l}\times h_{l}l-th层feature map来说,一个点在feature map上的坐标为(x,y),对应原图是坐标为(x_{a},y_{a})的点,那一个default box的中心坐标为(x_{a},y_{a}),由下式表示
x_{a}=\frac{w_{I}}{w_l}(x + 0.5)
y_{a}=\frac{h_{I}}{h_l}(y + 0.5)
default box的长宽都设为同一常数a_{l},该数值的计算方式是个经验等式,如下式所示
a_{l}=\gamma\frac{w_I}{w_l},这里\gamma = 1.5

注意,上述是default box的计算方法,而实际我们需要通过default box的信息以及feature map再次进过卷积输出的信息,回归出segment的信息。

来看看提取出的feature map需要输出什么信息,每个feature map经过卷积后输出的通道数为7,其中两个通道表示segment的置信度值为(0,1),剩下的五个通道为segment相对于对应位置的default box的五个偏移量,用(\Delta x_{s},\Delta y_{s},\Delta w_{s},\Delta h_{s}, \Delta \theta_{s})表示。通过这五个偏移量和之前得到的default box的信息就可以求出segment的位置,计算方法如下:
x_{s} = a_{l}\Delta x_{s} + x_{a}
y_{s} = a_{l}\Delta y_{s} + y_{a}
w_{s} = a_{l}exp(\Delta w_{s})
h_{s} = a_{l}exp(\Delta h_{s})
\theta_{s} = \Delta \theta_{s}

这样就可以通过default boxes和feature maps的输出求得segments的位置。

下面接着介绍links的检测方法,介绍之前要知道links分为Within-Layer Link和Cross-Layer Link,这两种link如下图所示,下面将分别介绍。

图2.png

Within-Layer Link的检测方法
一个link连接着相邻两个segment,表示他们是属于同一个字或者在同一框中。link的作用不仅是将相邻的segment连接起来,还可以区分邻近的segment但是不属于同行或者同一个标定框。

检测link使用的feature map与检测segment使用的是同一feature map,所以对于同一层feature map来说,一个segment有其他8个相邻的segment,那links就是每个feature map经过卷积后输出16个通道,每两个通道表示segment与邻近的一个segment的link。

Cross-Layer Link的检测方法
这里说一下为什么有了Within-Layer Link了,还需要Cross-Layer Link。理论上来说有Within-Layer Link就已经可以将各个segment连接起来最后得到文本框的检测结果了。原因是本文为了能检测不同尺度的文字,使用不同层的feature map输出segments,这样会导致不同层输出segment是同一个位置可能只是大小不一样,最终导致不同层产生的框的合并会出现问题,这个问题就需要使用Cross-Layer Link解决。

Cross-Layer Link连接的是相邻两层feature map产生的segments,比如,1-th层(即conv4_3)的feature map和2-th层(即conv7)的feature map产生的segments通过Cross-Layer Link连接。

这个网络有个重要的属性方便我们进行Cross-Layer Link连接,就是我们提取出来的6个feature map中,上一层的大小是下一层的四倍(长宽各两倍)。但是值得注意的是,只有feature map是偶数的时候才满足这个属性,所以在实际操作中,输入图像的长宽大小都要缩放到128的整数倍。例如,一张1000\times 800的图片,首先会先缩放到1024\times 768大小。

由于上层的feature map为下一层的四倍大小,那相当于一个segment与另一层的四个segment相邻。这时除1-th的feature map外,其他五个feature map每个经过卷积后都要输出8个通道,每两个通道表示一个Cross-Layer Link。

每层feature map的输出
经过上述介绍,每层feature map提取出来后,还要经过卷积出来,最后输出的有segments的信息也有links的信息,如下图所示。唯一不一样的是1-th也就是con4_3层feature map的输出少Cross-Layer Link。

图3.png

利用links将segments连接
在上述步骤输出一系列的segments和links后,最后需要将所有的segments利用links信息连接成一个个的文本框。在连接之前需要设定阈值将一些噪声过滤,对应segments和links的置信度设置不同的阈值分别为\alpha\beta。文章写阈值设定不同对结果影响不大,具体多少没有写。

过滤完噪声后,采用DFS将segments看做节点,links看做边,将他们连接起来。最后采用一定算法将连接后的结果再合并为文本框,文章中用伪代码表示,这里讲一下伪代码的思路。

  1. 将连接后的所有结果作为输入,将连接在一起的segments当作是一个小的集合,称为B
  2. 将B集合中所有segment的旋转角求平均值作为文本框的旋转角称为\theta_{b}
  3. 将旋转角求tan\theta_{b}作为斜率,这样就可以得到一系列的平行线,求得B集合中所有segment的中心点到直线距离的和最小的那条直线
  4. 将B集合中所有segment的中心点垂直投影到3步骤中找到的直线上
  5. 在投影中找到距离最远的两个点称为(x_{p}, y_{p})(x_{q}, y_{q})
  6. 上述两点的均值作为框的中心点,宽为上述两点的距离,高为B集合中所有segment的高的均值。

二、segments和links标签的生成

整个网络的训练是直接根据segments和links的真实标签训练的,但是由于一般的数据库给出的是一个四边形四个点的坐标,所以在进行网络训练前需要计算出segments和links的标签值。

在求segments和links的标签前先确定与其对应的default box的标签值。

首先假设一张输入图像只有一个文本框的情况。在这种情况下,一个default box在满足下面条件时认为是正样本:

  1. 这个default box的中心在标定文本框内;
  2. 当default box的大小a_{l}与文本框的高h满足下面公式时:
    max(\frac{a_l}{h},\frac{h}{a_{l}})\leq 1.5
    否则,认为该default box为负样本。

下面开始考虑图像中有多个文本框的情况。当default box对于图像中任意的文本框都不满足上述条件时认为该default box我负样本。当default box满足上面条件时则认为该default box为正样本,如果对于多个文本框都满足时,则该default box为与其大小最相近的文本框的正样本,大小相近指的是min(max(\frac{a_l}{h},\frac{h}{a_{l}}))

在通过上述规则得到default box的正样本后,在这些正样本的基础上计算segments相对于default box的位置偏移量,计算方法如下图所示。


图4.png

上图中的步骤描述如下:

  1. 选择一个正样本的default box,如图中蓝框所示,其中的蓝点是default box的中心点
  2. 将文本框顺时针旋转为\theta,使其成为水平框
  3. 在得到的水平框能截取default box大小的区域(长为default box的长,高仍为文本框的高)
  4. 根据截取后的水平框,沿着其中心点逆时针旋转\theta

通过这些步骤就可以得到一个segment,最后通过在segment检测部分讲到的公式,就可以求出segment和default box的偏移量,这个偏移量用于训练segment。

link(包括within-layer link 和 cross-layer link)的标签值计算比较简单,只要满足下面两个条件认为link为真否则为假:

  1. link连接的两个default box都为正样本
  2. 两个default box属于同一个文本框

三、损失函数的定义

损失函数定义如下式所示:
L(y_{s},c_{s},y_{l},c_{l},\hat{s})=\frac{1}{N_{s}}L_{conf}(y_{s},c_{s})+\lambda_{1}\frac{1}{N_{s}}L_{loc}(\hat{s},s)+\lambda_{2}\frac{1}{N_{l}}L_{conf}(y_{l},c_{l})

其中,y_{s}表示所有的segments的标签值,y^{i}_{s}=1如果第i个default box为正样本,否则为0。相似的,y_{l}为所有links的标签值。c_{s}c_{l}分别为segments和links的预测值。L_{conf}为softmax loss,用于计算segments和links置信度的损失。L_{loc}为Smooth L1 regression loss,用于计算segments预测偏移量\hat{s}和标签值s的损失。N_{s}为图像中所有正样本的default boxes的个数。N_{l}为图像中所有正样本的links的个数。\lambda_{1}\lambda_{2}作者都设为1。

这篇文章的算法部分就介绍完了,文章还提了一下使用了Online Hard Negative Mining和Data Augmentation。

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

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

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