文本检测之SegLink

简介: 翻译:《Detecting Oriented Text in Natural Images by Linking Segments》

核心idea是将文本分成两个元素,一个成为segment一个称为link。segment是一个覆盖文字的框,link是接两个segment,指示他们是否属于同一个词或者行。

摘要

目前比较先进的文字识别方法都是针对水平拉丁文字,并且速度上不够快。在这里我们引入了一个seglink-一个旋转文字识别方法。这个方法的主要思想是将文本分成两个局部可检测元素,称为segments和links。segment是一个有向的盒子,覆盖了单词或者文字段的一部分;一个link会连接两个临近的segments,指示他们是否属于一个单词或者一个文字段。这两个元素都可以通过端对端训练的全卷积网络在不同层次进行识别。最终的识别结果是通过组合被link连起来的segment产生的。同之前的方法相比,seglink提高了训练的准确率和速度并使其变得更简单。在标准ICDAR2015上的f-measure达到了75%,远远超过了此前最好的结果。它在512x512图上运行速度达到20fps。此外,seglink还能够检测非拉丁文的长文本行,比如说中文。

介绍

在自然场景图像中读取文字是一个挑战性的研究热点,它被多种现实应用所驱动,比如说Photo OCR, 姿态定位和图像检索。在文本阅读系统中,文本识别:使用边框定位单词或者文本行,是具有重要意义的第一步。在某种意义上,文本识别可以看作是物体识别在文本上的应用,作为识别目标的是单词/字母/文本行。因此,最近的先进的文本识别方法都是基于物体识别或者分割技术。

尽管之前的工作已经取得了巨大的成功,我们仍觉得现有的识别方法不是很适合文本识别。主要原因有两个。第一个是,单词和文本行的边缘框经常是有更大的横纵比吧。一些非拉丁文字没有词与词之间的空隙,因此会产生更大的横纵比。第二个原因是,不像传统的物体,文本通常有清晰的角度定义。因此能产生旋转的边界框对文本识别来说很重要。然而,大部分物体识别方法都没有设计这样的框。

为了克服这个挑战,我们从另一个角度处理这个问题。我们提出把长文本分成两个更小的局部可识别的元素,命名为segment和link。一个segment是一个旋转的盒子,覆盖了单词或者文本行的一部分。一个link连接一组临近的segment,指示他们是否属于同一个单词或文本行。在这样的顶一下,一个单词是通过一系列segment和他们之间的links来定位的。在识别过程中,segment和links通过卷积神经网络在输入图像上进行识别。根据links的情况下,segments会被组合成完整的单词们。

这个方法的主要优点是长的旋转过的文本可以被拘局部识别,因为两个基础元素都是locally-detectable的:识别一个segment并不需要观察所有的单词。而两个segment间的连接也是可以从有一个局部文本中得到的,所以识别link也不需要观察所有的单词。因此,我们可以识别各种长度和角度的文本。

具体地来说,我们提出了一个卷积神经网络模型来同时识别segment和links。这个网络使用使用vgg-16为骨干,又添加了一些额外的特征层。卷积预测器被加到六个特征层上,用来在不同层级识别segment和link。为了处理冗余的识别结果,我们引入了两种link,一个叫做within-layer links 层内link,另一种叫cross-layer links,层间link。一个层内link连接segment和它的同一层的邻居,一个层间link连接一个segment和它的更低一层的邻居。这样,我们不仅连接临近位置的segment,也连接临近层级的segment。最后,我们使用深度优先算法来寻找连接起来的segments并且把它们组合成完整的单词们。

我们的主要贡献是一个新的segment-linking识别方法。实验表明,我们的方法具有多个明显的优点:1.稳定性。seglink用一个简单优雅的方法建立旋转文本的结构,应对复杂背景也能显示出稳定的结果。我们的模型在标准数据集上实现了相当有竞争力的结果。2.高效性。seglink是一个非常搞笑的模型。它能够在一秒内处理20张512x512的图像。3.泛化性。不需要进行修改,seglink就也可以用来识别非拉丁文的长文本,比如中文。

Segment Linking

我们的方法使用前馈CNN模型来识别文本。给定一个$w_I\times h_I$大小的输入图片,这个模型输出一系列的segments和links,之后通过置信度进行筛选并组合成完整的边界框。一个边界框是一个旋转的长方形,通过$b=(x_b,y_b,w_b,h_b,\theta_b)$表示,其中$x_b,y_b$是中心点的坐标,$w_b,h_b$是宽和高,$\theta_b$是旋转角度。

CNN模型

我们的网络使用一个预训练的vgg-16网络作为骨干(卷积层1到5)。vgg-16的全连接层(fc6 to conv6;fc7 to conv7)被换成卷积层。之后还有一些额外的卷积层(conv8_1 to conv11),可以提取更深的特征 并且感受野也更大。

segments和links在六个特征层被识别,包括conv4_3,conv7,conv8_2,conv9_2,conv10_2和conv11。这些特征层可以提供高质量的深层不同粒度的特征(conv4_3最精细,conv11最粗糙)。一个3x3核的卷积预测器被加到这六个层上,从而识别segments和links,我们用$l=1,...6$来作为这几个特征层和预测器的下标。

Segment Detection

segment也是旋转的框,用$s=(x_s,y_s,w_s,h_s,\theta_s)$来表示。我们通过检测一些默认框在输入图像上的置信度和位置偏移量来识别segment。每个默认框都和一个特征图的位置有关,它的分数和偏移量是从在这个位置的特征得到的。为了简化,一个默认框只和一个特征图位置相联系。

考虑特征图大小为$w_l\times h_l$的第$l$个特征层。在这个图上的位置(x,y)与中心位置在$(x_a,y_a)$的默认框对应,其中
$$ x_a=\frac{w_I}{w_l}(x+0.5); y_a=\frac{h_I}{h_l}(y+0.5) $$
默认框的宽和高都设定成常数$a_l$。

卷积预测器会产生七个通道作为segment识别。其中,2个通道会通过softmax来得到(0,1)之间的segment分数。剩下的5个是位置偏移量。考虑位置(x,y),我们用$(\Delta x_s,\Delta y_s,\Delta w_s,\Delta h_s,\Delta \theta_s) $定义在这个位置的矢量。则在这个位置的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 $$
在这里,常数$a_l$控制者输出到segment的层级。他需要根据第$l$-th的感受野大小来决定。我们使用一个empirical equation来选择这个数,$a_l=\gamma\frac{w_I}{w_l},\gamma=1.5$

层内link识别

一个link连接一对相邻的segment,指示他们是否属于同一个词。这里,相邻的segments指的是被识别在特征图上相邻位置的segment。links不仅对将segments组合成完整单词很重要,也能帮我们分离两个相近的单词-两个相近单词之间的link应该为预测为负。

我们识别segments之间的link用的是和识别segment时一样的特征。因为我们在特征图上的一个位置只识别一个segment,所以segments可以用它们在特征图上的位置和层的下标来区分,定义为$s^{(x',y',l)}$。我们把一个segment的层内邻居定义为它的同一特征层上的八个相邻的邻居。
$$ N_{s^{(x,y,l)}}^w=\{ s^{(x',y',l)}\}_{x-1<=x'<=x+1,y-1<=y'<=y+1}\s^{(x,y,l)} $$
segment是可以在局部被识别的,一对邻居segments在输入图像上也是相邻接的。links也是通过卷积预测器来识别的。一个预测器为8邻域的邻居segments的links输出16个通道。每两个通道经过softmax来计算link的分数。

层间link识别

在我们的网络中,segments是在不同层级的不同特征层识别的。Each layer handles a range of scales. 我们让这些范围相互重叠从而不会漏掉边缘上部分。但是这样的话,同一个单词的segment可能就会同时在多个层级被识别到,从而造成了冗余。

为了解决这个问题,我们提出了另一种links,称为层间link。一个层间link连接在拥有相邻下标的两个特征层的segments。比如说,在conv4_3和conv7之间的层间link被识别到,因为它们的index是$l=1, l=2$。

由于下采样才做,前一层的大小总是后一层的两倍,这是一个重要的特征。这个特性只在所有的特征层都是偶数大小的时候成立。在实践中,我们通过将输入图像设定成可整除128的方式来确保这个特性。比如说一个1000x800的图像会被变形为1024x768,一个最接近的有效大小。

我们将一个segment的层间邻居定义为:
$$ N_{s^{(x',y',l-1)}}^c=\{s^{(x',y',l-1)} \}_{2x<=x'<=2x+1,2y<=y'<=2y+1} $$
每一个segment都有四个层间邻居。这个关系是由层间的倍数大小关系确定的。

层间link是由卷积预测器来识别的。这个预测器为层间link输出八个通道。每两个通道都经过softmax来产生层间link的分数。层间link在特征层$l=2...6$,但不在$l=1$(conv4_3)上识别,因为这一层没有前特征层。

层间links可以连接不同层级的segment并在之后将它们合并。同传统的非极大值抑制相比,层间link提供了一个传统的减少冗余的方法(joining redundancies翻译好奇怪)。此外,它无缝融入我们的linking策略并且在这样的框架下很容易实现。

卷积预测器的输出

一个预测器是通过将几个用来规范化segment和link的分数的softmax层接在卷积层后面实现的。因此,我们网络中的所有的层都是卷积层,我们的网络是一个全卷积网络。

Combining segments with links

前馈后,这个网络产生了一些segments和links(数量取决于图像大小)。在组合前,输出的segment和links要用置信分数进行筛选。我们为segment和link设置不同的过滤下限,比如$\alpha$和$\beta$。从经验来看,我们模型对这个下限值的设定并不非常敏感,一个0.1的偏移只会造成1%的f-measure的降低。

将过滤完的segments作为节点,过滤的link作为边,我们可以构造出一个图。然后用深度优先搜索来找到它的连接组件。每个组件都包括一组通过link连接的segments。合并算法流程如下:

  1. 将同一行的segment取出来
  2. 对这些segment的中心点作最小二乘法线性回归,得到一条直线
  3. 每个segment的中心点往这条直线作垂直投影。
  4. 在所有投影点中取出距离最远的两个点,记为$(x_p,y_p),(x_q,y_q)$
  5. 最终文本框,中心点位置为$(\frac{x_p+x_q}{2},\frac{y_p+y_q}{2})$,宽度为最远的两个点的距离加上各自所在的segment的宽度的一半$(w_p/2+w_q/2)$,高度为所有segment的高度的平均值。

训练

Segment和link的真实数据

整个网络的训练是直接根据segments和links的真实标签训练的. 这些数据包括所有默认框的标签(i.e.它们对应的segment的标签),它们与默认框的这种和所有的层内link与层间link的标签。我们通过单词的边界框数据来计算他们。

首先,我们假设在输入图片上只有一个标记单词。一个默认框会被标记为positive当且仅当: 1. 这个框的中心在单词的边界框里面;2. 边界框的大小$a_l$和单词高度$h$满足:
$$ max(\frac{a_l}{h},\frac{h}{a_l})<=1.5 $$
否则,这个默认框就会被标记为negative。

接下来我们考虑多个词的情况。一个默认框如果对所有的词都不满足以上提到的条件,它就会被标记为negative。如果不是,它就会被标记为positive并且和大小最相近的单词匹配。

偏移量是在positive默认框上计算的。首先,我们计算segment的标定数据:

  1. 选择一个正样本的默认框。
  2. 将文本框顺时针旋转$\theta$,使其成为水平框。
  3. 在得到的水平框里截取默认框大小的区域。
  4. 根据街区后的水平框,沿着中心点逆时针旋转$\theta$。

计算出segment后,根据之前提到的公式,就可以计算出偏移量。

一个link(包括层内link和层间link)会被标记为positive当且仅当:1. 两个被它连起来的默认框都是postive的。2. 两个默认框是匹配的同一个单词。

优化

目标

我们的网络模型是通过同时最小化segment分类损失、偏移量回归损失、link分类损失来训练的。总而言之,损失函数是这是三个损失的加权和。
$$ L(y_s,c_s,y_l,c_l,\hat{s},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的标签。如果i-th个默认框被标记为正,则$y_s^{(i)}=1$,否则$y_s^{(i)}=0$。同样的,$y_l$是所有links的标签。$L_{conf}$是预测的segmen和link的置信分数的softmax损失,分别用$c_s,c_l$表示。$L_{loc}$是预测的segment位置$\hat{s}$和标定数据$s$之间的平滑L1回归损失。

segment的分类损失和回归损失都通过$N_s$(positive默认框的数量)标准化,link的损失通过positive link的数量$N_l$标准化。权重都先设定为1。

难分样本挖掘(hard negative mining)

对于segments和links,nagative的部分占据了训练样本的大部分。因此,难分样本挖掘在平衡正负样本数量上是非常重要的。我们使用在线难分样本挖掘方法来保持negative和postive的比例最多为3:1。segment和link的难分样本挖掘是分开进行的。

数据增强

我们采用了和SSD和YOLO中使用过的相似的数据增强流程。Training images are randomly cropped to a patch that has a minimum Jaccard overlap of o with any groundtruth word Crops are resized to the same size before loaded into a batch. (死活翻译不通,我难死了)。对于旋转的文本,我们对单词的包围框按坐标轴方向进行扩增。对每个样本,重叠参数$o$随机从$0,0.1,0.3,0.7,0.9$中进行选择。裁剪的大小随机在原图像大小的[0.1,1]间进行选择。训练图片并不进行水平翻转。

实验

在这两个部分,我们在三个数据集上检测我们的方法:ICDAR2015,MSRA-TD500和ICDAR2013,我们使用每个数据集的标准评估准则。

数据集

自然场景的SynthText:包含800000合成的训练数据。这是图像是通过混合自然图像和随机字体、大小、方向、颜色的文本,为了让图像看起来更真实,文本在图像上的位置是认真挑选过的。这个数据集提供了对字母、单词、文本行的细节的标注。我们使用这个数据集对我们的网络进行预训练。。

ICDAR 2015:是ICDAR 2015挑战4的数据集。这个数据集实在不考虑位置、图像质量、视角的情况下拍摄的。因此,这个数据集中的图像在文字角度、比例和分辨率等方向都有很大的差异,使得它比之前挑战的数据集更难以处理。这个数据集包括1000张训练图像和500张测试图像。Annotations are provided as word quadrilaterals.

MSRA-TD500:这是第一个专注旋转文本的标准数据集。这个数据集中也包括多种语言,比如说中文和英文。这个数据集包括300张训练图像和200张测试图像。和IC15,不同的是,TD是在文本行层面作注释的。

ICDAR 2013:大部分都是水平文本,其余的有一点角度。这个数据集之前被广泛的用来测试文本识别方法。这个数据集包括229个训练图像和233个测试图像。

实现细节

我们的网络在SynthText上进行预训练并且在真实数据上调整过。这个网络通过带动量的SGD进行优化,参数选择0.9。在预训练和精调中,图像都在随机裁剪后被改为为384x384的大小。因为我们的模型是全卷积的,我们能在一个大小上训练它,然后在测试的时候再使用其余的大小。批的大小被设置为32。在预训练中,前60k迭代的学习率被设定为0.001,然后再剩下的30k迭代则使用0.0001的学习率。迭代次数由数据集大小决定。

考虑到精确率和召回率的折衷和不同数据集中检测标准的不同,我们选了最好的阈值$\alpha$和$\beta$来优化f-Measure。除了IC15,在其他数据集上的阈值也是通过网格搜索来确定的。IC15并没有提供线下的检测方法,所以唯一的方法是将结果提交给服务器。

我们的模型通过tensorflow r0.11实现。所有的实验都在拥有Xeon 8核cpu和4 泰坦X显卡和 64GB RAM的工作站上进行。同时在4个GPUs上进行训练,训练一个批次需要0.5s。整个训练过程用时不到一天。

局限性

SegLink的一个局限性是两个阈值$\alpha$和$\beta$都需要被手动设置。在实际操作中,最优值是通过网格搜索来确定的。如何简化这些参数将成为我们未来的一个工作方向。另一个问题是,SegLink没办法识别具有很大的空白的文字。links能连接相邻的segments,却没办法连接距离较远的segments。

SegLink也不能识别弯曲的。但我们相信我们能解决。

结论

我们提出了SegLink,一个通过简单却高效的CNN模型实现的文本识别方法。它在水平、选择、多语言数据集上的优越表现显示出它的准确、快捷和灵活。在未来,我们会尝试研究它在弯曲文本上的扩展,我们也希望能将它延展为一个端对端的识别系统。

相关文章
|
6月前
|
计算机视觉
YOLO 目标检测 识别框不显示文字标签(已解决)
YOLO 目标检测 识别框不显示文字标签(已解决)
|
文字识别 算法 数据挖掘
文本检测 DBNet
文本检测 DBNet
340 0
|
16天前
|
机器学习/深度学习 算法 计算机视觉
人像检测的结果数据都有什么属性?
【10月更文挑战第26天】人像检测的结果数据都有什么属性?
25 1
|
3月前
|
文字识别 算法 固态存储
OCR -- 文本检测
OCR -- 文本检测
34 0
|
4月前
|
文字识别
文本,文字识别,PaddleOCR,如何删除,PaddleOCR详解,检测,方向分类器,识别,检测的意思是检查字符的位置,查像素坐标,方向分类器,能够实现180度的图像,字符识别是把识别字符
文本,文字识别,PaddleOCR,如何删除,PaddleOCR详解,检测,方向分类器,识别,检测的意思是检查字符的位置,查像素坐标,方向分类器,能够实现180度的图像,字符识别是把识别字符
|
机器学习/深度学习 自然语言处理 算法
解读未知:文本识别算法的突破与实际应用
解读未知:文本识别算法的突破与实际应用
解读未知:文本识别算法的突破与实际应用
|
人工智能 数据挖掘 PyTorch
VLE基于预训练文本和图像编码器的图像-文本多模态理解模型:支持视觉问答、图文匹配、图片分类、常识推理等
VLE基于预训练文本和图像编码器的图像-文本多模态理解模型:支持视觉问答、图文匹配、图片分类、常识推理等
VLE基于预训练文本和图像编码器的图像-文本多模态理解模型:支持视觉问答、图文匹配、图片分类、常识推理等
|
机器学习/深度学习 算法 计算机视觉
计算机视觉 文本检测与文本识别 (一)
计算机视觉 文本检测与文本识别 (一)
143 0
|
机器学习/深度学习 文字识别 计算机视觉
文本识别 CRNN
文本识别 CRNN
307 0
|
数据采集 Python
一日一技:如何识别一张图片的格式
一日一技:如何识别一张图片的格式
228 0