EAST(论文翻译)

EAST:高效而准确的场景文本检测

Abstract

以前的场景文本检测方法已经在各种基准测试中取得了良好的效果。然而,即使配备深度神经网络模型,它们在处理具有挑战性的场景时也通常具有不足之处,因为整体性能取决于pipelines中multiple stages和components的相互作用。在本文中,我们提出了一个简单而强大的pipeline,可以在自然场景中进行快速准确的文本检测。Pipeline直接预测图像中任意方向和矩形形状的文本或文本行,通过单个神经网络消除不必要的中间步骤(例如候选聚合和单词分割)。Pipelined的简单性使我们能够集中精力设计损失函数和神经网络结构。通过ICDAR2015,COCO-Text和MSRA-TD500的标准数据集实验表明,所提出的算法在准确性和效率方面都明显优于当前最先进的方法。在ICDAR 2015数据集中,所提出的算法在720p分辨率下以13.2fps获得0.7820的F-score

1. Introduction

最近,提取和理解在自然场景中的文本信息变得越来越重要和普遍,ICDAR系列竞赛的参与者的数量 [30,16,15]以及NIST发起的TRAIT 2016评估都证明了这一点[1]。

文本检测作为后续过程的前提条件,使得其在文本信息提取和理解的整个过程中起着至关重要的作用。以前的文本检测方法[2,33,12,7,48]已经在该领域的各种基准上取得了进步。文本检测的核心是设计区分文本和背景的功能。传统方法使用手动设计特征[5,25,40,10,26,45]以捕捉场景文本的属性,而现在基于深度学习的方法[3,13,11,12,7,48]使得有效特征可以直接从训练数据中学习。

然而,现有的方法,无论是传统的还是基于深度神经网络的方法,大多由multiple stages and components组成,这些multiple stages and components可能是次优的并且耗时的。因此,这些方法的准确性和效率还远远不能令人满意。

在本文中,我们提出了一个快速而准确的场景文本检测pipeline,它只有两个阶段。该pipeline基于全卷积网络(FCN)模型,直接产生文本框预测,排除冗余和慢速的中间步骤。生成的文本预测(可以是旋转矩形或矩形)会经过非极大值抑制以产生最终结果。根据基准数据集的定性和定量实验,与现有方法相比,该算法性能显着提高,运行速度更快。

本文的贡献有三个方面:

1. 我们提出了一个由两阶段组成的场景文本检测方法:全卷积网络阶段和NMS阶段。FCN直接生成文本区域,不包括冗余和耗时的中间步骤。

2. 该pipeline可灵活生成wordlevel或line level预测,其几何形状可为旋转框或矩形。

3. 所提出的算法在准确性和速度上明显优于最先进的方法。

2. Related Work

场景文本检测和识别一直是计算机视觉领域长期活跃的研究课题。许多新奇的想法和有效的方法[5,25,26,24,27,37,11,12,7,41,42,31]已被提出。详细的分析可以在survey papers[50,35,43]中获得。本节将重点介绍与算法相关的主要工作。

传统方法依赖于手动设计特征。Stroke Width Transform(SWT)[5]和Maximally Stable Extremal Regions(MSER)[25,26]的方法通常通过边缘检测或极值区域提取寻找候选字符。Zhang等人[47]利用了文本的局部对称性,设计了文本区域检测的各种特征。FASText[2]是一种快速文本检测方法,适用于修改众所周知的FAST关键点检测器以进行stroke提取。然而,就精度和适应性而言,这些方法落后于那些基于深度神经网络的方法,特别是在处理具有挑战性的场景时,如低分辨率和几何失真

最近,场景文本检测领域进入了一个新的时代,即基于深度神经网络的算法[11,13,48,7]已逐渐成为主流。 Huang等人[11]首先找到了使用MSER的候选框,然后使用深层卷积网络作为强分类器来调整false positives。 Jaderberg等人的方法[13]以滑动窗口的方式扫描图像,并使用卷积神经网络模型为每个尺寸生成密集的heat特征图。后来,Jaderberg等人[12]同时使用CNN和ACF来寻找候选文本框,并使用回归对其进行细化调整。Tian等人[34]开发vertical anchors,并构建CNN-RNN联合模型来检测水平文本框。与这些方法不同的是,Zhang等人[48]提出利用FCN[23]生成heat特征图,并使用component projection进行方向估计。这些方法在基准测试中获得了良好的性能。但是,正如图2(a)所示,它们大多由多个阶段和组成部分组成,例如通过post filtering的false positive清除,candidate aggregation,line formation和word partition。多阶段和组件可能需要彻底调整,因为其可能导致次优性能,并增加整个pipeline的处理时间。

在本文中,我们设计了一个基于FCN的深度pipeline,直接针对文本检测的最终目标:文字或文本级别的检测。如图2(e)所示,该模型放弃了不必要的中间组件和步骤,并允许进行端到端的训练和优化。由此产生的框架是轻量级的单个神经网络,在性能和速度上都明显优于所有以前的方法。

3. Methodology(算法)

该算法的关键component是一个神经网络模型,它被训练直接预测文本instances及其几何形状。该模型是一种适用于文本检测的全卷积神经网络,可输出文本或文本行的密集per-pixel预测。这消除了候选建议框,文本区域形成和文字分区等中间步骤。后处理步骤仅包括预测几何形状上的阈值和NMS。该检测器被命名为EAST(Efficient and AccuracyScene Text),因为它是一个高效和准确的场景文本检测pipeline。

3.1 Pipeline

图2(e)说明了我们pipeline的概述。该算法遵循DenseBox的一般设计[9],其中图像被送到FCN中并且生成像素级的文本分数特征图和几何图形特征图的多个通道。

其中一个预测通道是分数特征图,其像素值范围是[0,1]。其余预测通道表示从每个像素的角度来看包围文本的几何图形。该分数代表在相同位置预测的几何形状的置信度。

我们对文本区域采用了两种几何形状:旋转框(RBOX)和矩形(QUAD),并为每个几何形状设计了不同的损失函数。然后将阈值应用于每个预测区域,其中评分超过预定阈值的几何形状被认为是有效的,并且保存以用于随后的非极大抑制。NMS之后的结果被认为是pipeline的最终结果。

3.2 Network Design

设计用于文本检测的神经网络时必须考虑几个因素。由于如图5所示,文本区域的大小差别很大,因此确定大文本的存在将需要来自神经网络后期的特征,而预测包含小文本的准确几何形状需要早期的低级别特征。因此,网络必须使用不同级别的特征来满足这些要求。HyperNet [19]在特征图上符合这些条件,但是在大型特征图上合并大量通道会显着增加后期计算开销。

为了弥补这一点,我们采用U-shape[29]的思想逐步合并特征图,同时保持上采样分支较小。共同建立一个网络,既可以利用不同级别的特征,又可以节省很少的计算成本。

我们模型的示意图如图3所示。该模型可以分解为三个部分:特征提取stem,特征合并branch和输出层.


特征提取stem可以是在ImageNet[4]数据集上预先训练的卷积网络,具有interleaving卷积层和池化层。从特征提取stem中提取四个级别的特征图(记为fi),其大小分别为输入图像的1/32 1/16 1/8和1/4。即图3中的PVANet[17]。在我们的网络模型中,也采用了众所周知的VGG16[32]模型,其中提取了将pooling-2合并到pooling-5后的特征图。

在特征合并branch中,我们逐渐合并它们:


其中gi是合并基础,hi是合并的特征图,运算符[·;·]表示沿通道轴的连接。在每个合并阶段,来自最后一个阶段的特征图首先被输入到一个unpooling层来扩大其大小,然后与当前特征图进行连接。接下来,通过conv1×1 bottleneck[8]减少通道数量和计算量,接下来是conv3×3,将信息融合以最终产生该合并阶段的输出。在最后一个合并阶段之后,conv3×3层会生成合并分支的最终特征图并将其送到输出层。

每个卷积的输出通道数量如图3所示。我们保持分支中卷积的通道数较少,这只增加了stem的一小部分计算开销,但使网络计算效率更高。最终的输出层包含若干个conv1×1操作,以将32个通道的特征图投影到1个通道score 特征图 Fs和一个多通道几何图形Fg。几何形状输出可以是RBOX或QUAD中的任意一种,总结在Tab.1


    对于RBOX的几何形状由4个通道的轴对齐边界框(AABB)R和1个通道的旋转角度θ表示。R的公式与[9]中的公式相同,AABB 4个通道分别表示从像素位置到矩形的顶部,右侧,底部,左侧边界的4个距离。

对于QUAD,我们使用8个数字来表示从矩形的四个顶点到像素位置的坐标偏移。由于每个距离偏移量都包含两个数字(Δxi;Δyi),因此几何形状输出包含8个通道。

图4.标签生成过程:(a)文本矩形(黄色虚线)和缩小的矩形(绿色实线); (b)文本score 特征图; (c)RBOX几何图生成; (d)每个像素到矩形边界的4个通道距离; (e)旋转角度。

3.3 Label Generation

3.3.1 Score Map Generation for Quadrangle

不失一般性,我们只考虑几何图形是矩形的情况。分数图上的四边形的正面区域被设计为大致缩小版本的原始区域,如图4(a)所示。

对于矩形Q;其中pi是顺时针顺序的矩形顶点。为了缩小Q,我们首先计算每个顶点pi的参考长度ri

D(pi,pj)是pi和pj的L2距离。

我们首先收缩一个矩形的两个较长的边,然后缩小两个较短的边。对于每一对两个操作边,我们通过比较它们的长度的平均值来确定“较长”的一对。对于每个边,我们通过将它的两个端点分别向内移动0.3ri和0.3r(i mod4)+1来收缩它。

3.3.2 Geometry Map Generation

正如在3.2中讨论的。几何图是RBOX或QUAD中的一种。图4(c-e)说明了RBOX的生成过程。

    对于其文本区域以QUAD格式标注的数据集(例如ICDAR 2015),我们首先生成一个旋转矩形,以最小面积覆盖该区域。然后,对于每个有正分数的像素,我们计算它与文本框4个边界的距离,并将它们放到RBOX ground truth的4个通道中。对于QUAD ground truth,8通道几何图形每个像素的正分数值是它与四边形4个顶点的坐标偏移。

3.4 Loss Functions

损失函数可以被公式化为:

其中Ls和Lg分别表示分数图和几何图的损失λg表示两个损失之间的重要性。在我们的实验中,我们将λg设置为1。

3.4.1 Loss for Score Map

在大多数最先进的检测pipelines中,训练图像通过均衡采样和hard negative mining,以解决目标的不均衡分布[9,28]。这样做可能会提高网络性能。然而,使用这种技术不可避免地会引入一个不可区分的阶段和更多的参数来调整和更复杂的pipeline,这与我们的设计原则相矛盾。

为了简化训练过程,我们使用[38]中介绍的类平衡交叉熵(用于解决类别不平衡训练,β=反例样本数量/总样本数量),由下式给出

其中Y^=Fs是分数图的预测,Y*是ground truth。参数β是正和负样本之间的平衡因子,由下式给出

这种平衡的交叉熵损失首先被Yao等人在文本检测中采用。[41]作为分数图预测的目标函数。我们发现它在实践中表现良好。

3.4.2 Loss for Geometries

文本检测的一个挑战是自然场景图像中文本的大小差别很大。直接使用L1或L2损失进行回归会导致损失偏向较大和较长的文本区域。由于我们需要为大文本区域和小文本区域生成适当的文本几何预测,因此回归损失应该是比例不变的。因此,对于RBOX回归,采用AABB部分的IoU损失。对于QUAD回归,采用scale-normalized平滑L1损失。

RBOX对于AABB部分,我们采用[46]中的IoU损失,因为它对不同尺寸的物体是不变的。

其中R ^表示预测的AABB几何形状,R *是其相应的groundtruth。计算相交矩形的宽度和高度

其中d1,d2,d3和d4分别表示从一个像素到其对应矩形的顶部,右侧,底部和左侧边界的距离。并集区域获得通过:

因此,可以很容易地计算出intersection/union区域。接着,计算旋转角度的损失

其中θ^是对旋转角度的预测,并且θ*表示ground truth。最后,总体几何损失是AABB损失和角度损失的加权和,由下式给出

请注意,我们计算LAABB而不考虑旋转角度。当完全预测角度时,这可以看作是矩形IoU的近似值。尽管在训练期间情况并非如此,但它仍然可以为网络施加正确的梯度以学习预测R.

QUAD 我们通过增加一个额外的标准化项来扩展文献[6]中提出的平滑L1损失,这项是为文本矩形框设计的,这项通常在一个方向上较长。让Q的所有坐标值都是一个有序集合

损失可以被写为

其中归一化项NQ*是四边形的短边长度,由下式给出

PQ是具有不同顶点排序的Q*的所有equivalent四边形的集合。 由于公共训练数据集中四边形的注释不一致,因此需要排序。

3.5 Training

网络使用ADAM[18]优化器进行端对端训练。为了加快学习速度,我们统一输入图像为512x512,产生24尺寸的小批次。ADAM的学习速率从1e-3开始,每27300小批次衰减到十分之一,并停在1e-5。训练网络直到性能停止改善为止。

3.6 Locality-Aware NMS(局部感知NMS)

为了形成最终结果,阈值处理后的几何图形应该由NMS合并。一个简单的NMS算法在O(n^2)中运行,其中n是候选框的数量,这是不可接受的,因为我们会面临来自密集预测的成千上万个几何框。

在假设来自附近像素的几何图形倾向于高度相关的情况下,我们提出逐行合并几何图形,并且在合并同一行中的几何图形时,我们将迭代合并当前遇到的几何图形与最后一个合并图形。这种改进的技术在场景中以O(n)运行。尽管最糟糕的情况与最初的情况相同,只要局部性假设成立,算法在实践中运行得足够快。该过程在算法1中进行了总结。

值得一提的是,在WEIGHTEDMERGE(g;p)中,合并的四边形坐标是通过两个给定四边形的得分进行加权平均。具体而言,如果a= WEIGHTEDMERGE(g; p),则ai=V(g)gi + V(p)pi和V(a)= V(g)+ V 下标i的坐标,而V(a)是几何a的分数。

事实上,我们“平均”而不是“选择”几何形状存在微妙的差异,就像标准的NMS程序所做的那样,它充当投票机制,反过来在馈送视频时引入稳定效应。尽管如此,我们仍然采用“NMS”这个词来描述功能。

4. Conclusion and Future Work

我们已经提出了一个场景文本检测器,它可以利用单个神经网络从完整图像直接生成文本框预测。通过合并适当的损失函数,检测器可以预测文本区域的旋转框或矩形框,具体取决于具体应用。标准基准上的实验证实,所提出的算法在准确性和效率方面基本上优于先前的方法。

未来研究的可能方向包括:(1)调整几何公式以允许直接检测曲线文本; (2)将检测器与文本识别器集成; (3)将想法扩展到一般对象检测。


建立模型的过程: 

#获得文本框的预测分数和几何图形
def model(images, weight_decay=1e-5, is_training=True):
    '''
    define the model, we use slim's implemention of resnet
    '''
    images = mean_image_subtraction(images)

    with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)):
        logits, end_points = resnet_v1.resnet_v1_50(images, is_training=is_training, scope='resnet_v1_50')

    with tf.variable_scope('feature_fusion', values=[end_points.values]):
        batch_norm_params = {
        'decay': 0.997,
        'epsilon': 1e-5,
        'scale': True,
        'is_training': is_training
        }
        with slim.arg_scope([slim.conv2d],
                            activation_fn=tf.nn.relu,
                            normalizer_fn=slim.batch_norm,
                            normalizer_params=batch_norm_params,
                            weights_regularizer=slim.l2_regularizer(weight_decay)):
            #提取四个级别的特征图(记为fi)
            f = [end_points['pool5'], end_points['pool4'],
                 end_points['pool3'], end_points['pool2']]
            for i in range(4):
                print('Shape of f_{} {}'.format(i, f[i].shape))

            #基础特征图
            g = [None, None, None, None]

            #合并后的特征图
            h = [None, None, None, None]

            #合并阶段每层的卷积核数量
            num_outputs = [None, 128, 64, 32]

            #自下而上合并特征图
            for i in range(4):
                if i == 0:
                    h[i] = f[i]
                else:
                    #先合并特征图,再进行1*1卷积 3*3卷积
                    c1_1 = slim.conv2d(tf.concat([g[i-1], f[i]], axis=-1), num_outputs[i], 1)
                    h[i] = slim.conv2d(c1_1, num_outputs[i], 3)

                if i <= 2:
                    #上池化特征图
                    g[i] = unpool(h[i])
                else:
                    g[i] = slim.conv2d(h[i], num_outputs[i], 3)
                print('Shape of h_{} {}, g_{} {}'.format(i, h[i].shape, i, g[i].shape))

            #输出层
            # here we use a slightly different way for regression part,
            # we first use a sigmoid to limit the regression range, and also
            # this is do with the angle map
            #获得预测分数的特征图,与原图尺寸一致,每一个值代表此处是否有文字的可能性
            F_score = slim.conv2d(g[3], 1, 1, activation_fn=tf.nn.sigmoid, normalizer_fn=None)

            # 4 channel of axis aligned bbox and 1 channel rotation angle
            #获得旋转框像素偏移的特征图,有四个通道,分别代表每个像素点到文本矩形框上,右,底,左边界的距离
            geo_map = slim.conv2d(g[3], 4, 1, activation_fn=tf.nn.sigmoid, normalizer_fn=None) * FLAGS.text_scale
            #获得旋转框角度特征图 angle is between [-45, 45]
            angle_map = (slim.conv2d(g[3], 1, 1, activation_fn=tf.nn.sigmoid, normalizer_fn=None) - 0.5) * np.pi/2
            #按深度连接旋转框特征图和角度特征图
            F_geometry = tf.concat([geo_map, angle_map], axis=-1)

    return F_score, F_geometry

#获得预测得分损失
def dice_coefficient(y_true_cls, y_pred_cls,
                     training_mask):
    '''
    dice loss
    :param y_true_cls:
    :param y_pred_cls:
    :param training_mask:
    :return:
    '''
    eps = 1e-5
    intersection = tf.reduce_sum(y_true_cls * y_pred_cls * training_mask)
    union = tf.reduce_sum(y_true_cls * training_mask) + tf.reduce_sum(y_pred_cls * training_mask) + eps
    loss = 1. - (2 * intersection / union)
    tf.summary.scalar('classification_dice_loss', loss)
    return loss

#获得总损失
def loss(y_true_cls, y_pred_cls,
         y_true_geo, y_pred_geo,
         training_mask):
    '''
    define the loss used for training, contraning two part,
    the first part we use dice loss instead of weighted logloss,
    the second part is the iou loss defined in the paper
    :param y_true_cls: ground truth of text
    :param y_pred_cls: prediction os text
    :param y_true_geo: ground truth of geometry
    :param y_pred_geo: prediction of geometry
    :param training_mask: mask used in training, to ignore some text annotated by ###
    :return:
    '''
    classification_loss = dice_coefficient(y_true_cls, y_pred_cls, training_mask)
    # scale classification loss to match the iou loss part
    classification_loss *= 0.01

    # d1 -> top, d2->right, d3->bottom, d4->left
    d1_gt, d2_gt, d3_gt, d4_gt, theta_gt = tf.split(value=y_true_geo, num_or_size_splits=5, axis=3)
    d1_pred, d2_pred, d3_pred, d4_pred, theta_pred = tf.split(value=y_pred_geo, num_or_size_splits=5, axis=3)
    #计算真实旋转框、预测旋转框面积
    area_gt = (d1_gt + d3_gt) * (d2_gt + d4_gt)
    area_pred = (d1_pred + d3_pred) * (d2_pred + d4_pred)
    #计算相交部分的高度和宽度  面积
    w_union = tf.minimum(d2_gt, d2_pred) + tf.minimum(d4_gt, d4_pred)
    h_union = tf.minimum(d1_gt, d1_pred) + tf.minimum(d3_gt, d3_pred)
    area_intersect = w_union * h_union
    #获得并集面积
    area_union = area_gt + area_pred - area_intersect
    #计算旋转框IOU损失、角度  加1为了防止交集为0
    L_AABB = -tf.log((area_intersect + 1.0)/(area_union + 1.0))
    L_theta = 1 - tf.cos(theta_pred - theta_gt)
    tf.summary.scalar('geometry_AABB', tf.reduce_mean(L_AABB * y_true_cls * training_mask))
    tf.summary.scalar('geometry_theta', tf.reduce_mean(L_theta * y_true_cls * training_mask))
    L_g = L_AABB + 20 * L_theta

    return tf.reduce_mean(L_g * y_true_cls * training_mask) + classification_loss


猜你喜欢

转载自blog.csdn.net/attitude_yu/article/details/80724187