【YOLOv5改进系列(5)】高效涨点----添加密集小目标检测NWD方法

2024-03-27 19:36

本文主要是介绍【YOLOv5改进系列(5)】高效涨点----添加密集小目标检测NWD方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述


文章目录

  • 🚀🚀🚀前言
  • 一、1️⃣ 修改loss.py文件
    • 1.1 🎓 修改1
    • 1.2 ✨ 修改2
    • 1.3 ⭐️相关代码的解释
  • 二、2️⃣NWD实验
    • 2.1 🎓 实验一:基准模型
    • 2.2 ✨实验二:NWD权重设置0.5
    • 2.3 ⭐️实验三:NWD权重设置1.0
    • 2.4 🎯实验总结


在这里插入图片描述

👀🎉📜系列文章目录

【论文精读】NWD:一种用于微小目标检测的归一化高斯Wasserstein距离(A Normalized Gaussian Wasserstein Distance for Tiny Object ) !!!必读
【YOLOv5改进系列(1)】高效涨点----使用EIoU、Alpha-IoU、SIoU、Focal-EIOU替换CIou
【YOLOv5改进系列(2)】高效涨点----Wise-IoU详细解读及使用Wise-IoU(WIOU)替换CIOU
【YOLOv5改进系列(3)】高效涨点----Optimal Transport Assignment:OTA最优传输方法
【YOLOv5改进系列(4)】高效涨点----添加可变形卷积DCNv2

🚀🚀🚀前言

🚀检测微小物体是一个非常具有挑战性的问题,因为微小物体仅包含几个像素大小。由于缺乏外观信息,最先进的探测器在微小物体上无法产生令人满意的结果。在此之前也有不少研究者发现了IOU度量对于微小物体的偏差非常敏感,也提出了不少改进,像DIOU、GIOU、CIOU、等等,但是都是基于位置去判断两个框的距离和相似度,依旧无法解决小物体的位置敏感问题。为此武汉大学的一些研究人员将边界框建模为 2D 高斯分布,然后提出一种称为归一化 Wasserstein 距离(NWD)的新度量,以通过相应的高斯分布计算它们之间的相似性

在原论文中作者将NWD方法替换掉Faster r-cnn中的标签分配、NMS极大值抑制、Iou损失,本篇文章介绍了如何将yolov5中的IOU损失替换成NWD的计算方法。本次使用的数据集是热轧钢带的六种典型表面缺陷数据集,只有小部分疵点是小目标,在相较于基准模型来说,map@0.5从0.78提升到了0.814。


一、1️⃣ 修改loss.py文件

1.1 🎓 修改1

📌首先找到utils文件夹下的loss.py文件,在该文件中找到ComputeLoss类函数,大概是在第90行左右。

在这里插入图片描述
📌在ComputeLoss类函数上面添加如下代码,该代码是用来计算归一化 Wasserstein 距离的:

def wasserstein_loss(pred, target, eps=1e-7, constant=12.8):r"""`Implementation of paper `Enhancing Geometric Factors intoModel Learning and Inference for Object Detection and InstanceSegmentation <https://arxiv.org/abs/2005.03572>`_.Code is modified from https://github.com/Zzh-tju/CIoU.Args:pred (Tensor): Predicted bboxes of format (x_center, y_center, w, h),shape (n, 4).target (Tensor): Corresponding gt bboxes, shape (n, 4).eps (float): Eps to avoid log(0).Return:Tensor: Loss tensor."""center1 = pred[:, :2]center2 = target[:, :2]whs = center1[:, :2] - center2[:, :2]center_distance = whs[:, 0] * whs[:, 0] + whs[:, 1] * whs[:, 1] + eps #w1 = pred[:, 2]  + epsh1 = pred[:, 3]  + epsw2 = target[:, 2] + epsh2 = target[:, 3] + epswh_distance = ((w1 - w2) ** 2 + (h1 - h2) ** 2) / 4wasserstein_2 = center_distance + wh_distancereturn torch.exp(-torch.sqrt(wasserstein_2) / constant)

1.2 ✨ 修改2

还是utils文件夹下的loss.py文件,在ComputeLoss类函数找到__call__函数,在__call__函数里面找到下面两行代码,后面添加的代码需要将这两行替换掉,当然你也可以将这两行注释掉。

在这里插入图片描述
📌需要替换的代码如下:

nwd = wasserstein_loss(pbox, tbox[i]).squeeze()
iou_ratio = 0.5
lbox += (1 - iou_ratio) * (1.0 - nwd).mean() + iou_ratio * (1.0 - iou).mean()  # iou loss# Objectness
iou = (iou.detach() * iou_ratio + nwd.detach() * (1 - iou_ratio)).clamp(0, 1).type(tobj.dtype)

📌替换之后的代码显示如下,这个步骤执行完,所有的修改就已经完毕了,可以训练数据集了:

在这里插入图片描述

1.3 ⭐️相关代码的解释

🔥这里的话其实iou和nwd方法都有使用,但是使用了一个iou_ratio 来设置两者损失所占的权重,iou_ratio被设置为0.5,意味着两种损失的权重相等。如果 iou_ratio 被设置为0,那么在计算最终损失时,只会考虑到“nwd”损失,而不会考虑到“IoU”损失。

🔥同时还需要设置clamp值域的一个限定,因为我们的Iou取值(DIOU)可能是-1~1,但是后面obji = self.BCEobj(pi[..., 4], tobj)方法需要用到IOU的值,但是BCE得方法取值只能是0 ~ 1 的。所以我们需要设置clamp(0,1)将Iou的值域限制在0 ~ 1之间。
在这里插入图片描述

二、2️⃣NWD实验

2.1 🎓 实验一:基准模型

⚡️在没有修改任何网络的yolov5训练结果:F1置信度分数为0.71、map@0.5=0.78;
在这里插入图片描述
在这里插入图片描述

2.2 ✨实验二:NWD权重设置0.5

☀️将iou_ratio权重设置0.5,此时IOU损失和NWD损失各占一半,实验结果:F1置信度分数为0.77、map@0.5=0.814;详细训练结果图如下:

在这里插入图片描述
在这里插入图片描述

2.3 ⭐️实验三:NWD权重设置1.0

☀️将iou_ratio权重设置0.0,此时只考虑到nwd损失,而不考虑到IoU损失,实验结果:F1置信度分数为0.72,map@0.5=0.751;详细训练结果图如下:
在这里插入图片描述
在这里插入图片描述

2.4 🎯实验总结

🚀该数据集中的crazing类普遍是大目标,通过实验1和实验3进行对比crazing的map@0.5下降比较严重,但是实验2的crazing大目标的map@0.5有所增加。所以,对于某一个数据集,如果同时有大目标和小目标,建议IOU损失和NWD同时使用,如果只使用NWD进行检测,对于某些大目标的的检测效果反而不如使用IOU。


在这里插入图片描述

这篇关于【YOLOv5改进系列(5)】高效涨点----添加密集小目标检测NWD方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复