【目标检测】损失函数:不同损失函数概念及其代码实现

本篇文章介绍目标检测中不同的损失函数概念及其代码实现。目标检测主要任务为实现目标的分类定位,其损失组成如下:

  • 类别/置信度损失(分类任务):BCE,FL,QFL,VFL
  • 位置损失(回归任务):IoU,GIoU,DIoU,CIoU,DFL(分类)

类别/置信度损失

BCE

  二值交叉熵(Binary Cross-Entropy, BCE)是一种应用于二分类任务中的损失函数,用于衡量目标类别预测值实际值之间的差距,其计算公式如下:
B C E ( y , p ) = − y log ⁡ ( p ) − ( 1 − y ) log ⁡ ( 1 − p ) {BCE}(y,p) = - y\log (p) - (1 - y)\log (1 - p) BCE(y,p)=ylog(p)(1y)log(1p)
其中 y y y表示目标的实际类别,值为0或1, p p p为目标的预测类别,值为[0,1],进一步地,BCE Loss可表示为以下形式:
B C E ( p t ) = − l o g ( p t ) {BCE}(p_t) = - log (p_t) BCE(pt)=log(pt)
p t = { p , y = 1 1 − p , o t h e r w i s e   p_t= \begin{cases} p,y=1 \\ 1-p,otherwise\ \end{cases} pt={ py=11potherwise 
针对多类别任务,可通过独热编码将其分解为多个二分类任务的组合再使用BCE Loss。
  BCE在PyTorch中的实现如下所示:

'''
函数实现:
	binary_cross_entropy_with_logits:Sigmoid + BCE
	binary_cross_entropy: BCE
'''
torch.nn.functional.binary_cross_entropy_with_logits(
						input=None,  # 预测值
						target=None,  # 实际标签
						weight=None,  # 对每个样本的损失进行加权
						size_average=None,  # 已弃用
						reduce=None,       # 不使用
						pos_weight=None,  # 正样本的损失加权(长度等于类数)
						reduction='mean'  # 所有样本的损失求平均(mean)或求和(sum)
						)
'''
类实现(调用上面的函数实现损失计算)
'''
torch.nn.BCEWithLogitsLoss(weight,pos_weight,reduction)

Focal Loss

  Focal Loss(FL)由文章Focal Loss for Dense Object Detection提出。Focal Loss在BCE Loss的基础上,通过权重系数实现以下两点目的:

  • 解决正负样本不平衡问题:目标检测任务中存在大量的背景(负样本),实际目标(正样本)占比减少
    B C E ( p t ) = − α t l o g ( p t ) {BCE}(p_t) = - α_tlog (p_t) BCE(pt)=αtlog(pt)
    α t = { α , y = 1 1 − α , o t h e r w i s e   α_t= \begin{cases} α,y=1 \\ 1-α,otherwise\ \end{cases} αt={ αy=11αotherwise 
    其中 α α α用于控制正负样本的权重。
  • 降低易分类样本的权重:使模型训练更加关注于困难样本
    F L ( p t ) = − ( 1 − p t ) γ l o g ( p t ) {FL}(p_t) = -(1-p_t)^γlog (p_t) FL(pt)=(1pt)γlog(pt)
    其中 γ γ γ用于控制难易分类样本的权重, p t p_t pt越大,则该样本越易分类,则对损失的贡献越小。
      结合以上两点,得到最终的Focal Loss公式如下:
    F L ( p t ) = − α t ( 1 − p t ) γ l o g ( p t ) {FL}(p_t) = -α_t(1-p_t)^γlog (p_t) FL(pt)=αt(1pt)γlog(pt)

F L ( y , p ) = − α ( 1 − p ) γ y log ⁡ ( p ) − ( 1 − α ) p γ ( 1 − y ) log ⁡ ( 1 − p ) {FL}(y,p) = - α(1-p)^γy\log (p) -(1-α) p^γ(1 - y)\log (1 - p) FL(y,p)=α(1p)γylog(p)(1α)pγ(1y)

### 常用的目标检测损失函数目标检测领域,损失函数的设计对于模型性能至关重要。以下是几种常见的目标检测损失函数: #### 1. **交叉熵损失 (Cross-Entropy Loss)** 分类任务通常采用交叉熵作为损失函数来衡量预测类别分布与真实标签之间的差异。它能够有效评估模型对物体类别的判断能力[^1]。 #### 2. **平滑L1损失 (Smooth L1 Loss)** 相比传统的均方误差(MSE),平滑L1损失更适用于回归问题中的边界框坐标优化。其优势在于当残差较小时表现出平方特性,在较大偏差下则接近线性增长,从而减少异常值的影响[^2]。 #### 3. **IoU损失及其变体** 交并比(IoU)是评价两个矩形区域重叠程度的重要指标之一。基于此概念衍生出了多种改进型IoU损失函数,比如GIoU(Generalized IoU)[^3], DIoU(Distance-IoU), CIoU(Complete IoU)等版本进一步提升了定位精度。 #### 4. **Focal Loss** 针对样本不均衡现象设计的一种新型二元交叉熵形式——焦点损失(Focal Loss),通过引入调制因子降低易分样本权重,使得训练过程更加关注困难负例的学习效果得到显著改善[^4]。 ```python import torch.nn as nn class DetectionLoss(nn.Module): def __init__(self, alpha=0.25, gamma=2.0): super().__init__() self.alpha = alpha self.gamma = gamma def forward(self, pred_cls, true_cls, pred_box, true_box): focal_loss = compute_focal_loss(pred_cls, true_cls, self.alpha, self.gamma) smooth_l1_loss = compute_smooth_l1_loss(pred_box, true_box) total_loss = focal_loss + smooth_l1_loss return total_loss ``` 上述代码片段展示了一个简单的自定义目标检测总损失计算方法,其中包含了焦损和光滑L1两项子组件组合而成的整体架构实例演示[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

初初初夏_

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值