「损失函数loss」检测分割跟踪常见的Loss合集

本文详细介绍了机器学习中常见的损失函数,包括二进制交叉熵损失、交叉熵损失、L1/L2损失等,并探讨了它们在不同场景下的应用,如分类、回归和目标检测等任务。

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

Binary Cross Entropy Loss

二进制交叉熵损失函数是分类中非常经典的一种loss,其计算公式如下:

L B C E = − y l o g ( y ′ ) − ( 1 − y ) l o g ( 1 − y ′ ) L_{BCE}=-y log(y')-(1-y)log(1-y') LBCE=ylog(y)(1y)log(1y)
其中y表示某个类别上的GT(值为0或1),y‘表示经过神经网络预测得到的对应类别的置信度(因为做过softmax处理,所以值在(0,1)之间)。当y=0时,上式中只有第二项,此时y‘越接近于0,则loss越小;当y=1时,上式只有第一项有值,此时y’越接近于1,则loss越小。

Cross Entropy Loss

和BCE LOSS有一些不同,BCE Loss输出只有一个[0,1]的结点;而CE可以做多分类,其损失函数表达如下:

L C E = − ∑ i p i l o g p i ^ L_{CE}=-\sum_{i} p_{i}log\hat{p_{i}} LCE=ipilogpi^

其中,p表示GT, p ^ \hat{p} p^表示预测值。i的数目表示类别总数。眼尖的你可能会发现,这个式子只在GT为1的时候有值,那GT为0的时候岂不丢失了这部分损失,无法让小的值向0收敛。其实是这样的,CE之前通常用softmax,这样所有的 p ^ i \hat{p}_{i} p^i之和等于1,而且大的更大,小的更小。所以让GT为1的类别更加接近1,隐式地让GT为0的那些类别的预测接近于0.

L1/L2 Loss

坐标或者wh回归时常用的loss,计算式分别如下:

L 1 = ∣ y ′ − y ∣ L_{1}=|y'-y| L1=yy

L 2 = ∣ y ′ − y ∣ 2 L_{2}=|y'-y|^{2} L2=yy2

其中y表示GT值(物理含义可以表示object的坐标,bbox宽高等),y’表示经神经网络的预测值(一般也是预测bbox的位置、宽高等信息)。该函数的目的就是minimize预测值与GT之间的L1/L2距离。

smooth L1 Loss

smooth-L1在L1 loss的基础上做出一点改动,使得Loss在定义域内处处可导,其公式定义如下:

L s m o o t h _ L 1 = { 0.5 x 2 , ∣ x ∣ < 1 ∣ x ∣ − 0.5 , ∣ x ∣ ≥ 1 L_{smooth\_L1}= \begin{cases} 0.5x^{2}, |x|<1 \\ |x|-0.5, |x|\ge1 \end{cases} Lsmooth_L1={0.5x2,x<1x0.5,x1

上式中的x就是L1 Loss中的|y’-y|,smooth L1 loss是在Faster RCNN中提出的,可以看下它和L2 loss的对比:
在这里插入图片描述
可以看出smooth L1在一些离群点上梯度也只是1,不会像L2 Loss一样梯度会很大。因此可以说smooth l1 loss对离群点和异常点更加鲁棒。

Huber Loss

Huber Loss也是常用的回归loss之一,可以看作是上述smooth L1 Loss的拓展,其计算式如下:

L s m o o t h _ L 1 = { 0.5 x 2 , ∣ x ∣ ≤ δ δ ∣ x ∣ − 0.5 δ 2 , o t h e r w i s e L_{smooth\_L1}= \begin{cases} 0.5x^{2}, |x|\le \delta \\ \delta|x|-0.5\delta ^{2}, otherwise \end{cases} Lsmooth_L1={0.5x2,xδδx0.5δ2,otherwise

根据上面的公式可以看出,smooth l1是在 δ = 1 \delta=1 δ=1时的一种特例。那么为什么要引入这个loss呢?可以发现,当 δ → 0 \delta \rarr0 δ0时,损失函数接近MAE;当 δ → ∞ \delta \rarr \infty δ时,损失函数接近MSE。随着 δ \delta δ的变化,整个loss曲线的变化可以参考一下下图:
在这里插入图片描述
可以看出,MSE的情况对于离群点太敏感,鲁棒性可能不好;MAE整体太平缓,可能会出现梯度弥散。所以Huber Loss采取了一个折衷的方法,通过合理调节超参数 δ \delta δ,在消除离群点敏感的影响同时,也能保证一定的梯度,同时该loss在定义域内处处可导。当 δ = 1 \delta=1 δ=1时,Huber loss可以看作是smooth L1 Loss。

IoU Loss

IoU Loss也是一个跟检测框相关的回归loss。之前有L2 Loss可以计算预测bbox的位置宽高与GT之间的距离,并没有考虑坐标间的相关性。而IoU Loss则是从box的角度出发,具备位置的相关性,如下图所示:
在这里插入图片描述
IoU Loss在做检测框回归方面要更胜L2 Loss一筹,当两个box的IoU=1时,此时IoU Loss最小为1;当两个box的IoU很小,趋近于0时,此时的IoU Loss会非常大。

GIoU/DIoU/CIoU Loss

显而易见,IoU Loss在两个框没有交集IoU=0时,无法衡量两者之间的距离(相邻不重叠的,和相隔天涯海角的box之间的IoU是一样的);并且IoU Loss无法精确反映两个box之间的重合度大小。因此就有了后续若干个IoU Loss的改进版,这里篇幅所限不讨论了,可以参照这篇博客

Focal Loss

Focal Loss是目前在检测领域应用非常广泛的分类loss。由于在detection任务中正负样本的不均衡,并且存在难易样本(接近GT的样本为易分样本,离GT较远的称为难分样本)。所以需要利用Focal Loss解决这两个问题。

我们可以从传统的交叉上损失函数出发:
在这里插入图片描述
为了解决正负样本不均衡的问题,可以引入一个参数 α \alpha α,来给正样本loss更大的权重,如下:
在这里插入图片描述
加入 α \alpha α以后解决了正负样本不均衡的问题,但是并没有解决难易样本的问题。作者认为,易分样本对于模型精度的提升效果很小,模型应该更多的关注那些难分样本。所以这里的处理方法就是,将高置信度(易分)样本的损失降低一些,或者将低置信度(难分)样本的损失提高一些。所以就有了如下公式:
在这里插入图片描述
举个栗子,当 γ = 2 , p = 0.968 \gamma=2, p=0.968 γ=2,p=0.968时, ( 1 − p ) γ = 0.001 (1-p)^ \gamma=0.001 (1p)γ=0.001,此时就相当于把这个置信度很大的易分样本的权重削弱了1000倍。Focal Loss的最终表达形式如下所示:
在这里插入图片描述
实验证明当 γ = 2 , α = 0.25 \gamma=2, \alpha=0.25 γ=2,α=0.25时,效果最佳。

去年NeurIPS20上又出现了Focal Loss的改进版GFocal Loss,感兴趣的可以看下这篇文章

Dice Loss

Dice Loss在分割中有着广泛的应用,用于计算预测mask和GT mask之间的差别,这个loss需要从Dice系数说起。

Dice系数: s = 2 ∣ X ∩ Y ∣ ∣ X ∣ + ∣ Y ∣ s=\frac{2|X\cap Y|}{|X|+|Y|} s=X+Y2XY,其中X表示GT mask,Y表示预测得到的mask。两个mask都是和原图像大小,且每个位置非0即1的掩膜。之所以分子上乘2,是因为分母存在重复加的情况。我们发现,当X与Y完全一样时,s=1;当X与Y完全不重叠时,s=0。因此整个Dice系数的取值在[0, 1]。

Dice系数用更一般的表示方法可以表达为: s = 2 T P 2 T P + F N + F P s=\frac{2TP}{2TP+FN+FP} s=2TP+FN+FP2TP。这个公式可以完美的和上面的对应,TP就是预测mask和GT mask对应点都为1的部分;FN是预测mask为0 而GT mask为1的部分;FP是预测mask为1 而GT mask为0的部分。所以这个形式是Dice系数的更普遍的表达。

Dice Loss的计算式如下:

L D i c e = 1 − 2 ∣ X ∩ Y ∣ ∣ X ∣ + ∣ Y ∣ L_{Dice}=1-\frac{2|X\cap Y|}{|X|+|Y|} LDice=1X+Y2XY

但是Dice Loss在训练误差曲线会比较混乱,偶尔也会出现一些极端情况导致训练的不稳定,关于Dice Loss存在的一些问题,可以参考这篇文章

Dice Loss是Tversky Loss一种特殊形式,有兴趣的小伙伴可以读一下Tversky Loss的论文

Hinge Loss

之前在一篇embedding clustering类型的实例分割论文中看到过这个loss(《Instance Segmentation by Jointly Optimizing Spatial Embeddings and
Clustering Bandwidth》)。这个loss最早应该出现在SVM中,其主要的思想是给出一个松弛margin。众所周知,前面的所有loss,只要预测值和GT之间有一点的差别,loss就不会为0。而这个Loss的精髓之处就是,给定一个松弛空间,在离GT很近(小于margin)的这部分空间中,loss的计算值也设置为0。因此Hinge Loss的计算式可以概括如下:
在这里插入图片描述
这里截取了上述论文中的Hinge loss的公式,主要解释一下思想: C k C_{k} Ck表示第k个实例的质心, e i e_{i} ei表示属于这个instance的某个pixel的位置。只要两者之间的距离不超过 δ \delta δ,整个loss的计算值就为0。所以 δ \delta δ在这里是一个松弛变量,容许估计值与GT有margin之内的误差,该误差不计算在loss之内。

Triplet Loss

做Tracking时常用的loss,因为tracking需要把前后两帧里相同的instance进行匹配,匹配的原则大多是基于embedding的相似度。所以为了学习到更精确的embedding,通常会在ReId网络中采用Triplet Loss。这个损失函数的具体细节不展开了,感兴趣的小伙伴可以阅读这篇博客,写得非常清晰。

欢迎小伙伴进行指正和补充。

<think>嗯,用户问的是变化检测任务中的对比损失函数。首先,我得回忆一下对比损失的基本概念。对比损失通常用在需要区分相似和不相似样本的任务中,比如人脸识别或者图像检索。那么在变化检测里,应该是用来比较两幅图像之间的差异吧? 变化检测任务通常是分析同一地点不同时间拍摄的图像,找出其中的变化区域。这时候,对比损失的作用可能是在特征空间里拉近未变化区域的特征,同时推开变化区域的特征。也就是说,让未变化的特征尽可能相似,而变化后的特征差异更大。 接下来,我需要确认对比损失的具体形式。一般来说,对比损失函数会包含两个部分:一个处理相似样本对,另一个处理不相似样本对。公式大概是这样的:L = (1 - Y) * D² + Y * max(margin - D, 0)²,其中Y是标签,D是特征之间的距离,margin是设定的阈值。不过这个是不是在变化检测中有特别的调整呢? 可能需要考虑变化检测的数据结构。比如,输入是两幅图像,对应的同一位置像素或区域是否发生变化。这时候对比损失可能会针对每个像素或区域的特征对来计算。比如,对于没有变化的区域对,它们的特征距离应该小;变化的则大。同时,可能还需要结合其他损失函数,比如交叉熵,来分类是否变化。 另外,对比损失在变化检测中的优势是什么?可能是能够更好地区分细微的变化,避免因光照、季节等因素引起的误检。因为对比损失关注的是特征之间的相对距离,而不是绝对数值,这样模型可能更鲁棒。 不过有没有什么需要注意的地方呢?比如,正负样本的平衡问题。变化检测中大部分区域可能未变化,导致负样本远多于正样本,这时候可能需要调整损失权重,或者在采样时平衡样本对。 还有,对比损失中的margin选择也很关键。margin太小可能导致模型无法有效区分变化,太大可能会使训练不稳定。可能需要根据具体任务调整这个参数。 最后,有没有相关的论文或者方法使用了对比损失在变化检测中?比如,一些基于孪生网络的方法可能会采用对比损失来增强特征判别能力。或者结合其他损失函数,如triplet loss,来进一步提升性能。 总结一下,对比损失在变化检测中的作用是通过特征空间的约束,增强变化区域与未变化区域之间的区分度,从而提升检测的准确性。具体实现时需要根据任务调整损失函数的参数和结构,处理好样本平衡和特征距离的度量。</think>在变化检测任务中,**对比损失函数(Contrastive Loss)** 是一种通过特征空间约束来增强变化区域与未变化区域区分度的损失函数。以下是其核心要点: --- ### 1. **核心思想** - **相似性约束**:对未变化的图像区域(同类样本),缩小其在特征空间中的距离; - **差异性约束**:对发生变化的区域(异类样本),扩大其特征空间距离; - 通过这种方式,模型能更好地区分变化与未变化区域。 --- ### 2. **数学形式** 对比损失函数的一般公式为: $$ \mathcal{L} = \frac{1}{N} \sum_{i=1}^N \left[ y_i \cdot D(f_i^A, f_i^B)^2 + (1 - y_i) \cdot \max\left( \text{margin} - D(f_i^A, f_i^B), 0 \right)^2 \right] $$ - $f_i^A, f_i^B$:两时相图像在位置 $i$ 的特征向量; - $y_i$:标签(1表示变化,0表示未变化); - $D(\cdot)$:特征距离度量(如欧氏距离、余弦相似度); - $\text{margin}$:预设的阈值,控制差异性的边界(通常设为1)。 --- ### 3. **在变化检测中的具体应用** - **输入数据**:同一地点不同时间的两幅图像(时相A和时相B); - **特征提取**:通过卷积神经网络(如孪生网络)提取两时相的特征图; - **特征对比**:逐像素或逐区域计算特征距离,通过对比损失优化模型: - 未变化区域:$D(f^A, f^B) \rightarrow 0$; - 变化区域:$D(f^A, f^B) > \text{margin}$。 --- ### 4. **优势** - **鲁棒性**:减少光照、季节等非目标变化的干扰; - **灵活性**:可与其他损失(如交叉熵)结合使用; - **可解释性**:直接优化特征空间,增强变化区域的判别性。 --- ### 5. **挑战与改进** - **样本不平衡**:变化区域通常占比较小,需调整损失权重或采样策略; - **阈值选择**:$\text{margin}$ 需通过实验调优; - **改进方案**: - 结合三元组损失(Triplet Loss)进一步优化特征分布; - 使用自适应阈值(如动态调整 $\text{margin}$)。 --- ### 6. **典型应用场景** - 遥感图像变化检测(如建筑物变化、森林砍伐); - 医学图像分析(如病灶区域跟踪); - 视频监控中的场景变化识别。 --- ### 示例代码(PyTorch实现) ```python import torch import torch.nn as nn class ContrastiveLoss(nn.Module): def __init__(self, margin=1.0): super().__init__() self.margin = margin def forward(self, feat_A, feat_B, labels): distance = torch.sqrt(torch.sum((feat_A - feat_B)**2, dim=1)) # 欧氏距离 loss = labels * distance.pow(2) + (1 - labels) * torch.clamp(self.margin - distance, min=0).pow(2) return loss.mean() ``` --- ### 总结 对比损失通过显式约束特征空间的距离,帮助模型更精准地捕捉变化信息。在实际应用中,常需结合任务特点调整损失参数或融合其他监督信号(如语义分割损失),以达到最佳性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值