Focal Loss

论文链接:https://arxiv.org/pdf/1708.02002.pdf

1. Introduction

目前one-stage的目标检测方法要比two-stage的目标检测方法精度要低,主要原因就是正负样例的不均衡,正是因为bbox中属于background的bbox太多了,所以如果分类器无脑地把所有bbox统一归类为background,accuracy也可以刷得很高,比如有98个背景,2个正例子,如果把这些样本都当成背景,那精确度也可以达到98%,这样的话分类器就没有了效果。于是乎,分类器的训练就失败了。分类器训练失败,检测精度自然就低了。
two-stage 例如Faster rcnn,可以通过rpn层对anchor进行过滤,找出相对准确,正负样例均衡的标签进行 训练,正负样例1:3 对样本进行筛选.hard negative mining一般是,有正负样本,然后分类器分出来一些分错的负样本(容易将负样本看成正样本的那些样本),即假阳性(false positive),也就是说在对负样本分类时候,loss比较大(label与prediction相差较大)的那些样本,这些就是hard negative/困难样本。hard negative mining就是多找一些hard negative加入负样本集,重新进行训练,这样会比easy negative(例如roi里没有物体,全是背景,这时候分类器很容易正确分类成背景,这个就叫easy negative;如果roi里有二分之一个物体,标签仍是负样本,这时候分类器就容易把他看成正样本,这时候就是hard negative)组成的负样本集效果更好。主要体现在虚警率更低一些(也就是false positive少)。
而one-stage的方法则不可以.正负样本不平衡是造成one-stage不如two-stage的根本原因,过多的正样本会让在本文中为了解决正负样例不平衡问题,提出了Focus loss,是一个动态缩放的交叉熵损失,即在交叉熵函数前面添加系数.自动的对简单的样例降低权重.实验表明,本Focal loss 要明显好于使用采样启发式或硬示例挖掘(以前最先进的单级检测器培训技术)进行培训的方法

2. Focal loss

2.1 解决类别不均衡问题

CE(p,y) 是常用的二分类交叉熵损失函数
C E ( p , y ) = { − l o g ( p ) y=1 − l o g ( 1 − p ) otherwise (1) CE(p,y)=\begin{cases} -log(p) &\text{y=1} \\ -log(1-p) &\text{otherwise} \end{cases} \tag{1} CE(p,y)={log(p)log(1p)y=1otherwise(1)
解决正负样例不均衡很容易,只要在两类前分别加一个系数即可,如果标签是1,那么添加 α \alpha α,如果是0,那么添加系数 1 − α 1-\alpha 1α,变成如下公式
C E ( p , y ) = { − α l o g ( p ) y=1 − ( 1 − α ) l o g ( 1 − p ) otherwise (2) CE(p,y)=\begin{cases} -\alpha log(p) &\text{y=1} \\ -(1-\alpha)log(1-p) &\text{otherwise} \end{cases} \tag{2} CE(p,y)={αlog(p)(1α)log(1p)y=1otherwise(2)

2.2 解决样例的难易区分问题

通常来说,因为正负样例不均衡,所以很自然的想到,可以给正负标签的损失函数分别加一个系数,我们用 α , 1 − α \alpha , 1-\alpha α,1α,分别表示正标签和负标签的系数。添加系数后损失函数变成
C E ( p , y ) = { − α log ⁡ p y=1 − ( 1 − α ) log ⁡ ( 1 − p ) y=0 (3) CE(p,y)= \begin{cases} -\alpha\log{p} & \text{y=1}\\ -(1-\alpha)\log {(1-p)}& \text{y=0} \end{cases}\tag{3} CE(p,y)={αlogp(1α)log(1p)y=1y=0(3)
但是这个只是传统的解决正负样例不均衡的方法,并没有考虑样本的难易区分程度,我们想让容易区分的损失值小一点,不容易区分的损失值大一点。于是对上式子进行改进。
可以针对对区分程度的难易分别添加一个系数,容易区分的系数小一点,不容易区分的系数大一点,那应该怎么添加这个系数合适呢?其实也很简单,如果预测一个标签为1的样本有物体的概率为 p p p,希望 p p p越大损失越小,这显然是一个反函数,很容易想到在前面加一个系数变成 F L ( p t ) = − ( 1 − p ) l o g ( p ) FL(p_t)=-(1-p) log(p) FL(pt)=(1p)log(p),这不就满足所示的条件了嘛,但是这样的损失函数可扩展性太差,如果变成 F L ( p ) = − ( 1 − p ) γ l o g ( p ) FL(p)=-(1-p)^\gamma log(p) FL(p)=(1p)γlog(p),这个样子就好多了,可以通过控制 α \alpha α,进行调参,找到合适的参数。对于标签为0的样本,我们希望预测值越接近0越好,赋予损失值的权重越小,总结一下就变成如下式子
C E ( p , y ) = { − ( 1 − p ) γ log ⁡ p y=1 − p γ log ⁡ ( 1 − p ) y=0 (4) CE(p,y)= \begin{cases} -(1-p)^\gamma\log{p} & \text{y=1}\\ -p^\gamma\log {(1-p)}& \text{y=0} \end{cases}\tag{4} CE(p,y)={(1p)γlogppγlog(1p)y=1y=0(4)
α \alpha α取值范围是[0, 5],实验证明取2最好。

2.3 将二者结合起来

F L ( p , y ) = { − α ( 1 − p ) γ log ⁡ p y=1 − ( 1 − α ) p γ log ⁡ ( 1 − p ) y=0 (5) FL(p,y)= \begin{cases} -\alpha(1-p)^\gamma\log{p} & \text{y=1}\\ -(1-\alpha)p^\gamma\log {(1-p)}& \text{y=0} \end{cases}\tag{5} FL(p,y)={α(1p)γlogp(1α)pγlog(1p)y=1y=0(5)
为了简化公式,原文当中使用如下变换
p t = { p y=1 1 − p y=0 (6) p_t= \begin{cases} p & \text{y=1}\\ 1- p& \text{y=0} \end{cases}\tag{6} pt={p1py=1y=0(6)
α t = { α y=1 1 − α y=0 (7) \alpha_t= \begin{cases} \alpha & \text{y=1}\\ 1- \alpha& \text{y=0} \end{cases}\tag{7} αt={α1αy=1y=0(7)
于是化简后的式子为
F L ( p t ) = − α t ( 1 − p t ) log ⁡ ( p t ) (8) FL(p_t) = -\alpha_t(1-p_t)\log(p_t) \tag{8} FL(pt)=αt(1pt)log(pt)(8)
式子(8)和(5)是等价的

3. 实验

在这里插入图片描述
Feature Pyramid Network Backbone:
FPN 作为 Backbone。它在ResNet网络上增加了top-down(自顶向下)通路和lateral(侧向连接)通路,从图片的单一分辨率构建丰富的、多尺度的特征金字塔。金字塔的每一层特征用来检测不同尺寸的目标。
本文FPN由P3-P7构成(Pl 层的分辨率缩小到输入图像的2l),P3-P5是由ResNet的C3-C5计算,P6是由C5使用stride=2的3X3卷积得到,P7是由P6经过stride=2的3x3卷积得到,特征金字塔所有层的Channel=256。与原始的FPN不同之处在于:(1)FPN没有使用P2层;(2)P6是由stride=2的卷积得到不是降采样;(3)引入P7层提升对大尺寸目标的检测效果。
需要强调的是使用FPN作为主干网的原因是,实验发现只使用ResNet层,最终AP值较低。
Anchors:
类似RPN具有平移不变性的anchor boxes。从P3到P7层的anchors的面积从3232依次增加到512512。每层anchors长宽比{1:2, 1:1, 2:1}。每层增加尺寸;这样每层有9个anchors,通过不同层覆盖了输入图像 32~813 像素区间。
每个Anchor会有长度为K(class)的one-hot分类目标和4-vector的box回归目标。与RPN比修改如下:
(1) anchor内部包含目标的判断仍然是与GT的IOU,IOU的阈值设置为0.5(RPN是0.7)IOU大于0.5,anchors和GT关联;IOU在[0, 0.4)作为背景。
(2) 每个anchor最多关联一个GT;K(class)的one-hot中关联的类别为1,其它为0。
(3) 边框回归就是计算anchor到关联的GT之间的偏移。

Classification Subnet:
连接在FPN每层的FCN,参数共享。Feature Map,使用4个3×3的卷积层,每个卷积层接一个ReLU层,然后是channel=KA(K是类别数,A是anchor数)的3×3卷积层,最后使用sigmoid激活函数。
与RPN相比,网络更深,只使用了3×3卷积;不和边框回归子网络共享参数。

Box Regression Subnet:
结构同上,最后一层channel=4A。

Inference and Training:
Inference:为了提高速度,只对FPN每层部分predictions处理。FPN的每个特征层,首先使用0.05的阈值筛选出是前景的object,最多选取前1k个predictions进行后续处理。融合各层的predictions,再使用NMS(阈值0.5)去掉重叠box。

Focal Loss
γ = 2效果最好,鲁棒区间是γ ∈ [0.5, 5]。训练RetinaNet,损失函数计算输入图所有~100k个anchors,而RPN或(OHEM,SSD)在每个minibatch只选择很少的anchors(如:256)。
大部分anchors是easy negatives,FL下损失值非常小。α与γ值互相影响,通常α随着γ的增大而轻微减少(γ = 2, α = 0.25效果最好)。

Initialization:
(1) 使用ResNet-50-FPN和ResNet-101-FPN backbone。
(2) 基础的ResNet-50和ResNet-101在ImageNet1k数据集上预训练。
(3) 所有新增的卷积层(除了子网络的最后一层)初始化权重为 σ = 0.01的高斯分布,偏置为0。
(4) classification subnet最后一层偏置为− log((1 − π)/π),π为每个anchor在开始训练时应该被标记为前景的置信度,实验中使用π = 0.01。背景远多于前景,所以以0.01的概率是前景。

实验配置优化器选用SGD,每个minibatch 16张图片.一共迭代90000次,learnig-rate初始化为0.01,然后在迭代60000次的时候变成0.001,在80000的时候变成0.0001

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值