【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 into
    Model Learning and Inference for Object Detection and Instance
    Segmentation <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]  + eps
    h1 = pred[:, 3]  + eps
    w2 = target[:, 2] + eps
    h2 = target[:, 3] + eps

    wh_distance = ((w1 - w2) ** 2 + (h1 - h2) ** 2) / 4

    wasserstein_2 = center_distance + wh_distance
    return 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。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/496338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开了抖店还不知道怎么下手操作的,建议把这篇文章看完!

大家好&#xff0c;我是电商小布。 我们都知道&#xff0c;抖音这个平台可以说是当前短视频行业中&#xff0c;最主流的项目了。 而这其中发展的电商&#xff0c;也是逐渐成为了行业内的头部。 对于一些想要在其中享受到优势的小伙伴&#xff0c;就抓住这个机会&#xff0c;…

基于Java仓库管理系统设计与实现(源码+部署文档+论文)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

无服务数据库是未来的趋势吗?

无服务数据库是未来的趋势吗&#xff1f; 无服务器数据库是未来的趋势吗&#xff1f;无服务器数据库与传统云数据库有何不同&#xff1f; Amazon Aurora Serverless&#xff08;如下图所示&#xff09;是 Amazon Aurora 的一种配置方式&#xff0c;可以按需自动扩展。 Aurora…

ChatGPT 商业金矿(上)

原文&#xff1a;ChatGPT Business Goldmines 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第一章&#xff1a;为什么我写这本书 欢迎阅读《ChatGPT 多源收入&#xff1a;20 个利润丰厚的业务&#xff0c;任何人都可以在一周内使用 ChatGPT 开始》。我很高兴分享我…

谷歌上架,账号高风险被封,一定是账号问题吗?

最近&#xff0c;很多开发者反馈&#xff0c;开发者账号总是被谷歌官方以“高风险行为”封号。封号邮件如图&#xff1a; 我们都清楚&#xff0c;账号被封的主要原因无非是账号本身质量问题和程序代码的问题。但目前大多数开发者普遍认为&#xff0c;如果账号是因为“高风险”被…

m4r是什么文件格式?用什么软件打开?

m4r文件格式的诞生伴随着移动设备智能化的崛起。这个格式最初是苹果公司为其iPhone设计的一种特殊的铃声格式。在这个数字音频领域&#xff0c;用户对于个性化铃声的需求逐渐升温&#xff0c;m4r文件格式因此迎来了时代的机遇。这个独特的音频格式的产生&#xff0c;旨在为用户…

UE RPC 外网联机(1)

技术&#xff1a;RPC TCP通信 设计&#xff1a;大厅服务<---TCP--->房间服务<---RPC--->客户端&#xff08;Creator / Participator&#xff09; 1. PlayerController 用于RPC通信控制 2.GameMode 用于数据同步 3.类图 4. 注意 &#xff08;1&#xff09;RPC&a…

Advisor 被重复代理问题排查

问题场景 项目中存在多个 AbstractAdvisorAutoProxyCreator 且其持有的 Advisor Bean 重复 问题复现 相关代码 ResponseBodyRequiresPermissions(PermissionConstant.****)GetMapping(value "/query****.json", name "")public List<***> query…

处理 Oracle 数据库表空间满的问题

处理 Oracle 数据库表空间满的问题 1、诊断表空间满的问题2、处理表空间满的问题3、设置表空间自增结论 在 Oracle 数据库管理中&#xff0c;表空间是一个重要的概念&#xff0c;用于存储数据库对象和数据。当表空间满了时&#xff0c;可能会导致数据库的运行受到影响&#xff…

计算机网络知识

第一章 局域网广播技术&#xff1b;广域网交换技术 n-SDUn-PCIn-PDU TCP/IP网络层无连接&#xff0c;传输层有链接和无连接&#xff1b;OSI传输层有链接和无连接&#xff0c;网络层有链接 TCP/IP没有明确区分服务&#xff0c;接口&#xff0c;协议&#xff0c;OSI明确区分 OSI…

实验7 内置对象response

编写代码&#xff0c;掌握request、response的用法。【参考课本4.6.2】 三、源代码以及执行结果截图&#xff1a; input.jsp <% page language"java" contentType"text/html; charsetutf-8" pageEncoding"utf-8"%> <!DOCTYPE html>…

微信小程序开发之常用组件解释

1 基础内容组件 1.1text组件 text的功能主要是用于内联文本&#xff0c;与网页中的span有点类似。 主要属性有 例子&#xff1a;页面上添加一个可以选中的文本 在wxml文件中添加&#xff1a; <view> <text user-select>17544456565</text> </view>…

ReentrantLock 原理

(一)、非公平锁实现原理 1、加锁解锁流程 先从构造器开始看&#xff0c;默认为非公平锁实现 public ReentrantLock() {sync new NonfairSync(); } NonfairSync 继承自 AQS 没有竞争时 加锁流程 构造器构造&#xff0c;默认构造非公平锁(无竞争&#xff0c;第一个线程尝试…

Jmeter使用BeanShell保存数据到文件

1、目的 在使用jmeter压测时&#xff0c;业务上下连贯&#xff0c;需要对一些编号进行关联操作。这里使用‘JSON提取器’将值提取出来&#xff0c;后面请求可以直接使用。其它业务想要使用就只能把值保存到文件&#xff0c;再使用文件做参数化了。 2、JSON提取器 提取请求值 提…

MongoDB副本集环境搭建(以单机Windows为例)

前言 近期有搭建MongoDB副本集的需求,简单记录一下搭建过程(以本地Windows环境为例)。 一、副本集选型 1 Primary节点、1 Secondary 节点、1 Arbiter节点模式副本集环境搭建。 二、搭建过程 1. 安装MongoDB服务 下载地址:https://www.mongodb.com,如下图所示: 选择…

1.排列数组奇数在前偶数在后

文章目录 大家好&#xff0c;我是晓星航。今天为大家带来的是 排列数组奇数在前偶数在后 相关的讲解&#xff01;&#x1f600; public static void swap(int[] array) {int left 0;int right array.length - 1;while (left < right) {while (left < right &&…

SQLAlchemy常用数据类型

Integer &#xff1a;整形&#xff0c;映射到数据库中是 int 类型。 Float &#xff1a;浮点类型&#xff0c;映射到数据库中是 float 类型。他占据的 32 位。 Double &#xff1a;双精度浮点类型&#xff0c;映射到数据库中是 double 类型&#xff0c;占 据64 位 (SQLALCHEM…

【C++初阶】之类和对象(下)

【C初阶】之类和对象&#xff08;下&#xff09; ✍ 再谈构造函数&#x1f3c4; 初始化列表的引入&#x1f498; 初始化列表的语法&#x1f498; 初始化列表初始化元素的顺序 &#x1f3c4; explicit关键字 ✍ Static成员&#x1f3c4; C语言中的静态变量&#x1f3c4; C中的静…

源聚达科技:抖音开网店步骤难吗

在数字化浪潮的推动下&#xff0c;抖音平台不仅成为了人们娱乐休闲的好去处&#xff0c;更是许多创业者眼中的“金矿”。然而&#xff0c;对于初次尝试在抖音开设网店的朋友来说&#xff0c;难免会对开店流程感到疑惑。究竟开设一个抖音网店的难度如何呢?让我们一探究竟。 要明…

视觉大模型学习路径

本文只是从全局角度出发梳理学习过程&#xff0c;现阶段不会针对每一步写文章&#xff0c;工作没什么时间&#xff0c;但是会梳理自己的学习过程和一些好的参考文章。后面有时间再系统梳理每个模型 总览 本人目前主要研究基于transfermer的视觉大模型&#xff0c;同时也会学习…
最新文章