YOLOv5改进(三)-- 引进Focaler-IoU损失函数
YOLOv5改进策略:Focaler-IoU损失函数改进
1、前言
目标检测是计算机视觉的基本任务之一,旨在识别图像中的目标并定位其位置。目标检测算法可分为基于锚点和无锚点的方法。基于锚点的方法包括Faster R-CNN、YOLO系列、SSD和RetinaNet等。无锚点方法包括CornerNet、CenterNet和FCOS等。在这些检测器中,边界框回归损失函数作为定位分支的重要组成部分,起着不可替代的作用。
Zhang Hao 提出了一种新的边界框回归损失函数Focaler-IoU,该函数能够关注不同难度的回归样本,并动态调整样本权重以优化回归性能。Focaler-IoU结合了IoU(Intersection over Union)和Focal Loss的思想,通过引入一个可学习的关注因子来调整不同样本的权重。在训练过程中,关注因子会根据回归结果动态调整,使得回归器更加关注那些对定位精度影响较大的样本。
2、摘要
边框回归在目标检测领域扮演着关键角色,目标检测的定位精度很大程度上取决于边框回归损失函数。现有的研究通过利用边框之间的几何关系来提升回归效果,而忽略难易样本分布对于边框回归的影响。在本文我们分析了难易样本分布对回归结果的影响,接着我们提出Focaler-IoU方法,其能够在不同的检测任务中通过聚焦不同的回归样本来提升检测器的效果。最后针对不同的检测任务使用现有先进检测器与回归方法进行对比实验,使用本文方法后检测效果得到进一步提升。
3、Focaler-IoU:
为了在能够在不同的检测任务中聚焦不同的回归样本,我们使用线性区间映射的方法来重构IoU损失,使得边框回归效果得到提升。即通过定义 d 和 u 两个数,通过比较原始IoU值去重构新的IoU,具体公式如下:
其中[d,u]∈[0,1]区间,IoU为原始的IoU值,IoUfacaler 为重构后新的IoU,我们当前记为Facaler-IoU,通过比较原始IoU值,动态调整IoUfacaler 值,得到不同的回归样本。
Focaler损失函数定义:
将回归样本IoUfacaler 应用至现有基于IoU的边框回归损失函数中,得到不同的回归损失函数:LFacaler-GIoU 、 LFacaler-DIoU 、 LFacaler-CIoU 、 LFacaler-EIoU 、 LFacaler-SIoU ,其定义如下:
<!-- 其代码样例-->
<p style="text-align:center; color:orange;size:3px;font-weight:bolder">L<sub>Facaler-GIoU</sub> = L<sub>GIoU</sub> + IoU - IoU<sup>facaler</sup></p>
作者实验:
(1)在YOLOv8比较 SIoU
和 Focaler-SIoU
(1)在YOLOv5比较 SIoU
和 Focaler-SIoU
4、代码实现
作者论文就给出代码,只有一行
iou = ((iou - d) / (u - d)).clamp(0, 1) #default d=0.00,u=0.95
在YOLOv5目录下,utils/loss.py
中 def __call__()
函数里面就有iou的计算,找到iou = bbox_iou()
在其后面添加该作者代码即可。因为作者代码写着是三段函数,但是通过查看作者给出的代码,发现并没有做判断,于是这里就根据作者的代码进行了重构。
# 原始IoU
iou = bbox_iou(pbox.T, tbox[i], x1y1x2y2=False, CIoU=True) # iou(prediction, target)
# 引入 Focaler-IoU 回归样本
# default d=0.00,u=0.95
d = 0.00
u = 0.95
# iou = ((iou - d) / (u - d)).clamp(0, 1) # 原作者代码
iou = 1 if iou > u else (0 if iou < d else ((iou - d) / (u - d)).clamp(0, 1)) # 根据公式重构 Focaler-IoU
lbox += (1.0 - iou).mean() # iou loss 损失函数
修改完后的效果
5、目标检测系列文章
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)