Gradient Harmonized Single-stage Detector

参考  Gradient Harmonized Single-stage Detector - 云+社区 - 腾讯云

摘要

虽然两级检测器取得了巨大的成功,但是单级检测器仍然是一种更加简洁和高效的方法,在训练过程中存在着两种众所周知的不平衡,即正、负样本之间以及简单例子和困难例子之间在数量上的巨大差异。在这项工作中,我们首先指出,这两个不和谐的本质影响可以用梯度的形式来概括。此外,我们提出了一种新的梯度协调机制(GHM)来对冲不平衡。GHM背后的原理可以很容易地嵌入到交叉熵(CE)等分类损失函数和Smooth L1 (SL1)等回归损失函数中。为此,我们设计了两种新的损失函数GHM-C和GHM-R来平衡梯度流,分别用于anchor分类和bounding box细化。MS COCO的消融研究表明,无需费力的超参数调整,GHM-C和GHM-R都可以为单阶段检测器带来实质性的改进。在没有任何附加条件的情况下,该模型在COCO test-dev set上实现了41.6 mAP,比目前最先进的Focal Loss(FL) + SL1方法高出0.8。

简介

单阶段方法是一种高效、简洁的目标检测方法。但长期以来,单阶段检测器的性能与两阶段检测器有较大的差距。单阶段检测器的训练中,最具挑战性的问题是容易与难例、正例与反例之间的严重不平衡。大量简单的背景例子往往压倒了训练。由于设计方案的根本不同,两级检测器不存在上述问题。为了解决之前的不平衡问题,基于实例挖掘的方法如OHEM被广泛使用,但它们直接放弃了大部分的例子,训练效率低下。对于类不平衡,Focal Loss试图通过修改交叉熵损失函数来解决这个问题。然而,Focal Loss采用了两个超参数,需要进行大量的调整。它是一种静态损失,不适应数据分布的变化,随训练过程的变化而变化。

本文首先指出,类不平衡可以归结为难度的不平衡,难度的不平衡可以归结为梯度范数分布的不平衡。如果一个正例子分类很好,那么它就是一个简单的例子,模型从中获益很少,也就是说,这个样本会产生一个很小的梯度。错误分类的例子无论属于哪一类,都应该引起模型的注意。因此,如果从全局范围来看,大量的负面例子往往易于分类,而较难的例子通常是正面的。所以这两种不平衡大致可以归结为属性不平衡。

此外,我们认为梯度范数的分布可以反映不同属性(hard/easy和pos/neg)的例子之间的不平衡。为方便起见,我们将关于梯度范数称为梯度密度,其密度变化较大,如图1所示。梯度范数很小的例子密度较大,这与大量的简单反例相对应。虽然一个简单的例子在全局梯度上的贡献比一个困难的例子要小,但是大量简单例子的总贡献可以超过少数困难例子的贡献,训练过程将是低效的。此外,我们还发现梯度范数非常大的例子(非常困难的例子)的密度略大于中等例子的密度。我们认为这些非常困难的例子大多是异常值,因为它们即使在模型收敛时也稳定存在。由于异常值的梯度可能与其他常见的例子有较大的差异,因此可能会影响模型的稳定性。

                               

受梯度范数分布的启发,提出了一种梯度协调机制(GHM),该机制能有效地训练单阶段目标检测模型。GHM首先对具有相似属性也就是梯度密度进行统计,然后根据密度为每个例子的梯度附加一个调和参数。GHM与CE、FL相比的效果如图1所示。利用GHM进行训练,可以对简单例子产生的大量累积梯度进行降权处理,对异常值也可以进行相对降权处理。最后,平衡各类型实例的贡献,提高训练的效率和稳定性。

在实际中,梯度的修正可以等价地通过重新构造损失函数来实现,将GHM嵌入到分类损失中,即GHM- C损失。这个损失函数的表达式很优雅,没有很多超参数需要调优。由于梯度密度是一个统计变量,依赖于样本在小批量中的分布,因此GHM-C是一种动态损失,能够适应每批数据分布的变化以及模型的更新。为了展示GHM的通用性,我们还在box regression分支中采用了GHM- R损失的形式。

COCO挑战基准的边界框检测上进行的实验表明,与传统的交叉熵损失相比,GHM-C损失具有较大的增益,略高于目前最先进的Focal Loss。而GHM-R损失也比常用的平滑L1损失具有更好的性能。GHM-C和GHM-R的结合在COCO tes-dev set上获得了一个新的最先进的性能。 

本文的主要贡献如下:

  1. 揭示了单阶段检测器在梯度范数分布方面存在显著不平衡的基本原理,并提出了一种新的梯度协调机制(GHM)来解决这一问题。
  2. 我们将分类和回归的损失分别嵌入到GHM-C和GHM-R中,修正了不同属性样本的梯度贡献,对超参数具有鲁棒性。
  3. 通过与GHM的合并,我们可以很容易地训练一个单阶段检测器,而不需要任何数据采样策略,并在COCO基准上实现最优的结果。

相关工作

目标检测

目标检测是计算机视觉领域中最基本、最重要的任务之一。 基于深度卷积神经网络(CNN)的方法,由于网络架构的重大进展,近年来越来越发达并取得了巨大的成功。 先进的目标检测框架可分为两类:一阶段检测器和两阶段检测器。  

大多数最先进的方法使用两级检测器。 它们主要基于Region CNN (R-CNN)架构。 这些方法首先从几乎无限的候选区域中获得可管理数量的区域提议,称为感兴趣区域(RoI),然后使用网络对每个RoI进行评估。  

单级检测器具有结构简单、速度快等优点。 SSD, YOLO用于通用目标检测和RSA的人脸检测实现了良好的速度/准确性权衡。 然而,它们的精度很难超过两级检波器。 RetinaNet是目前最先进的一级对象检测器,其性能可与两级检测器相媲美。 它采用RPN)的架构,重点解决训练过程中的班级失衡问题。  

用于目标检测器的目标函数:大多数检测模型使用基于交叉熵的损失函数进行分类。 而单级检测器面临着两级检测器所没有的极端类不平衡的问题。 早期的方法尝试使用难样本挖掘方法,但他们抛弃了大多数例子,不能很好地处理这个问题。 最近的工作重新构建了交叉熵损失,从而使容易的负的向下加权,而难的例子不受影响,甚至向上加权。 为了box回归的稳定训练,Fast R-CNN引入了平滑L1损失。 这种损失减少  

对异常值的影响,使模型的训练能够更加稳定。 下面几乎所有的工作都将平滑L1损失作为框回归的默认值。  

这项工作试图通过将目标改变为分布并使用直方图损失来计算预测和目标的K-L散度来提高回归性能。 该工作通过动态调整不同任务分支的梯度大小来平衡多任务损失。  

我们基于GHM的损失在样本梯度分布的基础上协调了样本的贡献,因此它可以很好地处理类不平衡和离群值问题。 该算法还可以根据每个小批处理中数据分布的变化来调整权值。 

1、梯度协调机制的原理

1、问题描述

我们在这里的工作重点是分类在一阶段的目标检测,其中的类(前景/背景)是相当不平衡的例子。对一个候选框,使\large p\in [0,1]是模型预测的概率,\large p^*\in \{0,1\}是对一个确定类的ground-truth标签。考虑二元交叉熵损失:

                                                           \large L_{CE}=\left\{\begin{matrix} -log(p)\ \ \ \ \ if \ \ \ \ p^*=1& \\ -log(1-p)\ \ if\ \ \ \ \ p^*=0 & \end{matrix}\right.

x为模型的直接输出,令p = sigmoid(x),则有关于x的梯度:

                                                              \large \frac{\partial L_{CE}}{\partial x}=\left\{\begin{matrix} -log(p) if p^*=1& \\ -log(1-p) if p^*=0 & \end{matrix}\right.\\=p-p^*   

定义g如下:

                                                               \large g=|p-p^*|=\left\{\begin{matrix} 1-p if p^*=1& \\ p if p^*=0& \end{matrix}\right.

g等于x对应的梯度范数。 g的值表示一个例子的属性(例如easy或hard),表示这个例子对全局梯度的影响。虽然梯度的严格定义是在整个参数空间上,即g是一个例子梯度的相对范数,但为了方便起见,本文将g称为梯度范数。

下图为收敛的一级检测模型g的分布。由于简单负样本占主导地位,使用log轴来显示样本的分数,以显示具有不同属性的样本方差的细节。可以看出,简单例子数量是非常大的,这对全局梯度有很大的影响。此外,可以看到收敛模型仍然不能处理一些非常困难的例子,这些例子的数量甚至比中等难度的例子还要多。这些非常困难的例子可以看作是异常值,因为它们的梯度方向往往与大量其他例子的梯度方向有很大的不同。也就是说,如果收敛模型被迫学习如何更好地对这些异常值进行分类,那么对大量其他示例的分类往往不那么准确。

                                           

2、梯度密度

针对梯度范数分布的不协调问题,提出了一种梯度密度的协调方法。训练实例的梯度密度函数表示为:

                                                     \large GD(g)=\frac{1}{l_\varepsilon (g)}\sum_{k=1}^N\delta_\varepsilon (g_k,g)

其中\large g_k是第k个实例的梯度范数,并且,

                                                     \delta_{\epsilon}(x, y)=\left\{\begin{array}{lr} 1 & \text { if } y-\frac{\epsilon}{2}<=x<y+\frac{\epsilon}{2} \\ 0 & \text { otherwise } \end{array}\right.

                                                      \large l\varepsilon (g)=min(g+\frac{\varepsilon }{2},1)-max(g-\frac{\varepsilon }{2},0)

g的梯度密度表示以g为中心的区域内的样例数,其长度为\LARGE \varepsilon,并按该区域的有效长度归一化。我们定义梯度密度平衡参数为:

                                                                                   \large \beta _i=\frac{N}{GD(g_i)}

N是总共样例的个数。为了更好地理解梯度密度协调参数,可以将其改写为\large \beta_i=\frac{1}{GD(g_i)/N},分母\large GD(g_i)/N是一个标准化器指示了邻域梯度到第i个样本的样本分数。如果样例关于梯度均匀分布,对任何\large g_i\large GD(g_i)=N,每个样例有相同的\large \beta_i=1,这意味着什么都没有改变。否则,密度较大的算例将被归一化器相对降权。

3、GHM-C Loss

我们将GHM嵌入分类损失由关于βi损失权重的第i个例子和梯度密度统一形式的损失函数是:

                                          \large L_{GHM-C}=\frac{1}{N}\sum^N_{i=1}\beta_iL_{CE}(p_i,p_i^*)=\sum^N_{i=1}\frac{L_{CE}(p_i,p_i^*)}{GD(g_i)}

图3为不同损失下重新制定的梯度范数。CE的原始梯度准则,即\large g=|p-p^*|,作为x轴,便于查看,因为密度是根据g计算的。我们可以看到Focal Loss和GHM-C损失的曲线有相似的趋势,这意味着焦损失与最好的超参数是类似于均匀梯度协调。此外,GHM-C还有一个被Focal Loss忽略的优点:降低了异常值梯度贡献的权重。

                           

在GHM-C损失的情况下,大量的非常简单的例子大都是向下加权的,而异常值也稍微向下加权,这同时解决了属性不平衡问题和异常值问题。从损失比较可以看出,GHM-C较好地协调了不同样本组的梯度贡献总量。由于梯度密度是每次迭代计算得到的,所以算例的权值不像焦损那样是固定相关的g(或x),而是适应模型的当前状态和小批量数据。GHM-C损失的动态特性使训练更加高效、鲁棒。 

4、单位区域近似

1、复杂分析

计算所有算例梯度密度值的朴素算法的时间复杂度为O(N^2),即使是并行计算,每个计算单元的计算量仍然是N,据我们所知,最好的算法是先用复杂度为\large O(N logN)的梯度范数对样本进行排序,然后用队列扫描样本,用O(N)得到样本的密度。这种基于排序的方法不能从并行计算中获得太多的好处。由于单阶段检测器中图像的N可以是\LARGE 10^5甚至\LARGE 10^6,直接计算梯度密度是相当费时的。因此,我们提出了一种近似求解算例梯度密度的方法。

2、单元区域

g的值域空间划分为长度为\large \varepsilon的单个单位区域,有\large M = \frac{1}{\varepsilon }个单位区域。\large r_j是编号为\large j的单元区域,因此\large r_j=[(j-1)\varepsilon ,j\varepsilon )\large R_j代表\large r_j中的样本个数。我们定义\large ind(g)=t也就是\large (t-1)\varepsilon \leq g< t\varepsilon,这是区域单元中g的指数函数。然后我们将近似梯度密度函数定义为:

                                                             \large \hat{G}D=\frac{R_{ind}(g)}{\varepsilon }=R_{ind(g)}M

得到近似梯度密度协调参数:

                                                            \large \hat{\beta}_i=\frac{N}{\hat{G}D(g_i)}

考虑特殊情况\large \varepsilon =1;只有一个单位区域,所有的例子都在其中,显然每个\large \beta _i =1, 保持原始梯度贡献。每个例子最后得到重新表述的损失函数:

                                           \large \hat{L}_{GHM-G}=\frac{1}{N}\sum_{i=1}^N\hat{\beta}_i L_{CE}(p_i,p_i^*)=\sum_{i=1}^N\frac{L_{CE}(p_i,p_i^*)}{\hat{G}D(g_i)}

相同单元区域内的例子梯度密度相同。因此,我们可以使用直方图统计算法,计算所有梯度密度值的时间复杂度为\large O(MN)。并且可以采用并行计算,使每个计算单元都有M的计算量。在实际应用中,我们可以用相当少的单元区域获得良好的性能。M相当小,损失计算很有效。

3、EMA

基于小批量统计的方法通常面临一个问题:当大量的极端数据在一个小批量中采样时,统计结果会产生严重的噪声,训练不稳定。指数移动平均(EMA)是解决这一问题的常用方法,如带动量的SGD和批量归一化。由于在近似算法中梯度密度来自于单元区域内的样本个数,因此我们可以在每个单元区域上应用均线来获得更稳定的梯度密度。 令\large R^{(t)}_j是第j个单元中的第t次迭代。对\large S^{(t)}_j取滑动平均值,我们有,

                                                           S_{j}^{(t)}=\alpha S_{j}^{(t-1)}+(1-\alpha) R_{j}^{(t)}

 \large \alpha是动量参数,我们使用平均数\large S_j来计算梯度密度而不是\large R_j

                                                          \large \hat{G}D(g)=S_{ind}(g)/\varepsilon =S_{ind(g)}M

使用EMA,梯度变化更加平滑并且对极端数据更加敏感。

4、GHM-R loss

考虑参数补偿,通过回归分组预测和目标补偿\large t=(t_x,t_y,t_w,t_h),通过ground-truth计算的\large l^*=(t^*_x,t^*_y,t^*_w,t^*_h),回归损失通常采用\large smooth-L_1损失函数:

                                                      \large L_{reg}=\sum_{i\in \{w,y,w,h\}}SL_1(t_i-t_i^*)

其中

                                                     \large SL_1(d)\left\{\begin{matrix} \frac{d^2}{2\delta}\ \ \ \ \ \ \ \ \ \ \ if\ \ |d|<=\delta & \\ |d|-\frac{\delta}{2}\ \ \ otherwise& \end{matrix}\right.

其中\large \delta是在二次部分和线性部分之间的分界点,在实际中通常设为1/9。

因为,\large d=t_i-t_i^*,也是\large L_1梯度平滑损失,可以表示为:

                                                   \large \frac{\partial L_1}{\partial t_i}=\frac{\partial L_1}{\partial d}=\left\{\begin{matrix} \frac{d}{\delta} if|d|<=\delta& & \\ sgn(d)otherwise & & \end{matrix}\right.

其中sgn是符号函数。

注意,所有|d|的例子大于除点,具有相同的梯度范数\large |\frac{\partial L_1}{\partial t_i}|=1,这使得如果依赖梯度范数区分不同属性的例子变得不可能。一个可以替代的选择是直接使用|d|作为不同属性的度量,但新的问题是|d|在理论上可以达到无穷大,不能实现单位区域近似。

为了方便地将GHM应用于回归损失,我们首先将传统的SL_1损失修改为更简洁的形式:

                                                      \large ASL_1(d)=\sqrt{d^2+\mu ^2}-\mu

这种损失与\large SL_1损失具有相似的性质:当d很小时,它近似于二次函数(\large L_2损失);当d很大时,它近似于线性函数(L1损失)。由于修正后的损失函数具有良好的真实光滑性,我们将其表示为真实光滑L1 (ASL_1)损失,这意味着所有阶导数都存在且连续。相比之下,光滑的L_1损失的二阶导数不存在的点\large d=\delta。此外,\large ASL_1损失具有优雅的梯度形式,

                                                       \large \frac{\partial ASL_1}{\partial d}=\frac{d}{\sqrt{d^2+\mu^2}}

梯度的范围仅为\large [0,1),因此回归中计算单位区域ASL1损失的密度与分类中计算CE损失一样方便。在实践中,我们设置µ= 0.02从\large ASL1损失与\large SL1保持同样的性能损失。

我们定义g r=\left|\frac{d}{\sqrt{d^{2}+\mu^{2}}}\right|的梯度准则从\large ASL_1损失和收敛模型的梯度分布,如图4所示。我们可以看到有大量的异常值。注意,回归仅对正样本进行,因此分类与回归的分布趋势不同是合理的。综上所述,我们可以将GHM应用于回归损失:

                              \large L_{GHM-R}=\frac{1}{N}\sum^N_{i=1}\beta_i ASL_1(d_i)=\sum^N_{i=1}\frac{ASL_1(d_i)}{GD(gr_i))}

                  

图5为SL_1损失、ASL_1损失和GHM-R损失的重新表述梯度贡献。x轴采用|d|,便于比较。

                                            

我们强调,在框回归中,并非所有的“简单例子”都不重要。分类中一个简单的例子通常是一个预测概率非常低的背景区域,并且肯定会被排除在最终候选区域之外。因此,这类例子的改进对精度几乎没有任何影响。但是在框回归中,一个简单的例子仍然与ground truth位置有偏差。任何例子的更好预测都将直接提高最终候选目标的质量。此外,高级数据集更关心定位精度。例如,COCO 以IoU阈值0.5到0.95之间的平均AP作为评价算法的度量。在这个度量中,一些所谓的简单示例(那些有小错误的)也很重要,因为减少它们的错误可以直接提高AP的高阈值(例如AP@ IoU = 0.75)。我们的GHM-R损失可以通过增加简单样本的重要部分的权重和降低异常值的权重来协调简单样本和困难样本对box回归的贡献。实验表明,该算法的性能优于SL_1ASL_1

5、实验

我们在具有COCO挑战性的基准上评估我们的方法。在训练方面,遵循常用的做法将40k验证集划分为35k子集和5k子集。将35k验证子集与整个80k训练集结合起来进行训练,记为trainval35k集合。将5k验证子集记为minival集合,并对其进行消融研究。而我们的主要结果是在测试开发集上报告的。

1、实现细节

1、网络设置

我们使用RetinaNet作为网络架构,所有实验均采用ResNet作为骨干,采用特征金字塔网络(FPN) 结构。锚使用3个尺度和3个宽高比,便于与Focal Loss进行比较。所有实验的输入图像比例设置为800像素。所有消融研究均使用ResNet-50。而在test-dev上评估的最终模型采用ResNeXt-101。

2、优化

所有模型均采用常用的SGD算法进行优化。我们在8个GPU上训练模型,每个GPU上有2张图像,因此有效的小批量大小为16。所有模型训练14个epoch,初始学习率为0.01,在第9个epoch和第12个epoch分别下降了0.1倍和1倍。还使用了重量衰减参数0.0001和动量参数0.9。唯一的数据增强操作是水平翻转图像。对于梯度密度计算中使用的EMA,我们使用\alpha= 0.75以来所有的实验结果对\alpha的精确值。

2、GHM-C Loss

关注GHM-C损失函数的影响,实验全部采用平滑L_1损失函数和\delta=9框回归分支。

1、baseline

训练了一个以标准交叉熵损失为baseline的模型。标准的初始化会导致快速的分歧,初始化最后一层的偏置项b = -log((1-\pi)/\pi)\pi=0.01,以避免分歧。但是,在初始化过程中,分类的损失很小,因此我们将分类损失的权重提高了20,使求值损失更合理。但当模型收敛时,分类损失仍然很小,最终得到平均精度(AP)为28.6的模型。

2、区域单元的数量

表1为单位区域数M的变化结果,M是单位区域数。EMA在这里不应用。当M过小时,密度对不同梯度范数的变化不大,性能也不太好。所以当M不太大时,我们可以得到更多。然而,M并不一定很大,当M = 30时,GHM-C损失比baseline有足够大的改善。

                                               

3、速度

因为我们的方法是一个损失函数,所以它不会改变推断的时间。对于训练而言,较小的M,比如30就足以获得良好的性能,因此梯度密度计算所花费的时间并不长。表2显示了训练中每次迭代的平均时间和平均精度。这里使用梯度密度的原始定义实现了“GHM-C标准”,“GHM-C RU”表示区域单元近似算法的实现。实验在1080Ti GPU上进行。可以看到,区域单元近似算法加快了训练的幅度,对性能的影响可以忽略不计。与CE相比,GHM-C损失的降低也是可以接受的。由于我们的损失还没有完全实现GPU现在,仍然有改进的空间。 

4、与其他方法的比较

表4显示了使用我们的损失与其他损失函数或抽样策略的比较结果。由于所报道的使用Focal Loss的缩小结果是用600像素的输入图像比例尺训练的,为了公平比较,我们使用800像素的比例尺重新训练了焦损模型,并保留了最佳的焦损参数。可以看到我们的损失比Focal Loss稍微好一些。

                                           

3、GHM-R Loss 

1、与其他损失的比较

本文的实验采用了分类支路的GHM-C损失的最佳配置。所以第一个baseline是模型(使用SL1 loss训练),在GHM-C loss实验中AP为35.8。我们采用\mu= 0.02ASL_1损失与SL_1损失得到类似的结果,获得一个公平baselineGHM-R损失。表5显示了baselineASL_1损失与SL_1损失以及GHM-R损失的结果。基于ASL_1损失,我们可以看到增益为0.7。表6显示了不同IoU阈值下AP的详细情况。GHM-R损失稍微降低了AP@IoU=0.5,但是当阈值更高时,会增加,这表明我们的主张,即所谓的回归中的简单示例对于准确定位非常重要。

        

两阶段检测器:用于回归的GHM-R损失不限于一阶段检测器。为此,我们对两级检测器进行了实验验证。我们的baseline的方法是Fast R-CNN和Res50-FPN模型,使用SL_1loss进行box回归。表7显示GHM-R损失既适用于两阶段检测器,也适用于单阶段。 

                                        

4、Main Results

我们使用32x8d的FPN-ResNext101主干和RetinaNet模型,其中GHM-C损失用于分类,GHM-R损失用于box回归。实验在test-dev set上进行。表3显示了我们的主要结果,并与最先进的方法进行了比较。我们的方法实现了出色的性能,并在大多数度量中优于Focal Loss。 

 6、结论和讨论

本文针对单阶段检测器中存在的两种不平衡问题,将这两种不平衡问题归结为梯度密度不协调问题,即样本的难易程度。提出了GHM-C和GHM-R两种损失函数,分别用来克服分类和边界盒回归的不协调。实验表明,单阶段与GHM协同工作,其性能可以很容易地超越具有相同网络骨干网的FPN、Mask R-CNN等现代最先进的两级检测器。

尽管选取均匀分布作为优化目标,但我们仍然认为梯度的最优分布难以确定,需要进一步研究。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wanderer001

ROIAlign原理

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值