机器学习

SegLink(Detecting Oriented Text

2018-12-30  本文已影响0人  ce0b74704937

《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

上一篇下一篇

猜你喜欢

热点阅读