RT-DETR改进策略【损失函数篇】| 2024 引进Focaler-IoU损失函数 加强边界框回归 (Focaler-DIoU、Focaler-GIoU、Focaler-CIoU)
一、本文介绍
本文记录的是改进
RT-DETR
的损失函数,将其替换成
Focaler-IoU
。现有研究通过利用边界框之间的几何关系来提高回归性能,但忽略了困难样本和简单样本分布对边界框回归的影响。不同检测任务中困难样本和简单样本的分布不同,对于简单样本占主导的检测任务,关注简单样本的边界框回归有助于提高检测性能;对于困难样本比例较高的检测任务,需要关注困难样本的边界框回归。
Focaler-IoU
能够通过关注不同的回归样本
,提高检测器在不同检测任务中的性能。
实现的
Focaler-IoU
包括:
Focaler-DIoU
、
Focaler-GIoU
、
Focaler-CIoU
二、Focaler-IoU设计原理
Focaler-IoU: More Focused Intersection over Union Loss
Focaler-IoU
是一种改进的交并比(IoU)损失函数,其设计的原理和优势如下:
2.1 原理
- 使用线性区间映射的方法重构IoU损失,以实现对不同回归样本的关注。
-
公式为:
I
o
U
f
o
c
a
l
e
r
=
{
0
,
I
o
U
<
d
I
o
U
−
d
u
−
d
,
d
≪
I
o
U
≪
u
1
,
I
o
U
>
u
IoU^{focaler} = \begin{cases}0, & IoU<d \\ \frac{IoU - d}{u - d}, & d \ll IoU \ll u \\ 1, & IoU>u\end{cases}
I
o
U
f
oc
a
l
er
=
⎩
⎨
⎧
0
,
u
−
d
I
o
U
−
d
,
1
,
I
o
U
<
d
d
≪
I
o
U
≪
u
I
o
U
>
u
,其中
I
o
U
f
o
c
a
l
e
r
IoU^{focaler}
I
o
U
f
oc
a
l
er
是重构的
Focaler - IoU,IoU是原始IoU值, [ d , u ] ∈ [ 0 , 1 ] [d, u] \in [0, 1] [ d , u ] ∈ [ 0 , 1 ] 。通过调整d和u的值,可以使 I o U f o c a l e r IoU^{focaler} I o U f oc a l er 关注不同的回归样本。 - 其损失定义为: L F o c a l e r − I o U = 1 − I o U f o c a l e r L_{Focaler - IoU} = 1 - IoU^{focaler} L F oc a l er − I o U = 1 − I o U f oc a l er 。
-
将Focaler - IoU损失应用于现有的基于IoU的边界框回归损失函数,得到
L
F
o
c
a
l
e
r
−
G
I
o
U
L_{Focaler - GIoU}
L
F
oc
a
l
er
−
G
I
o
U
、
L
F
o
c
a
l
e
r
−
D
I
o
U
L_{Focaler - DIoU}
L
F
oc
a
l
er
−
D
I
o
U
、
L
F
o
c
a
l
e
r
−
C
I
o
U
L_{Focaler - CIoU}
L
F
oc
a
l
er
−
C
I
o
U
、
L
F
o
c
a
l
e
r
−
E
I
o
U
L_{Focaler - EIoU}
L
F
oc
a
l
er
−
E
I
o
U
和
L
F
o
c
a
l
e
r
−
S
I
o
U
L_{Focaler - SIoU}
L
F
oc
a
l
er
−
S
I
o
U
,具体公式如下:
- L F o c a l e r − G I o U = L G I o U + I o U − I o U F o c a l e r L_{Focaler - GIoU} = L_{GIoU} + IoU - IoU^{Focaler} L F oc a l er − G I o U = L G I o U + I o U − I o U F oc a l er
- L F o c a l e r − D I o U = L D I O U + I o U − I o U F o c a l e r L_{Focaler - DIoU} = L_{DIOU} + IoU - IoU^{Focaler} L F oc a l er − D I o U = L D I O U + I o U − I o U F oc a l er
- L F o c a l e r − C I o U = L C I o U + I o U − I o U F o c a l e r L_{Focaler - CIoU} = L_{CIoU} + IoU - IoU^{Focaler} L F oc a l er − C I o U = L C I o U + I o U − I o U F oc a l er
- L F o c a l e r − E I o U = L E I O U + I o U − I o U F o c a l e r L_{Focaler - EIoU} = L_{EIOU} + IoU - IoU^{Focaler} L F oc a l er − E I o U = L E I O U + I o U − I o U F oc a l er
- L F o c a l e r − S I o U = L S I o U + I o U − I o U F o c a l e r L_{Focaler - SIoU} = L_{SIoU} + IoU - IoU^{Focaler} L F oc a l er − S I o U = L S I o U + I o U − I o U F oc a l er
2.2 优势
- 能够通过关注不同的回归样本,提高检测器在不同检测任务中的性能。
- 论文中通过对比实验证明,使用Focaler - IoU可以有效提高检测性能,弥补现有方法的不足。例如在PASCAL VOC数据集上的实验中,YOLOv8 + Focaler - SloU相比于YOLOv8 + SIoU,AP50提高了0.3,mAP50 : 95提高了0.3;在AI - TOD数据集上的实验中,YOLOv5 + Focaler - SloU相比于YOLOv5 + SIoU,AP50提高了1.9,mAP50 : 95提高了0.5。
论文: https://arxiv.org/pdf/2401.10525
源码: https://github.com/malagoutou/Focaler-IoU
三、Focaler-IoU的实现代码
论文链接中的
Focaler-IoU
的实现代码如下:
iou = ((iou - d) / (u - d)).clamp(0, 1) #default d=0.00,u=0.95
四、添加步骤
4.1 ultralytics/utils/loss.py
此处需要查看的文件是
ultralytics/utils/loss.py
utils\loss.py
用于计算各种损失。我们想要加入新的损失函数就只需要将代码放到这个文件内即可。
Focaler-IoU
添加到
BboxLoss
函数内:
4.1.1 Focaler-DIoU
iou = bbox_iou(pred_bboxes[fg_mask], target_bboxes[fg_mask], xywh=False, DIoU=True)
d = 0.00
u = 0.95
if torch.all(iou > u):
iou = 1
elif torch.all(iou < d):
iou = 0
else:
iou = ((iou - d) / (u - d)).clamp(0, 1)
loss_iou = ((1.0 - iou) * weight).sum() / target_scores_sum
4.1.2 Focaler-GIoU
iou = bbox_iou(pred_bboxes[fg_mask], target_bboxes[fg_mask], xywh=False, GIoU=True)
d = 0.00
u = 0.95
if torch.all(iou > u):
iou = 1
elif torch.all(iou < d):
iou = 0
else:
iou = ((iou - d) / (u - d)).clamp(0, 1)
loss_iou = ((1.0 - iou) * weight).sum() / target_scores_sum
4.1.3 Focaler-CIoU
iou = bbox_iou(pred_bboxes[fg_mask], target_bboxes[fg_mask], xywh=False, CIoU=True)
d = 0.00
u = 0.95
if torch.all(iou > u):
iou = 1
elif torch.all(iou < d):
iou = 0
else:
iou = ((iou - d) / (u - d)).clamp(0, 1)
loss_iou = ((1.0 - iou) * weight).sum() / target_scores_sum
五、成功运行截图