SegLink(Detecting Oriented Text
《Detecting Oriented Text in Natural Images by Linking Segments》是和EAST同年的一篇发表在CVPR2017的OCR论文。代码地址:https://github.com/bgshih/seglink,这是该文章其中一个作者提供的tensorflow版本代码,网上还有其他实现(我看的是pixellink作者的一个实现https://github.com/dengdan/seglink)。
下面将详细讲解该算法。
一、网络输入输出及网络架构
网络输入输出
在介绍网络之前先介绍一下该网络的输入和输出,这部分算是这个篇文章的一个主要创新点。
首先是输入,因为网络全部采用卷积结构,所有对输入图片大小没有要求,可以是任意大小和任意长宽比,这点比较好理解。这里假定输入图片大小为
然后是输出,输出文章称为segments和links。segments可以理解为是一个一个的小框,这些小框类似于SSD中的default boxes,它们不一定一个框能框一个字,可能就框一个字的一部分,这点要明确。一个segment用公式表示,其中表示segment的中心,表示segment的宽和高,表示该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个层依次另命名为 层。
得到这六层feature map后,每个feature map经过卷积处理得到segments和links,下面介绍一下关于segments和links的检测方法。
Segment的检测方法
上面提到segment的表示方法为。检测一个segment那么网络需要输出segment的置信度和segment相对于default boxes的五个参数的一个回归偏移量。default boxes的位置可以这样理解,相对于每一个卷积出来的feature map中的每个点都可以找到在原图中的对应点,这个对应于feature map上的在原图中的点就是default boxes的位置,而他们的大小定义如下(注意,default boxes都是没有旋转角的矩形)。
因为提取出的6层feature map,每层都要输出segments,对于大小为的层feature map来说,一个点在feature map上的坐标为,对应原图是坐标为的点,那一个default box的中心坐标为,由下式表示
default box的长宽都设为同一常数,该数值的计算方式是个经验等式,如下式所示
,这里
注意,上述是default box的计算方法,而实际我们需要通过default box的信息以及feature map再次进过卷积输出的信息,回归出segment的信息。
来看看提取出的feature map需要输出什么信息,每个feature map经过卷积后输出的通道数为7,其中两个通道表示segment的置信度值为(0,1),剩下的五个通道为segment相对于对应位置的default box的五个偏移量,用表示。通过这五个偏移量和之前得到的default box的信息就可以求出segment的位置,计算方法如下:
这样就可以通过default boxes和feature maps的输出求得segments的位置。
下面接着介绍links的检测方法,介绍之前要知道links分为Within-Layer Link和Cross-Layer Link,这两种link如下图所示,下面将分别介绍。
图2.pngWithin-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的整数倍。例如,一张的图片,首先会先缩放到大小。
由于上层的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。
利用links将segments连接
在上述步骤输出一系列的segments和links后,最后需要将所有的segments利用links信息连接成一个个的文本框。在连接之前需要设定阈值将一些噪声过滤,对应segments和links的置信度设置不同的阈值分别为和。文章写阈值设定不同对结果影响不大,具体多少没有写。
过滤完噪声后,采用DFS将segments看做节点,links看做边,将他们连接起来。最后采用一定算法将连接后的结果再合并为文本框,文章中用伪代码表示,这里讲一下伪代码的思路。
- 将连接后的所有结果作为输入,将连接在一起的segments当作是一个小的集合,称为B
- 将B集合中所有segment的旋转角求平均值作为文本框的旋转角称为
- 将旋转角求作为斜率,这样就可以得到一系列的平行线,求得B集合中所有segment的中心点到直线距离的和最小的那条直线
- 将B集合中所有segment的中心点垂直投影到3步骤中找到的直线上
- 在投影中找到距离最远的两个点称为 和
- 上述两点的均值作为框的中心点,宽为上述两点的距离,高为B集合中所有segment的高的均值。
二、segments和links标签的生成
整个网络的训练是直接根据segments和links的真实标签训练的,但是由于一般的数据库给出的是一个四边形四个点的坐标,所以在进行网络训练前需要计算出segments和links的标签值。
在求segments和links的标签前先确定与其对应的default box的标签值。
首先假设一张输入图像只有一个文本框的情况。在这种情况下,一个default box在满足下面条件时认为是正样本:
- 这个default box的中心在标定文本框内;
- 当default box的大小与文本框的高满足下面公式时:
否则,认为该default box为负样本。
下面开始考虑图像中有多个文本框的情况。当default box对于图像中任意的文本框都不满足上述条件时认为该default box我负样本。当default box满足上面条件时则认为该default box为正样本,如果对于多个文本框都满足时,则该default box为与其大小最相近的文本框的正样本,大小相近指的是。
在通过上述规则得到default box的正样本后,在这些正样本的基础上计算segments相对于default box的位置偏移量,计算方法如下图所示。
图4.png
上图中的步骤描述如下:
- 选择一个正样本的default box,如图中蓝框所示,其中的蓝点是default box的中心点
- 将文本框顺时针旋转为,使其成为水平框
- 在得到的水平框能截取default box大小的区域(长为default box的长,高仍为文本框的高)
- 根据截取后的水平框,沿着其中心点逆时针旋转角
通过这些步骤就可以得到一个segment,最后通过在segment检测部分讲到的公式,就可以求出segment和default box的偏移量,这个偏移量用于训练segment。
link(包括within-layer link 和 cross-layer link)的标签值计算比较简单,只要满足下面两个条件认为link为真否则为假:
- link连接的两个default box都为正样本
- 两个default box属于同一个文本框
三、损失函数的定义
损失函数定义如下式所示:
其中,表示所有的segments的标签值,如果第i个default box为正样本,否则为0。相似的,为所有links的标签值。和分别为segments和links的预测值。为softmax loss,用于计算segments和links置信度的损失。为Smooth L1 regression loss,用于计算segments预测偏移量和标签值的损失。为图像中所有正样本的default boxes的个数。为图像中所有正样本的links的个数。和作者都设为1。
这篇文章的算法部分就介绍完了,文章还提了一下使用了Online Hard Negative Mining和Data Augmentation。
欢迎加入OCR交流群:785515057(此群已满)
欢迎加入OCR交流群2:826714963