east文本检测

一.简介

 近年来,提取和理解在自然场景中的文本信息变得越来越重要和普遍,ICDAR系列竞赛的参与者的数量以及NIST发起的TRAIT 2016评估都证明了这一点。文本检测作为文本识别、机器翻译等后续过程的前提条件,其核心是区分文本和背景。传统方法使用手动设计特征以获得文本属性,而现在基于深度学习直接从训练数据中学习有效特征,可获得更加鲁棒的高级特征。

        现有的无论是传统的还是基于深度神经网络的方法,大多由多个阶段组成,在准确性和效率还远远不能令人满意。因此,本文提出了一个快速而准确的轻量级场景文本检测pipeline,它只有两个阶段。该pipeline第一个阶段是基于全卷积网络(FCN)模型,直接产生文本框预测;第二个阶段是对生成的文本预测框(可以是旋转矩形或矩形)经过非极大值抑制以产生最终结果。该模型放弃了不必要的中间步骤,进行端到端的训练和优化。

 本文的贡献有三个方面:

1.提出了一个由两阶段组成的场景文本检测方法:全卷积网络阶段和NMS阶段。

2.该pipeline可灵活生成word level或line level上文本框的预测,预测的几何形状可为旋转框或水平框。

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

算法被命名为EAST(Efficient and Accuracy Scene Text),因为它是一个高效和准确的场景文本检测pipeline。

        首先,将图像送到FCN网络结构中并且生成单通道像素级的文本分数特征图和多通道几何图形特征图。文本区域采用了两种几何形状:旋转框(RBOX)和水平(QUAD),并为每个几何形状设计了不同的损失函数;然后,将阈值应用于每个预测区域,其中评分超过预定阈值的几何形状被认为是有效的,并且保存以用于随后的非极大抑制。NMS之后的结果被认为是pipeline的最终结果。

二.网络结构

因为文本区域的大小差别很大,所以定位大文本将需要更深层的特征(大感受野),而定位小文本则需要浅层特征(小感受野)。 因此,网络必须使用不同级别的特征来满足这些要求,但是在大型特征图上合并大量通道会显着增加后期计算开销。为了弥补这一点,本文采用U-shape的思想逐步合并特征图,同时保持上采样分支较小。共同建立一个网络,既可以利用不同级别的特征,又可以节省很少的计算成本。

       该网络结构可以分解为三个部分:特征提取,特征合并和输出层.

文中特征提取使用了PVANet和VGG16,下图是原文的网络结构图(PVANet)

 

                                 

论文的思想非常简单,结合了DenseBox和Unet网络中的特性,具体流程如下:

Pipeline:

  • 先用一个通用的网络(论文中采用的是Pvanet,实际在使用的时候可以采用VGG16,Resnet等)作为base net ,用于特征提取
  • 基于上述主干特征提取网络,抽取不同level的feature map(它们的尺寸分别是inuput-image的1/4,1/8,1/16,1/32),这样可以得到不同尺度的特征图.目的是解决文本行尺度变换剧烈的问题,ealy stage可用于预测小的文本行,late-stage可用于预测大的文本行.
  • 特征合并层,将抽取的特征进行merge.这里合并的规则采用了U-net的方法,合并规则:从特征提取网络的顶部特征按照相应的规则向下进行合并,这里描述可能不太好理解,具体参见下述的网络结构图
  • 网络输出层,包含文本得分和文本形状.根据不同文本形状(可分为RBOX和QUAD),输出也各不相同,具体参看网络结构图

1.特征提取

首先,利用在ImageNet数据集上预训练的卷积网络参数初始化;然后,基于模型从特征提取阶段中提取四个级别的特征图(记为fi),其大小分别为输入图像的1/32 1/16 1/8和1/4。

2.特征融合

进行特征的逐层合并。

                                        

在每个合并阶段,首先,将来自上一个阶段的特征图首先被输入到一个unpooling层来扩大其大小;然后,与当前层特征图进行合并(通道);最后,通过conv1×1 减少通道数量和计算量;conv3×3,将局部信息融合以最终产生该合并阶段的输出。在最后一个合并阶段之后,conv3×3层会生成合并分支的最终特征图并将其送到输出层。

最终特征图:M*N* 32

3.输出层

在M*N*32的feature map上用1*1的卷积进行输出操作。

包含若干个conv1×1操作,以将32个通道的特征图投影到1个通道的分数特征图Fs和一个多通道几何图形特征图Fg。

分数特征图score map:用1*1的1个卷积核,得到一个通道的score map,表示相应区域是文本区域的score

几何图形特征图geometry map:用1*1的卷积核得到RBOX和QUAD的

几何形状输出可以是RBOX或QUAD中的任意一种,如表所示:

                          

 其中,RBOX的几何形状由4个通道的水平边界框(AABB)R和1个通道的旋转角度θ表示;AABB 4个通道分别表示从像素位置到矩形的顶部,右侧,底部,左侧边界的4个距离;QUAD使用8个数字来表示从矩形的四个顶点到像素位置的坐标偏移,由于每个距离偏移量都包含两个数字(Δxi;Δyi),因此几何形状输出包含8个通道。

文中对文本框的定义有两种,一种是旋转矩形(RBOX),另一种是四边形(QUAD)。

对于RBOX的表示法,有如下解释:

得到最终的feature map后,使用一个大小为1×1通道数为1的卷积核得到一张score map用F_s表示。在feature map上使用一个大小为1×1通道数为4的卷积核得到text boxes,使用一个大小1×1通道数为1的卷积核得到text rotation angle,这里text boxes和text rotation angle合起来称为geometry map用Fg示。

关于上述的F_s,F_g,要说明几点(如下图2所示):

  • F_s大小为原图的\frac{1}{4},通道数为1,每个像素表示对应于原图中像素为文字的概率值,所以值在[0,1]范围内。
  • F_g大小也为原图的\frac{1}{4},通道数为5,即4+1(text boxes + text rotation angle)。
  • text boxes通道数为4,其中text boxes每个像素如果对应原图中该像素为文字,四个通道分别表示该像素点到文本框的四条边的距离,范围定义为输入图像大小,如果输入图像为512,那范围就是[0,512]。下图d表示
  • text rotation angle通道数为1,其中text rotation angle每个像素如果对应原图中该像素为文字,该像素所在框的倾斜角度,角度范围定义为[-45,45]度。下图e表示

                                 

 (a) 中黄色的为人工标注的框,绿色为对黄色框进行0.3倍边长的缩放后的框,这样做可以进一步去除人工标注的误差,拿到更准确的label信息。

(b) 为根据(a)中绿色框生成的score map的label信息

(c) 中先生成一个(b)中白色区域的最小外接矩,然后算每一个(b)中白色的点到粉色最小外接矩的上下左右边的距离,即生成(d),然后生成粉色的矩形和水平方向的夹角,即生成角度信息(e),e中所有灰色部分的角度信息一样,都是同样的角度。

训练标签的生成

训练标签由两个部分组成,一个是score map的标签,一个是geometry map标签。
注意:程序要求输入的四边形标定点是以顺时针方向标定的,这点很重要

1. score map标签的生成方法

  • 首先生成一个与图片大小一样的矩阵,值都为0
  • 根据标定好的四边形框对该四边形框进行缩小,缩小方法下面会详细说明,得到最终结果如上图a中的绿框
  • 将绿框中的像素赋值1表示正样本的score,其他为负样本的score
  • 最后按照每隔4个像素采样,得到图片大小\frac{1}{4}的score map

上述缩小四边形的方法:

  • 首先定义四个顶点Q=\left\{p_{i} | i \epsilon\{1,2,3,4\}\right\},这四个顶点按照顺时针方向排列
  • 计算缩小的参考大小如下式所示,下式表示的是选取与顶点相连的两条边中最小的边的大小记为r_i                                                               其中D(p_i,p_j)表示点p_ip_j之间的L2距离
  • 对于边p_{i}, p(i m o d 4)+1,缩小0.3r_i0.3r_{(i \,mod \, 4) +1}的和的像素大小

2. geometry map标签的生成方法

  • 首先生成一个与图片大小一样的5通道矩阵用来制作text boxes 与 text rotation angle
  • 根据标定的四边形生成一个面积最小 的平行四边形(黄色框),进而得到平行四边形的外接旋转矩形(粉色框)
  • 根据旋转矩形的四个点坐标,可以选择出y值最大的坐标顶点和该顶点逆时针方向的顶点(也可以称该顶点右边的顶点),根据这两个点的连线可以求出连线与x轴的夹角,这个夹角取值在(0,90)度之间,称这个夹角为angle
  • 当angle<45度时,定义y值最大的点为p_3点,其它点按顺时针方向依次类推。当angle>45度时,定义y值最大的点为p_2点,此时angle角变换为-(\pi / 2-\text {angle}),这样就保证了angle角度[-45,45]度
  • 上述还有一种特殊情况要考虑,当y值最大的点有两个时,说明矩形与x轴平行,angle定义为0度,这时候将x与y坐标相加最小的点定义为p_0点,其它点依次类推
  • 根据得到的旋转矩形和angle值将geometry map的五个通道赋值,赋值方法为,对于text boxes的四个通道,每个通道表示图像中的像素点坐标到旋转矩形的四个边的距离顺序为,0通道表示点到p_0p_1边的距离,1通道表示点到p_1p_2边的距离,按照顺时针依次赋值四个通道,也分别称为到top、right、bottom、left边的距离,对于text rotation angle这一个通道,将旋转矩形中所有像素都赋值上述计算出的angle大小
  • 最后得到的五个通道按照每隔4个像素采样,这样就可以得到图片大小\frac{1}{4}的geometry map了

首先,生成一个旋转矩形,以最小面积覆盖该区域;然后,对于RBOX标注框,计算每个有正分数的像素与文本框4个边界的距离;对于QUAD 标注框,计算每个有正分数的像素与文本框4个顶点的坐标偏移。

三.损失函数

损失函数定义如下

                                                                             L=L_{s}+\lambda_{g} L_{g}

其中和分别表示score map和geometry map的损失, 表示两个损失的权重,文章设为1 

1. score map的损失计算

论文中采用的是类平衡交叉熵,用于解决类别不平衡训练,避免通过 平衡采样和硬负挖掘 解决目标物体的不不平衡分布,简化训练过程,具体公式如下:

                                                      \begin{aligned} L_{\mathrm{s}} &=\text { balanced-xent }\left(\hat{\mathbf{Y}}, \mathbf{Y}^{*}\right) \\ &=-\beta \mathbf{Y}^{*} \log \hat{\mathbf{Y}}-(1-\beta)\left(1-\mathbf{Y}^{*}\right) \log (1-\hat{\mathbf{Y}}) \end{aligned}

提出类平衡系数\beta,其计算方法如下:

                                                                          \beta=1-\frac{\sum_{y^{*} \in \mathbf{Y} *} y^{*}}{\left|\mathbf{Y}^{*}\right|}

不过类平衡交叉熵收敛速度较慢,所以在实际使用中,往往使用dice loss。

                                                                              L_{s}=1-\frac{2 y_{s} p_{s}}{y_{s}+p_{s}} 

其中y_s代表位置敏感图像分割(position-sensitive segmentation)的label,p_s代表预测的分割值 

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

首先需要说明一下training_mask,

if min(poly_h, poly_w) < FLAGS.min_text_size:
    cv2.fillPoly(training_mask,poly.astype(np.int32)[np.newaxis, :, :], 0)

 training_mask就是为了将长或宽小于某个阈值的框当做hard-example,这些样本太难训练,所以需要将这些样本去掉。所以,将包含这些样本的框里面置为黑色。正好和score_map的取值相反,从而去掉。

dice_loss 实现的就是交并比,由于loss需要不断减少,所以使用了1-操作。

2. geometry map的损失计算

文本检测的一个挑战是自然场景图像中文本的大小差别很大,而直接使用L1或L2损失进行回归会导致损失偏向较大和较长的文本区域。所以这里采用对scale不敏感的IOU loss。

因此,对于RBOX回归,采用AABB部分的IoU损失。对于QUAD回归,采用scale-normalized平滑L1损失。

RBOX:

1.AABB部分:

                                                           L_{\mathrm{AABB}}=-\log \operatorname{IoU}\left(\hat{\mathbf{R}}, \mathbf{R}^{*}\right)=-\log \frac{\left|\hat{\mathbf{R}} \cap \mathbf{R}^{*}\right|}{\left|\hat{\mathbf{R}} \cup \mathbf{R}^{*}\right|}

其中\left|\hat{\mathbf{R}} \cap \mathbf{R}^{*}\right| 部分的w和h的计算方法如下:

                                                                      \begin{array}{l}{w_{\mathbf{i}}=\min \left(\hat{d}_{2}, d_{2}^{*}\right)+\min \left(\hat{d}_{4}, d_{4}^{*}\right)} \\ {h_{\mathbf{i}}=\min \left(\hat{d}_{1}, d_{1}^{*}\right)+\min \left(\hat{d}_{3}, d_{3}^{*}\right)}\end{array} 

而并集部分的计算如下: 

                                                                    \left|\hat{\mathbf{R}} \cup \mathbf{R}^{*}\right|=|\hat{\mathbf{R}}|+\left|\mathbf{R}^{*}\right|-\left|\hat{\mathbf{R}} \cap \mathbf{R}^{*}\right|

2.Angle部分

                                                                         L_{\theta}\left(\hat{\theta}, \theta^{*}\right)=1-\cos \left(\hat{\theta}-\theta^{*}\right)

AABB的总的loss如下:

                                                                                   L_{\mathrm{g}}=L_{\mathrm{AABB}}+\lambda_{\theta} L_{\theta}

这里的\lambda _\theta=10

 

QUAD: 

 文本矩形框的预测偏移量:

                                                                           \mathrm{C}_{\mathrm{Q}}=\left\{x_{1}, y_{1}, x_{2}, y_{2}, \ldots, x_{4}, y_{4}\right\}

  损失可以被写为:

                                                                        \begin{aligned} L_{\mathrm{g}} &=L_{\mathrm{QUAD}}\left(\hat{\mathbf{Q}}, \mathbf{Q}^{*}\right) \\ &=\min _{\mathbb{Q} \in P_{\mathbf{Q}^{*}}} \sum_{c_{i} \in \mathrm{C}_{\mathrm{Q}}} \frac{\mathrm{smoothed}_{L 1}\left(c_{i}-\tilde{c}_{i}\right)}{8 \times N_{\mathrm{Q}^{*}}} \\ & \tilde{c}_{i} \in \mathrm{C}_{\tilde{\mathbf{Q}}} \end{aligned}

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

                                                                           N_{\mathrm{Q}^{*}}=\min _{i=1}^{4} D\left(p_{i}, p_{(i \bmod 4)+1}\right)

四.局部感知NMS

1.先对所有的output box集合结合相应的阈值(大于阈值则进行合并,小于阈值则不合并),将置信度得分作为权重加权合并,得到合并后的bbox集合;

2.对合并后的bbox集合进行标准的NMS操作。

 因为本文会预测成千上万个几何框,一个简单的NMS算法的时间复杂度是O(n^2),其中n是候选框的数量,这个时间复杂度太高。所以本文提出逐行合并几何图形,假设来自附近像素的几何图形倾向于高度相关,在合并同一行中的几何图形时,将迭代合并当前遇到的几何图形与最后一个合并图形,改进后的时间复杂度为O(n)。

                                  

locality_aware_nms在标准nms的基础上加了weighted_merge,所谓weighted_merge就是将2个IOU高于某个threshold的输出框,进行基于得分的合并。合并后的输出框的坐标数值介于2个合并的输入框之间,感觉这样操作可以将所有回归出的框的坐标信息都利用起来,有助于减少位置误差,而不是像传统的nms一样,直接取分数最高的那个。

def weighted_merge(g, p):
    g[:8] = (g[8] * g[:8] + p[8] * p[:8])/(g[8] + p[8])
    g[8] = (g[8] + p[8])
    return g

假设,2个点g和p,假设其分数分别为k1,k2,

上面程序表达是公式就是:

weighted_merge(g, p)=(k1*g+k2*p)/(k1+k2)

 

举例如下:

其中g和p分别为2个输出框,假设都为1*9的大小,前8个为4个坐标的(x,y),最后一个为框的置信度分数。

g=[ 114.08222961 , 29.94154549 , 270.02160645 , 28.1983242 , 

270.58172607, 78.30197144 , 114.64233398 , 80.04519653 ,  0.87047273]

P=[ 110.07213085 , 29.98007349 , 267.0800416 , 27.57254931 , 

267.85499947 , 78.08751085 , 110.84708252 , 80.49503197 , 7.11734003]

weighted_merge(g,p)=[110.50913178 , 29.9758749 , 267.40059893 , 27.64074319 ,    268.15214478 , 78.11088172 , 111.26067044 , 80.4460111 , 7.98781276]

训练参数设置

        基于Adam优化算法进行端对端训练;统一输入图像为512x512;mini-batch为24;Adam的学习速率从1e-3开始;每27300 mini-batch衰减十分之一,并停在1e-5。

五.局限性

1. 检测器可以处理的文本实例的最大大小与网络的感受野成正比。这限制了网络预测长文本区域的能力,例如跨越图像的文本行。

2. 该算法可能会遗漏或给出不精确的垂直文本实例预测,因为它们ICDAR 2015训练集中仅有一小部分此种类型的图片。

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值