学习资源站

RT-DETR改进策略【损失函数篇】2024引进Focaler-IoU损失函数加强边界框回归(Focaler-DIoU、Focaler-GIoU、Focaler-CIoU)-

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

五、成功运行截图

在这里插入图片描述