目标检测的类别损失和位置损失

本文详细探讨了Focal Loss在二分类和多分类问题中的应用,重点介绍了如何通过α和γ系数平衡正负样本和难易样本,同时涵盖了位置损失如L1Loss、IoU Loss等在目标检测中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类别损失

Cross Entropy Loss

交叉熵损失分为二分类损失和多分类损失

二分类损失

对于二分类问题(即0-1分类),即属于第1类的概率为p,属于第0类的概率为1−p。则二元交叉熵损失可表示为:
在这里插入图片描述
统一格式之后就是:
在这里插入图片描述

可以理解为:当实际类别为1时,我们希望预测为类别1的概率高一点,此时 l o g ( p ) log(p) log(p)的值越大,产生的损失越小;反之,我们希望预测为类别0的概率高一点,此时 l o g ( 1 − p ) log(1−p) log(1p)的值越大,产生的损失也越小。在实际应用中,二分类的类别概率通常采用sigmoid函数把结果映射到(0,1)之间。

多分类损失

在这里插入图片描述
其中, Y i Y_i Yi是一个one-hot向量,并定义如下:
在这里插入图片描述
p i j p_{ij} pij表示第i个样本属于类别j的概率。在实际应用中通常采用SoftMax函数来得到样本属于每个类别的概率。

衍生one-hot向量的建立

  • 无num_classes

    import torch
    from torch.nn import functional as F
    
    x = torch.tensor([1, 1, 1, 3, 3, 4, 8, 5])
     
    y1 = F.one_hot(x) # 只有一个参数张量x
    print(f'x = ',x)  
    print(f'x_shape = ',x.shape) 
    print(f'y1 = ',y1)  
    print(f'y1_shape = ',y1.shape)
    

    输出:

    x = tensor([1, 1, 1, 3, 3, 4, 8, 5])
    x_shape = torch.Size([8])
    y = tensor([[0, 1, 0, 0, 0, 0, 0, 0, 0],
            [0, 1, 0, 0, 0, 0, 0, 0, 0],
            [0, 1, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 1, 0, 0, 0, 0, 0],
            [0, 0, 0, 1, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 1, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 1],
            [0, 0, 0, 0, 0, 1, 0, 0, 0]])
    y_shape = torch.Size([8, 9])
    
  • 有num_classes

    y2 = F.one_hot(x, num_classes = 10)  # 这里num_classes设置为10,其中 10 > max{x}
    print(f'x = ',x)  # 输出 x
    print(f'x_shape = ',x.shape)  # 查看 x 的形状
    print(f'y2 = ',y2)  # 输出 y
    print(f'y2_shape = ',y2.shape)
    

    结果:

    x =  tensor([1, 1, 1, 3, 3, 4, 8, 5])
    x_shape =  torch.Size([8])
    y2 =  tensor([[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
            [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]])
    y2_shape =  torch.Size([8, 10])
    

区别:没有指定类别,按给定x最大+1作为类别数量,否则按指定num_classes绘制one-hot向量

Focal Loss

该词提出是在RetinaNet文章中,目的是为了在训练中更关注那些难分类的样本,抑制了那些易分类的负样本的主导作用论文地址

Focal Loss是对典型的交叉信息熵损失函数的改进,对于一个二分类问题,交叉信息熵损失函数定义如下:(上面刚讲过)
在这里插入图片描述
为了统一正负样本的损失函数表达式,首先做如下定义:(说白了 p t p_t pt就是样本的概率)
在这里插入图片描述
p t p_t pt在形式上就表示被预测为对应的正确类别的置信度。这样二分类交叉信息熵损失就可以重写成如下形式:
在这里插入图片描述

α \alpha α平衡正负样本

为了平衡多数类和少数类的损失,一种常规的思想就是在损失项前乘上一个平衡系数α∈(0,1),当类别为正时,取 α t = α \alpha_t = \alpha αt=α,当类别为负时,取 α t = 1 − α \alpha_t = 1-\alpha αt=1α,这样得到的带有平衡系数的交叉信息熵损失定义如下:
在这里插入图片描述
这样,根据训练样本中正负样本数量来选取 α \alpha α的值,就可以达到平衡正负样本的作用。然而,这样做还不能对简单和困难样本区别对待,在目标检测中,既要平衡多数类(背景)和少数类(包含目标的前景),还要平衡简单样本和困难样本,而往往训练过程中往往遇到的问题就是大量简单的背景样本占据损失函数的主要部分。因此,还需要对上述带有平衡系数的交叉信息熵损失做进一步的改进。于是就有了Focal Loss,它定义如下:

( 1 − p t ) γ (1-p_t)^\gamma (1pt)γ平衡难易样本

在这里插入图片描述
相比于上面的加了平衡系数 α t \alpha_t αt的损失函数相比,Focal Loss有以下两点不同:

  • 固定的平衡系数 α t \alpha_t αt替换成了可变的平衡系数 ( 1 − p t ) (1-p_t) (1pt)
  • 多了另外一个调节因子 γ \gamma γ,且 γ ≥ 0 \gamma≥0 γ0

解析:

  • 对于分类准确的样本(也就是易分样本,正样本 p p p趋近于1,负样本 p p p趋近于0), p t p_t pt接近于1, 1 − p t 1-p_t 1pt接近于0,说明对损失的贡献较小,即减低了易区分样本的损失比例,这已经和原来交叉熵损失函数定义相反;
  • 对于分类不准确的样本(也就是难分样本,正样本 p p p趋近于0,负样本 p p p趋近于1), p t p_t pt接近于0, 1 − p t 1-p_t 1pt接近于1,不会对loss造成太大影响,这和原来交叉熵损失函数定义相同;
  • 一来二去,变相的提高了分类不准确的样本在损失函数中的权重(降低分类准确,虽然分类不准确没影响,其实相对来说已经提高了)
  • p t p_t pt 也反应了分类的难易程度, p t p_t pt 越大,说明分类的置信度越高,代表样本越易分; p t p_t pt 越小,分类的置信度越低,代表样本越难分。因此focal loss相当于增加了难分样本在损失函数的权重,使得损失函数倾向于难分的样本,有助于提高难分样本的准确度
  • γ \gamma γ等于0的时候,就和普通的交叉熵损失函数一样了, γ \gamma γ越小,难分样本损失越重要,易分样本越不重要。下面给出不同 γ \gamma γ的Focal Loss损失函数曲线:
    在这里插入图片描述

α + γ \alpha + \gamma α+γ结合

在这里插入图片描述
明显既平衡正负样本,又平衡难易样本

位置损失

位置损失有L1 Loss,L2 Loss,Smooth L1 Loss(详解多级目标检测体系结构Cascade RCNN),IoU Loss,GIOU Loss,DIoU Loss,CIoU Loss(详解IoU、GIoU、DIoU、CIoU、EIoU和DIoU-NMS),这些损失函数我都在之前文章中提到过,点击即可抵达,我这里就简单给出公式了。

L1 Loss

在这里插入图片描述

L2 Loss

在这里插入图片描述

Smooth L1 Loss

在这里插入图片描述

IoU Loss

在这里插入图片描述在这里插入图片描述

GIOU Loss

在这里插入图片描述
在这里插入图片描述

DIoU Loss

在这里插入图片描述
在这里插入图片描述

CIoU Loss

在这里插入图片描述
在这里插入图片描述

Inference

[0] https://blog.csdn.net/sinat_34474705/article/details/105141134
[1] https://zhuanlan.zhihu.com/p/266023273
[2] 难易样本和正负样本
[3] https://blog.csdn.net/BIgHAo1/article/details/121783011

### 减少目标检测模型中类别分类错误的损失函数优化策略 #### 1. 使用改进型分类损失函数 为了应对类别不平衡问题,可以采用更先进的分类损失函数来替代传统的交叉熵损失。例如,Asymmetric Loss (ASL)[^1]是一种强大的损失函数,能够有效地处理多标签分类任务中的类别不平衡现象。通过对正负样本损失进行不对称处理并引入概率边界 \(m\) 等超参数,ASL 可以使模型更加关注那些稀有的或难分的样本。 ```python import torch.nn.functional as F def asymmetric_loss(input, target, gamma_neg=4, gamma_pos=1, clip=0.05): input = input.sigmoid() los_pos = -target * ((input - 1).abs().clamp(min=clip)**gamma_pos) * \ F.logsigmoid(-input.abs() + 1e-8) los_neg = -(1-target)*(F.relu(input).pow(gamma_neg)) * F.logsigmoid(-input) loss = los_pos + los_neg return loss.mean() ``` #### 2. 结合上下文信息调整损失权重 考虑到骨髓细胞按系列阶段分类的特点,在设计损失函数时应充分考虑这些因素。具体而言,可以通过增加不同类别间预测误差的惩罚力度,并适当降低相似类别之间的误判成本,以此增强模型区分度较高的能力[^2]。 #### 3. 多尺度特征融合与注意力机制的应用 除了直接修改损失函数外,还可以尝试利用多尺度特征图谱以及自适应加权方案(如SENet),使得网络能够在训练过程中动态分配更多资源给容易混淆的目标对象上,进而间接达到减小错分率的效果。 #### 4. 数据集扩增及平衡采样技术 针对某些特定场景下的极端不均衡情况,合理运用数据扩充手段(比如随机裁剪、翻转等操作)配合重采样的方式获取更为均匀的数据分布状态,有助于缓解因样本量差异过大而导致的学习偏差问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小Aer

走过路过给个赏钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值