focal loss
1. Introduction
目前最先进的object detectos是基于two-stage的机制,如faster R-CNN。one-stage detectors应用于对象位置、尺度和纵横比的规则,密集抽样。如YOLO,SSD,但one-stage精度比不上two-stage。我们认为训练过程中的class imbalance 是阻碍精度的主要障碍。所以我们提出了一种新的loss function。
在two-stage detector中,RPN等阶段迅速将候选物体位置缩小到少量,过滤了大多数背景样本,在第二个分类阶段,固定了前景和背景的比例进行随机抽样。
相反,one-stage detector 必须处理一组大得多的候选对象位置,虽然也可以采用类似的启发抽样法,但这样的效率非常低,
我们提出的loss function是动态缩放的交叉熵损失,当对正确类的置信度增加时,缩放因子衰减为0,该缩放因子可以自动降低训练过程中simple examples的贡献,让模型更加关注hard examples。
3. Focal Loss
我们从二元分类的交叉熵损失CE出发引出focal loss,
为了便于标注,我们定义了pt,并且重写了CE:
CE损失可以看作图1中的蓝色曲线,这种损失的一个显著特点是,基数是容易分类的例子,也会引起非平凡的损失,这一点在其绘图中可以看到。当对大量simple examples进行求和时,这些小的loss value会压过(大于)the rare class。
3.1. Balanced Cross Entropy
解决类别不平衡的一种常用方法是为给 class1 引入加权因子α∈[0,1],对class-1引入1-α, 在实际中,α可以用inverse class frequency 来设置,也可以作为一个超参数来设置,为了便于标注,我们用和pt同样的方法来定义αt,
我们把带有α的CE loss 写成下式:
3.2. Focal Loss Definition
在dense detector训练过程中,比较容易分类的背景占了损失函数的绝大部分,并主导了梯度,虽然α平衡了正负示例的重要性,但它并不能区分simple/hard的示例,所以我们要reshape loss function to down-weight 简单示例,从而集中在hard negative。我们在交叉熵损失中增加一个modulating factor:
具有可调focusing参数γ >= 0,我们将focal loss定义为:
图一显示了γ∈[0,5]的几个之的focal loss,它有两个性质:
(1)当一个例子被错误分类,并且pt很小时, modulating factor接近1,损失不受影响,若pt→1,factor为0,对于分类良好的示例,损失被down-weight
(2)focusing 参数 γ,平滑的调整了易处理样本的加权率,当 γ=0 时,FL等于CE,随着γ的增加,modulaing factor 的作用也随之增大,我们发现γ=2在我们的实验中效果最好。
直观来看,modulating factor从简单示例中减少损失贡献,并且在越低的loss示例上的权值越低。例如,当γ=2时,用pt=0.9分类的例子与CE相比会有低100×倍的loss,与pt≈0.968相比会有低1000×倍的loss。这反过来又增加了纠正错误分类示例的重要性。
在实际应用中,我们使用:
我么在实验中采用了这种形式,因为它比没有α的平衡形式的精度略有提高,最后,在loss层实现时,我们将sigmoid运算和损失计算结合起来,从而获得更好的数值稳定性。
3.3. Class Imbalance and Model Initialization
二值分类模型在默认情况下初始化为y = -1或1输出的概率相等,在这种初始化下,在类不平衡的情况下,频繁类的损失会在早期训练中占主导地位,造成不稳定。针对这种情况,我们引入先验的概念,用于训练开始时稀有类的模型估计的p值。我们设置模型对于稀有类的估计p时较低的,例如0.01。这是模型初始化的更改,而不是损失函数的更改,在严重类别不平衡的情况下,这可以提高交叉熵和focal loss的训练稳定性。
3.4. Class Imbalance and Two-stage Detectors
4. RetinaNet Detector
RetinaNet由一个骨干网络和两个特定任务的自网络组成。主干网络负责计算整个输入图像上的卷积feature map,并且时一个off-the-self 卷积网络。第一子网络对主干网络的输出执行卷积对象分类,第二个子网络,执行bounding box回归。
Feature Pyramid Network Backbone
我们采用FPN作为主干网络,我们构造了一个从p3到p7级别的金字塔,channel=256,
Classification Subnet:
分类子网络预测每个anchors(A个)和object classes(K个)在每个空间位置上存在对象的概率,即:空间位置个数 × A × K。此网络是附加到每个FPN级别的一个小FCN,该子网络的参数共享。它的结构很简单,从给定的金字塔level中提取feature map(C channels),应用四个3×3卷积层,每层C个filters,每层后接一个ReLU层,然后是带有K·A个filters的3×3卷积层,最后sigmoid函数被附加到最后一个卷积输出上,对每个空间位置对应的anchor和class进行预测。我们使用C=256,A=9。分类自网络不和回归子网络共享参数。在这个网络中,我们使用了focal loss。
Box Regression Subnet:
box回归子网络和分类自网络设计相同,只不过它在每个空间位置输出4A个线性输出。对于每个空间中位置的A anchor,这4个输出预测anchor与ground truth之间的相对偏移,我们使用了一个与类不管的bounding box 回归器,box回归子网络和费雷子网络使用不同的参数。