参考:https://blog.csdn.net/mike112223/article/details/79129421
1. 摘要
- 本文主要提出了一个Focal loss,解决类别不平衡的问题。不平衡导致了训练的时候存在大量的easy examples(包括easy positive和easy negative,但主要是easy negative),这些easy example虽然每一个的loss会比较小,但是因为数量巨大,主导了最终的loss。easy example过多会造成loss过大,以致于把hard examples的loss淹没掉,不利于loss的收敛。
2. 引言
-
本文提出了一个新的损失函数,这个损失函数能够动态的缩放交叉熵loss,当正确类的置信率增加,它对应的尺度因子会逐渐衰减到0。如图1。直观上,尺度因子会自动地在训练时减少简单例子对loss的贡献,然后迅速地着眼于难例。而且,我们发现focal loss的形式不一定唯一,其他的形式也可以得到相似的效果。
图1. 我们提出一种新的损失函数Focal loss,在标准的交叉熵上添加一个(1−pt)γ。设置γ>0来减小好分类样本(pt>0.5)的相对loss,更多的着眼于难例。就像我们的实验阐述的,这个focal loss能够在大量简单背景样本存在的情况下,训练出高准确率的密集目标检测器 - 本文还设计了简单的单阶段检测器RetinaNet,它的设计特点在于有效的网络内特征金字塔和anchor框的使用。
3. Focal Loss
- 二分类交叉损失loss
-
Balanced Cross Entropy
一个普遍的方法来解决这个类不平衡问题就是引入一个权重因子α∈[0,1]对于类1,1−α对于类-1。实际中α可能被设置为类频率的倒数或者被当做是一个超参数使用交叉验证进行了设置。
这个loss是CE的一个简单的延展,是我们提出的focal loss的一个baseline。 -
Focal Loss Definition
好分类的负样本占据了loss里的绝大部分,而且还主导了梯度。而α可以平衡正/负样本的重要性,但是它不能区分易/难例。于是,我们重新设计了损失函数,降低了简单样本的权重,因此使得损失函数能够着眼于难负例。
4. RetinaNet检测器
-
RetinaNet是由一个主网络和两个指定任务的子网络组成的一个单一的、统一的网络结构。主网络负责计算整个输入图像的卷积特征,它是一个现成的卷积网络。第一个子网络用来对主网络的输出进行进一步的计算来完成目标分类;第二个子网络负责边框回归。网络结构如图2。RetinaNet是由ResNet-FPN主网络,一个分类子网络和一个边框回归子网络所组成的。
图2. one-stage RetinaNet网络结构在前向ResNet网络结构上使用了FPN(Feature Pyramid Network)(a)来生成丰富的,多尺度的卷积特征金字塔。(b)在RetinaNet的主网络上联结两个子网络,一个用来分类anchor框(c)一个用来让anchor框对gt框进行回归。(d)这个网络设计很简单,主要是为了着眼于focal loss函数可以消除one-stage和two-stage检测器的准确率差距同时还能跑的更快。 - Feature Pyramid Network Backbone:我们采用FPN作为RetinaNet的骨干部分。简单来说,FPN通过自上而下的通道和横向的连接来扩展了一个标准的卷积网络,这样就可以从单一分辨率的输入图像中有效的提取出丰富的,多尺度的特征金字塔,如图2(a)-(b)。金字塔的每一层都可以在不同尺度上对目标进行检测。FPN提升了全卷积网络(FCN)的多尺度预测能力。我们在ResNet结构上构建了FPN。我们在P3到P7级上构建了一个金字塔,这里l表征金字塔的级数(Pl的分辨率相比于输入低了2l)。
- Classification Subnet:分类子网络会对每个位置的每个anchor(A个)的每个类别(K个)进行概率预测。这个子网络是在每个FPN级上联接一个小的FCN;这个子网络的参数在所有金字塔级上是共享的。它的设计很简单。从给定的金字塔级上得到一个有C个通道的输入特征图,这个子网络先经过4个3×3的卷积层,每个带有C个滤波器,每个都跟着一个ReLU激活函数,然后再跟一个带有KA个滤波器的3×3的卷积层。最后联接sigmoid激活函数对于每个位置输出KA个二分类预测值,如图2(c)。我们在大部分实验中使用C=256和A=9。 相比于RPN,我们的目标分类子网络更深,只使用3×3的卷积核,而且分类子网络不与框回归子网络共享参数。我们发现更高层的设计会比超参数的设计更为重要。
5. 推理和训练
- Focal Loss:注意到α,赋予少类的权重,同样具有相对稳定的范围,但是它与γ相互影响所以有必要同时对它们两个进行选择。普遍来看,α增加一点γ就增加一点(实验中γ=2和α=0.25效果最好)。
- Initialization:我们使用ResNet-50-FPN和ResNet-101-FPN进行了实验。基础的ResNet-50和ResNet-101模型是在ImageNet1k上进行了预训练。新增的FPN层由FPN论文中的方式进行初始化。除了RetinaNet子网络的最后一层,其他所有新增的层都采用σ=0.01的高斯分布和b=0进行初始化。对于分类子网络的最后一层卷积层,我们设置初始偏置项为b=−log((1−π)/π),这里π被指定在训练开始时,所有的anchor都需要被标注为带有~π置信率的前景。在所有的实验中,我们使用π=.01,尽管结果对于这个值相对鲁棒。这个初始化是为了防止在训练的第一个周期大量的背景anchors生成一个巨大的不稳定的loss值。