一、本文介绍
本文记录的是改进YOLOv9的损失函数,将其替换成Focaler-IoU
。现有研究通过利用边界框之间的几何关系来提高回归性能,但忽略了困难样本和简单样本分布对边界框回归的影响。不同检测任务中困难样本和简单样本的分布不同,对于简单样本占主导的检测任务,关注简单样本的边界框回归有助于提高检测性能;对于困难样本比例较高的检测任务,需要关注困难样本的边界框回归。Focaler-IoU
能够通过关注不同的回归样本,提高检测器在不同检测任务中的性能。
实现的Focaler-IoU
包括:Focaler-DIoU
、Focaler-GIoU
、Focaler-CIoU
、Focaler-MDPIoU
。
文章目录
- 一、本文介绍
- 二、Focaler-IoU设计原理
- 2.1 原理
- 2.2 优势
- 三、Focaler-IoU的实现代码
- 四、添加步骤
- 4.1 utils\metrics.py
- 4.1.2 Focaler-DIoU
- 4.1.3 Focaler-GIoU
- 4.1.4 Focaler-CIoU
- 4.1.5 Focaler-MDPIoU
二、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} IoUfocaler=⎩ ⎨ ⎧0,u−dIoU−d,1,IoU<dd≪IoU≪uIoU>u,其中 I o U f o c a l e r IoU^{focaler} IoUfocaler是重构的
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} IoUfocaler关注不同的回归样本。 - 其损失定义为: 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} LFocaler−IoU=1−IoUfocaler。
- 将Focaler - IoU损失应用于现有的基于IoU的边界框回归损失函数,得到 L F o c a l e r − G I o U L_{Focaler - GIoU} LFocaler−GIoU、 L F o c a l e r − D I o U L_{Focaler - DIoU} LFocaler−DIoU、 L F o c a l e r − C I o U L_{Focaler - CIoU} LFocaler−CIoU、 L F o c a l e r − E I o U L_{Focaler - EIoU} LFocaler−EIoU和 L F o c a l e r − S I o U L_{Focaler - SIoU} LFocaler−SIoU,具体公式如下:
- 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} LFocaler−GIoU=LGIoU+IoU−IoUFocaler
- 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} LFocaler−DIoU=LDIOU+IoU−IoUFocaler
- 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} LFocaler−CIoU=LCIoU+IoU−IoUFocaler
- 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} LFocaler−EIoU=LEIOU+IoU−IoUFocaler
- 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} LFocaler−SIoU=LSIoU+IoU−IoUFocaler
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 utils\metrics.py
此处需要查看的文件是utils\metrics.py
metrics.py中定义了模型的损失函数和计算方法,我们想要加入新的损失函数就只需要将代码放到这个文件内即可。
Focaler-IoU
添加后如下:
4.1.2 Focaler-DIoU
iou = bbox_iou(pred_bboxes_pos, target_bboxes_pos, 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
4.1.3 Focaler-GIoU
iou = bbox_iou(pred_bboxes_pos, target_bboxes_pos, 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
4.1.4 Focaler-CIoU
iou = bbox_iou(pred_bboxes_pos, target_bboxes_pos, 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
4.1.5 Focaler-MDPIoU
iou = bbox_iou(pred_bboxes_pos, target_bboxes_pos, xywh=False, MDPIoU=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