文章目录
1、Cross Entropy Loss(交叉熵)
公式:
L
=
−
∑
i
y
i
⋅
l
o
g
(
p
i
)
L=-\sum _i y_i \cdot log(p_i)
L=−i∑yi⋅log(pi)
其中 y i y_i yi 为人工标注的, p i p_i pi 为预测的概率;
2、Binary Cross Entropy Loss(二元交叉熵)
公式:
H
p
(
q
)
=
−
1
N
[
∑
i
=
1
N
y
i
⋅
l
o
g
(
p
(
y
i
)
)
+
(
1
−
y
i
)
⋅
l
o
g
(
1
−
p
(
y
i
)
)
]
H_{p(q)}=-\frac{1}{N}[\sum^N_{i=1}y_i \cdot log(p(y_i))+(1-y_i) \cdot log(1-p(y_i))]
Hp(q)=−N1[i=1∑Nyi⋅log(p(yi))+(1−yi)⋅log(1−p(yi))]
[
]
[ ]
[]里面表示的是单个样本分别预测正样本和负样本的概率。
3、Balance Binary Cross Entropy Loss(平衡二元交叉熵)
目的:解决正负样本不平衡的问题。
4、Focal Loss
(
1
−
p
)
γ
(1-p)^\gamma
(1−p)γ用于难样本的挖掘,如一个样本预测正样本的概率较低,则
(
1
−
p
)
γ
(1-p)^\gamma
(1−p)γ会加大正样本的权重,
p
γ
p^\gamma
pγ会减少负样本的权重;
5、smoothL1 Loss
smoothL1 Loss手写代码与torch封装的smoothL1 Loss比较:
import torch
import torch.nn.functional as F
# 自己设计的smooth_l1_loss
def smooth_l1_loss(a, b):
loss_part1 = torch.abs(a - b)
loss_part2 = loss_part1 ** 2
loss_part2 = loss_part2 * 0.50
loss2 = torch.where(loss_part1 >= 1, loss_part1 - 0.5, loss_part2)
#下面是统计每个预测框的loss
#loss2 = torch.sum(loss2, dim = 1)
#最终返回的是所有预测框的loss
loss2 = torch.sum(loss2)
return loss2
def test_smmoth_l1_loss():
loc_p = torch.tensor([1, 5, 3, 0.5])
loc_t = torch.tensor([4, 1, 0, 0.4])
loss_1 = F.smooth_l1_loss(loc_p, loc_t, size_average=False)
print ("F.smooth_l1_loss:", loss_1)
loss_2 = smooth_l1_loss(loc_p, loc_t)
print ("smooth_l1_loss:", loss_2)
6、IOU,GIOU,CIOU
6.1 IOU损失
- 如下图,绿色框是ground truth,蓝色框是预测框,则,
I O U = 绿色框面积 ∩ 蓝色框面积 绿色框面积 ∪ 蓝色框面积 IOU=\frac{绿色框面积\cap蓝色框面积}{绿色框面积\cup蓝色框面积} IOU=绿色框面积∪蓝色框面积绿色框面积∩蓝色框面积 - IOU损失一般用
l
o
s
s
=
1
−
I
O
U
loss=1-IOU
loss=1−IOU即可
IOU损失存在的问题:
- 没有相交则IOU=0无法梯度计算,
- 相同的IOU却反映不出实际情况到底咋样
6.2 GIOU损失
-
为了解决IOU损失产生的问题,引入了GIOU
-
GIOU的计算公式:
L G I o U = 1 − I o U + ∣ C − B ∪ B g t ∣ ∣ C ∣ L_{GIoU}=1-IoU+\frac{\mid C-B\cup B^{gt}\mid}{\mid C\mid} LGIoU=1−IoU+∣C∣∣C−B∪Bgt∣
引入了最小封闭形状C (C可以把A,B包含在内),在不重叠情况下能让预测框尽可能朝着真实框前进
- GIOU存在的问题,如果预测框和真实框重叠,也会出现IoU一样,但预测框与真实框的分布不一样,
6.3 DIoU损失
- DIoU公式:
L D I o U = 1 − I o U + ρ 2 ( b , b g t ) c 2 L_{DIoU}=1-IoU+\frac{\rho^2(b,b^{gt})}{c^2} LDIoU=1−IoU+c2ρ2(b,bgt)
其中分子计算预测框与真实框的中心点欧式距离 d,分母是能覆盖预测框与真实框的最小BOX的对角线长度 c,直接优化距离,速度更快,并解决GIOU问题,如下图所示,
6.4 CIOU损失
- CIOU公式:
L C I o U = 1 − I o U + ρ 2 ( b , b g t ) c 2 + α ν L_{CIoU}=1-IoU+\frac{\rho^2(b,b^{gt})}{c^2}+\alpha \nu LCIoU=1−IoU+c2ρ2(b,bgt)+αν
α = ν ( 1 − I o U ) + ν \alpha=\frac{\nu}{(1-IoU)+\nu} α=(1−IoU)+νν
ν = 4 π 2 ( a r c t a n w g t h g t − a r c t a n w h ) 2 \nu=\frac{4}{\pi^2}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})^2 ν=π24(arctanhgtwgt−arctanhw)2
损失函数必须考虑三个几何因素:重叠面积,中心点距离,长宽比(即
ν
\nu
ν),
其中
α
\alpha
α可以当做权重参数