本篇文章介绍目标检测中不同的损失函数概念及其代码实现。目标检测主要任务为实现目标的
分类
与定位
,其损失组成如下:
类别/置信度损失
(分类任务):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)−(1−y)log(1−p)
其中 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={
p,y=11−p,otherwise
针对多类别任务,可通过独热编码
将其分解为多个二分类任务的组合再使用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)=−(1−pt)γ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(1−pt)γlog(pt)
F L ( y , p ) = − α ( 1 − p ) γ y log ( p ) − ( 1 − α ) p γ ( 1 − y ) log