当前位置:   article > 正文

quality focal loss & distribute focal loss 详解(paper, 代码)_distribution focal loss

distribution focal loss

参见generalized focal loss paper
其中包含有Quality Focal LossDistribution Focal Loss

背景

dense detectors逐渐引领了目标检测领域的潮流。
目标框的表达方法,localization quality估计方法的改进引起了目标检测的逐渐进步。

其中,目标框表达(坐标或(l,r,t,b))目前被建模为一个简单的Dirac delta分布,也就是说数值是固定的,没有一个可变的范围。
localization quality可以是IOU score 或是 centerness score(FCOS),

FCOS中 localization quality 和 分类score 进行了结合(相乘),得到最终的score, 然后在NMS中降序排列。

尽管已经有localization quality和分类score结合的先例,作者发现还存在2个问题:

  1. 训练和推理中 localization quality估计 和 分类score 的用处是不同的(对应QFL):
    (1) 在最近的dense detectors中,localization quality的估计(IOU score等)和分类score是分开独立训练的,然而推理的时候却结合在一起(相乘),是不是训练的时候没有考虑它们的结合相关性?
    (2) 一般只对正样本进行localization quality估计的监督,这不一定是可靠的,因为负样本可能拿到更高的估计。

通过一个图来看,下面的Figure 2中(a)列举了2个localization quality (IOU score) 较高的负样本(虽然分类score比较低)。
(b)中的蓝色点显示了分类score和IOU score的弱相关性,其中红色圈里面的(包含了图(a)中的A,B样本)就是有较高IOU score的负样本。而绿色点是作者提出的联合表示法,让它们有相关性(相等)。
在这里插入图片描述

  1. 目标框的表达不够灵活
    广泛使用的目标框表达用了Dirac delta分布(一个脉冲),也就是说,坐标是固定的,要跟ground truth一样,不存在灵活变动的目标框。
    但是看下图,有些物体本身边界就是不明确的,如左图,因为浪花的存在,左边界是不清晰的,所以这时候ground truth不一定是可靠的(用脉冲分布来判断也是不可靠的)。
    而作者提出的分布对于不明确的边界有一个分布区间,可以在区间范围的数值灵活取值;而对明确的边界区间范围就比较尖锐。(图片中白框为gt, 绿框为作者方法的预测)

虽然近来有一些work提出了用高斯分布,但是高斯分布太simple, 谁又能保证真实的数值分布就是这样的对称?
在这里插入图片描述

上面是大背景,现在来回顾一下Focal Loss

Focal Loss

Focal Loss这篇文章里有写过。
它主要是解决class imbalance,同时降低容易分类的weight,使训练更集中到难分类的上面

我们从cross entropy入手:
cross entropy的公式如下:
在这里插入图片描述

把其中的y=1时为p, y=0时1-p 写成一个 p t p_{t} pt
在这里插入图片描述

那么,cross entropy可以简化为:

在这里插入图片描述

降低容易分类的weight, 比如 p t = 0.9 p_{t}=0.9 pt=0.9时,很容易分类,降低它的weight, 同时结合 α t \alpha_{t} αt解决class imbalance的问题。
这个就是Focal Loss的公式

在这里插入图片描述

Quality Focal Loss

Quality Focal Loss是针对作者提出的问题1。

要把IOU score 和 分类score 结合起来,防止出现 训练时它们互不相关,推理时又结合在一起用 的问题。

要把分类score和IOU score结合,就是把one-hot label给soft化,具体就是把label的1 乘以 IOU score,
这里的IOU score是指预测出的bounding box和与之匹配的ground truth box的IOU。范围在0~1之间。
理论上来说一个预测box会匹配一个gt_box, 当匹配多个时,取cost最小的那个。

至于如何匹配,就是计算一张图片中有效的(自己定义)预测box和这张图片所有的ground truth box的IOU,
再取IOU>阈值的box作为最终预测的box。

每个box还会有一个class score.

class score经过sigmoid运算后就是公式中的 σ \sigma σ
公式中的 y y y是label乘以对应的IOU score,那就是分类score和IOU score的结合产物。

现在它们已经结合起来,而又和Focal loss有什么关系?
为了解决class imbalance的问题,这个结合产物还需要和Focal Loss结合,
但是Focal Loss的label是0,1,而这里的soft label是小数,
所以把Focal Loss中的两项做一下扩展:

在这里插入图片描述

在这里插入图片描述

因此得到最后的QFL公式:

在这里插入图片描述

具体看下面的代码:

def quality_focal_loss(pred, target, beta=2.0):
    r"""Quality Focal Loss (QFL) is from `Generalized Focal Loss: Learning
    Qualified and Distributed Bounding Boxes for Dense Object Detection
    <https://arxiv.org/abs/2006.04388>`_.

    Args:
        pred (torch.Tensor): Predicted joint representation of classification
            and quality (IoU) estimation with shape (N, C), C is the number of
            classes.
        target (tuple([torch.Tensor])): Target category label with shape (N,)
            and target quality label with shape (N,).
        beta (float): The beta parameter for calculating the modulating factor.
            Defaults to 2.0.

    Returns:
        torch.Tensor: Loss tensor with shape (N,).
    """
    assert (
        len(target) == 2
    ), """target for QFL must be a tuple of two elements,
        including category label and quality label, respectively"""
    # label denotes the category id, score denotes the quality score
    label, score = target  #label:gt label,score:gt score(IOU),

    # negatives are supervised by 0 quality score
    #pred:预测的class score
    pred_sigmoid = pred.sigmoid() #sigmoid:1/(1+e^-x)
    scale_factor = pred_sigmoid
    zerolabel = scale_factor.new_zeros(pred.shape) #全0
    #label全为0时的qfl loss,即先把背景的loss填上
    loss = F.binary_cross_entropy_with_logits( #等价于sigmoid+binary entropy, 更稳定
        pred, zerolabel, reduction="none"
    ) * scale_factor.pow(beta)

    # FG cat_id: [0, num_classes -1], BG cat_id: num_classes
    bg_class_ind = pred.size(1)  #背景的下标
    #label是前景的下标,注意这是gt label
    pos = torch.nonzero((label >= 0) & (label < bg_class_ind), as_tuple=False).squeeze(
        1
    )
    pos_label = label[pos].long()  #取出下标对应的前景gt label
    # positives are supervised by bbox quality (IoU) score
    scale_factor = score[pos] - pred_sigmoid[pos, pos_label] #公式中的(y-sigma)
    #在有前景的对应位置填上gfl的前景loss
    loss[pos, pos_label] = F.binary_cross_entropy_with_logits(
        pred[pos, pos_label], score[pos], reduction="none"
    ) * scale_factor.abs().pow(beta) #公式中的QFL(sigma)不要负号

    loss = loss.sum(dim=1, keepdim=False) 
    return loss
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

Distribute Focal Loss

Distribution focal loss针对的是作者提出的问题2.
也就是目标框坐标不够灵活的问题,尤其在边界不够清晰明确的情况下(如遮挡等)。

看一个图理解一下
在这里插入图片描述
现有的方法在分类时label是one-hot, 而GFL(包含QFL和DFL)的QFL中把分类score和IOU score结合起来,形成了soft one-hot label.
再看目标框,现在是用(l, t, r, b)的形式估计box(参考FCOS).
既有的方法把目标框的(l, t, r, b) 定为脉冲分布,就是这个数值,没得商量。
而DFL中目标框的坐标有一个分布,有一个灵活变动的范围。

下面来看看如何灵活变动。

一般来说,预测值x 和真实标签y 之间,是假设的Dirac delta分布(一个脉冲),即
在这里插入图片描述
这表示预测值x 总有一个标签y与之对应。

那么将它与x相乘就能复原标签y.

在这里插入图片描述
现在不用脉冲分布,也不用高斯分布或是其他什么分布,直接用一个P(x)表示一个广义的分布。
假设label y的范围在[y0, yn], 就可以根据模型估计

在这里插入图片描述

为了和CNN一致,把连续积分变离散表达,
这时需要从[y0, yn]这个区间取出一系列的值{y0, y1, … yn}(作者是每间隔1取一次值)。
同时还要保证离散概率之和为1的性质:
在这里插入图片描述
于是(4)式就变为:

在这里插入图片描述
那这里的P(x)分布到底是什么呢?
作者把它简化为一个有n+1个units的Softmax layer,那么 P ( y i ) P(y_{i}) P(yi)就对应了 S i S_{i} Si

但是y不是可以直接用任何一个loss函数从网络end-to-end训练出来么,
注意到这个训练过程中,P(x)可以是任意值,使得积分结果为y,如下图,能得到y的不同组合很多。
需要选出一个接近target的分布提高学习效率。
直觉上来说,分布(3)在target附近更集中,更容易预测出准确结果。
在这里插入图片描述
因此要优化P(x)的形状,使它在target y附近有更高的概率。而且这个location处不要偏离label太多。

综合以上考虑,作者提出了DFL,使网络尽快把值集中到label y, 增大 y i y_{i} yi y i + 1 y_{i+1} yi+1的概率。
其中 y i < = y < = y i + 1 y_{i} <= y <= y_{i+1} yi<=y<=yi+1,也就是最接近y的两个label.

而且因为只有正样本才有目标框,不存在class imbalance的情况。
所以只需要用QFL中的cross entropy部分。

总结一下,DFL就是要让预测的label y 尽可能地靠近 y i y_{i} yi y i + 1 y_{i+1} yi+1.
这个label可以是box坐标,(l, t, r, b)中的每个数值等。

在这里插入图片描述
看下它的代码

def distribution_focal_loss(pred, label):
    r"""Distribution Focal Loss (DFL) is from `Generalized Focal Loss: Learning
    Qualified and Distributed Bounding Boxes for Dense Object Detection
    <https://arxiv.org/abs/2006.04388>`_.

    Args:
        pred (torch.Tensor): Predicted general distribution of bounding boxes
            (before softmax) with shape (N, n+1), n is the max value of the
            integral set `{0, ..., n}` in paper.
        label (torch.Tensor): Target distance label for bounding boxes with
            shape (N,).

    Returns:
        torch.Tensor: Loss tensor with shape (N,).
    """
    #label为y, pred为y^(y的估计值)
    #因为y_i <= y <= y_i+1(paper)
    #取dis_left = y_i, dis_right = y_i+1
    dis_left = label.long()
    dis_right = dis_left + 1
    weight_left = dis_right.float() - label #y_i+1-y
    weight_right = label - dis_left.float() #y-y_i
    #paper中的log(S)这里用CE
    loss = (
        F.cross_entropy(pred, dis_left, reduction="none") * weight_left
        + F.cross_entropy(pred, dis_right, reduction="none") * weight_right
    )
    return loss
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号