YOLOv5改进策略:Focaler-IoU损失函数改进

2024-05-26 18:20

本文主要是介绍YOLOv5改进策略:Focaler-IoU损失函数改进,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1、前言
  • 2、摘要
  • 3、Focaler-IoU:
  • 4、代码实现
  • 5、目标检测系列文章

1、前言

​ 目标检测是计算机视觉的基本任务之一,旨在识别图像中的目标并定位其位置。目标检测算法可分为基于锚点和无锚点的方法。基于锚点的方法包括Faster R-CNN、YOLO系列、SSD和RetinaNet等。无锚点方法包括CornerNet、CenterNet和FCOS等。在这些检测器中,边界框回归损失函数作为定位分支的重要组成部分,起着不可替代的作用。

​ Zhang Hao 提出了一种新的边界框回归损失函数Focaler-IoU,该函数能够关注不同难度的回归样本,并动态调整样本权重以优化回归性能。Focaler-IoU结合了IoU(Intersection over Union)和Focal Loss的思想,通过引入一个可学习的关注因子来调整不同样本的权重。在训练过程中,关注因子会根据回归结果动态调整,使得回归器更加关注那些对定位精度影响较大的样本。

  1. 论文《Focaler-IoU:更聚焦的IoU损失》
  2. 代码
  3. 作者导读:Focaler-IoU: 更加聚焦的IoU损失

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比较 SIoUFocaler-SIoU

在这里插入图片描述

(1)在YOLOv5比较 SIoUFocaler-SIoU
在这里插入图片描述

4、代码实现

作者论文就给出代码,只有一行

 iou = ((iou - d) / (u - d)).clamp(0, 1)  #default d=0.00,u=0.95

在YOLOv5目录下,utils/loss.pydef __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-IoUlbox += (1.0 - iou).mean()  # iou loss 损失函数

修改完后的效果
在这里插入图片描述

5、目标检测系列文章

  1. YOLOv5s网络模型讲解(一看就会)
  2. 生活垃圾数据集(YOLO版)
  3. YOLOv5如何训练自己的数据集
  4. 双向控制舵机(树莓派版)
  5. 树莓派部署YOLOv5目标检测(详细篇)
  6. YOLO_Tracking 实践 (环境搭建 & 案例测试)
  7. 目标检测:数据集划分 & XML数据集转YOLO标签
  8. YOLOv5改进–轻量化YOLOv5s模型
  9. DeepSort行人车辆识别系统(实现目标检测+跟踪+统计)
  10. YOLOv5目标检测优化点(添加小目标头检测)
  11. YOLOv5参数大全(parse_opt篇)

这篇关于YOLOv5改进策略:Focaler-IoU损失函数改进的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005234

相关文章

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87