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

相关文章

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

(超详细)YOLOV7改进-Soft-NMS(支持多种IoU变种选择)

1.在until/general.py文件最后加上下面代码 2.在general.py里面找到这代码,修改这两个地方 3.之后直接运行即可

YOLOv8改进 | SPPF | 具有多尺度带孔卷积层的ASPP【CVPR2018】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进——点击即可跳转 Atrous Spatial Pyramid Pooling (ASPP) 是一种在深度学习框架中用于语义分割的网络结构,它旨

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

SQL Server中,isnull()函数以及null的用法

SQL Serve中的isnull()函数:          isnull(value1,value2)         1、value1与value2的数据类型必须一致。         2、如果value1的值不为null,结果返回value1。         3、如果value1为null,结果返回vaule2的值。vaule2是你设定的值。        如

tf.split()函数解析

API原型(TensorFlow 1.8.0): tf.split(     value,     num_or_size_splits,     axis=0,     num=None,     name='split' ) 这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。  value传入的就是需要切割的张量。  这个函数有两种切割的方式: 以三个维度的张量为例,比如说一

服务器雪崩的应对策略之----SQL优化

SQL语句的优化是数据库性能优化的重要方面,特别是在处理大规模数据或高频访问时。作为一个C++程序员,理解SQL优化不仅有助于编写高效的数据库操作代码,还能增强对系统性能瓶颈的整体把握。以下是详细的SQL语句优化技巧和策略: SQL优化 1. 选择合适的数据类型2. 使用索引3. 优化查询4. 范式化和反范式化5. 查询重写6. 使用缓存7. 优化数据库设计8. 分析和监控9. 调整配置1、

设置Nginx缓存策略

详细信息 Nginx服务器的缓存策略设置方法有两种:add_header或者expires。 1. add_header 1)语法:add_header name value。 2)默认值:none。 3)使用范围:http、server、location。 配置示例如下: add_header cache-control "max-age=86400";#设置缓存时间为1天。add

神经网络第三篇:输出层及softmax函数

在上一篇专题中,我们以三层神经网络的实现为例,介绍了如何利用Python和Numpy编程实现神经网络的计算。其中,中间(隐藏)层和输出层的激活函数分别选择了 sigmoid函数和恒等函数。此刻,我们心中不难发问:为什么要花一个专题来介绍输出层及其激活函数?它和中间层又有什么区别?softmax函数何来何去?下面我们带着这些疑问进入本专题的知识点: 1 输出层概述 2 回归问题及恒等函数 3

神经网络第一篇:激活函数是连接感知机和神经网络的桥梁

前面发布的文章介绍了感知机,了解了感知机可以通过叠加层表示复杂的函数。遗憾的是,设定合适的、能符合预期的输入与输出的权重,是由人工进行的。从本章开始,将进入神经网络的学习,首先介绍激活函数,因为它是连接感知机和神经网络的桥梁。如果读者认知阅读了本专题知识,相信你必有收获。 感知机数学表达式的简化 前面我们介绍了用感知机接收两个输入信号的数学表示如下: