quality focal loss & distribute focal loss 解说(附代码)

这篇具有很好参考价值的文章主要介绍了quality focal loss & distribute 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的负样本。而绿色点是作者提出的联合表示法,让它们有相关性(相等)。
quality focal loss & distribute focal loss 解说(附代码)

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

虽然近来有一些work提出了用高斯分布,但是高斯分布太simple, 谁又能保证真实的数值分布就是这样的对称?
quality focal loss & distribute focal loss 解说(附代码)

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

Focal Loss

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

我们从cross entropy入手:
cross entropy的公式如下:
quality focal loss & distribute focal loss 解说(附代码)

把其中的y=1时为p, y=0时1-p 写成一个 p t p_{t} pt
quality focal loss & distribute focal loss 解说(附代码)

那么,cross entropy可以简化为:

quality focal loss & distribute focal loss 解说(附代码)

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

quality focal loss & distribute 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中的两项做一下扩展:

quality focal loss & distribute focal loss 解说(附代码)

quality focal loss & distribute focal loss 解说(附代码)

因此得到最后的QFL公式:

quality focal loss & distribute focal loss 解说(附代码)

具体看下面的代码:

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

Distribute Focal Loss

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

看一个图理解一下
quality focal loss & distribute focal loss 解说(附代码)
现有的方法在分类时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分布(一个脉冲),即
quality focal loss & distribute focal loss 解说(附代码)
这表示预测值x 总有一个标签y与之对应。

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

quality focal loss & distribute focal loss 解说(附代码)
现在不用脉冲分布,也不用高斯分布或是其他什么分布,直接用一个P(x)表示一个广义的分布。
假设label y的范围在[y0, yn], 就可以根据模型估计

quality focal loss & distribute focal loss 解说(附代码)

为了和CNN一致,把连续积分变离散表达,
这时需要从[y0, yn]这个区间取出一系列的值{y0, y1, … yn}(作者是每间隔1取一次值)。
同时还要保证离散概率之和为1的性质:
quality focal loss & distribute focal loss 解说(附代码)
于是(4)式就变为:

quality focal loss & distribute focal loss 解说(附代码)
那这里的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附近更集中,更容易预测出准确结果。
quality focal loss & distribute focal loss 解说(附代码)
因此要优化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)中的每个数值等。

quality focal loss & distribute focal loss 解说(附代码)
看下它的代码文章来源地址https://www.toymoban.com/news/detail-422005.html

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

到了这里,关于quality focal loss & distribute focal loss 解说(附代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pytorch如何使用Focal Loss

    Focal loss 是 文章 Focal Loss for Dense Object Detection 中提出对简单样本的进行 decay 的一种损失函数。是对标准的 Cross Entropy Loss 的一种改进。 FL 对于简单样本(p比较大)回应较小的loss。 如论文中的图1, 在p=0.6时, 标准的 CE 然后又较大的 loss , 但是对于FL就有相对较小的loss回应

    2024年02月10日
    浏览(37)
  • 交叉熵、Focal Loss以及其Pytorch实现

    本文参考链接:https://towardsdatascience.com/focal-loss-a-better-alternative-for-cross-entropy-1d073d92d075 损失是通过梯度回传用来更新网络参数是之产生的预测结果和真实值之间相似。不同损失函数有着不同的约束作用,不同的数据对损失函数有着不同的影响。 交叉熵是常见的损失函数,常

    2024年02月11日
    浏览(58)
  • Focal Loss:类别不平衡的解决方案

    ❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈 (封面图由ERNIE-ViLG AI 作画大模型生成) 在目标检测领域,常常使用交叉熵

    2024年02月06日
    浏览(65)
  • Focal Loss论文解读和调参教程

    论文papar地址:ICCV 2017 Open Access Repository 在各个主流深度学习框架里基本都有实现,本文会以mmcv里的focal loss实现为例(基于pytorch) 本文是何恺明团队ICCV 2017的一篇文章,主要针对检测场景类别不均衡导致一阶段算法没有二阶段算法精度高,在CE loss的基础上进行改进,提出了

    2023年04月16日
    浏览(39)
  • EIoU和Focal-EIoU Loss

    论文题目:《Focal and Efficient IOU Loss for Accurate Bounding Box Regression》 CIoU Loss虽然考虑了边界框回归的重叠面积、中心点距离、高宽比。但是其公式中的v反映的是高宽的差异,而不是高宽分别与其置信度的真实差异。因此,有时会阻碍模型有效的优化相似性。针对这一问题,本文

    2024年03月27日
    浏览(46)
  • 图像 检测 - RetinaNet: Focal Loss for Dense Object Detection (arXiv 2018)

    声明:此翻译仅为个人学习记录 文章信息 标题: RetinaNet: Focal Loss for Dense Object Detection (arXiv 2018) 作者: Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, Piotr Dollár 文章链接:https://arxiv.org/pdf/1708.02002.pdf 文章代码:https://github.com/facebookresearch/Detectron (推荐:亦可参考 图像 处理 - 开

    2024年02月14日
    浏览(35)
  • 【Focal Net】NeuralPS2022 论文+代码解读 Focal Modulation Networks

    论文链接- arxiv 官方代码- github 官方博客- microsoft 该论文提出了一个Focal Modulaiton network,将自注意力机制替换成focal modulation(聚焦调制)。这种机制包括3个组件:1)通过depth-wise Conv提取分级的上下文信息,同时编码短期和长期依赖。2)门控聚合,基于每个token的内容选择性

    2024年02月07日
    浏览(71)
  • von Mises-Fisher Distribution (代码解析)

    torch.distribution 中包含了很多概率分布的实现,本文首先 通过均匀分布来说明 Distribution 的具体用法 , 然后再解释 von Mises-Fisher 分布的实现 , 其公式推导见 von Mises-Fisher Distribution. 1. torch.distribution.Distribution 以下是 Uniform 的源码: 下面将依次从上到下进行解释: 1.1 首先是一个使用

    2024年04月27日
    浏览(36)
  • 论文代码学习—HiFi-GAN(3)——模型损失函数loss解析

    这里翻译了HiFi-GAN这篇论文的具体内容,具体链接。 这篇文章还是学到了很多东西,从整体上说,学到了生成对抗网络的构建思路,包括生成器和鉴定器。细化到具体实现的细节,如何 实现对于特定周期的数据处理?在细化,膨胀卷积是如何实现的?这些通过文章,仅仅是了

    2024年02月14日
    浏览(86)
  • YOLOv7改进损失函数Loss系列:首发手把手最新结合多种类Loss(内附代码),包括PolyLoss / VarifocalLoss / GFL / QualityFLoss / FL等

    💡该教程为属于 《芒果书》 📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 降低改进难度,改进多种结构演示 💡本篇文章基于 基于 YOLOv7 、 YOLOv7-tiny 等网络最新结合不同Loss,包括PolyLoss / VarifocalLoss / GeneralizedFLoss / QualityFLoss / Focal Loss等改进

    2024年02月04日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包