YOLOv11小白的进击之路(九)创新YOLO11损失函数之NWD损失函数源码解读

之前的博客也有对YOLO11的损失函数进行过源码分析,可以参考:YOLOv11小白的进击之路(六)创新YOLO的iou及损失函数时的源码分析_yolov11的损失函数是什么-CSDN博客最近在做小目标检测的时候注意到了NWD损失函数,这里对其源码进行分析,结合YOLO11更改损失函数后在我自己的数据集上有一定的提升,但是效果并不是很明显(可能我的数据集目标尺寸并没有特别小?)这里留待之后讨论。

NWD

NWD是一种用于目标检测的损失函数,通过将边界框建模为高斯分布,并计算两个分布之间的Wasserstein距离来衡量相似性。具体步骤包括:

  • 边界框参数化:将边界框 R=(cx,cy,w,h)(中心点坐标和宽高)转换为高斯分布,其中均值为中心点 (cx,cy),协方差矩阵由宽高 (w,h)决定。

  • Wasserstein距离计算:衡量两个分布之间的差异,公式为 W2=∥c1−c2∥2+∥w1−w2∥2+∥h1−h2∥2W2=∥c1​−c2​∥2+∥w1​−w2​∥2+∥h1​−h2​∥2,其中 c为中心点,w,h 为宽高。

  • 归一化相似度:通过指数归一化将距离转换为相似度值 NWD=exp⁡(−W/C),其中 C常数。


优势

NWD相较于传统IoU(交并比)的改进主要体现在:

  • 对小目标更友好:对小尺度目标的检测更稳定,避免因像素级偏差导致的IoU剧烈波动。

  • 处理不重叠框的能力:即使两个边界框完全不重叠,NWD仍能有效度量相似性,而IoU此时为0,无法提供梯度。

  • 尺度不变性:对目标尺寸变化不敏感,更适合多尺度检测任务。


应用场景

  • 小目标检测:如卫星图像、医学影像中的微小物体检测。

  • 密集场景检测:在目标重叠或遮挡严重时,NWD能更平滑地优化模型

源码分析

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_min, y_min, x_max, y_max),shape (n, 4).target (Tensor): Corresponding gt bboxes, shape (n, 4).eps (float): Eps to avoid log(0).Return:Tensor: Loss tensor."""b1_x1, b1_y1, b1_x2, b1_y2 = pred.chunk(4, -1)b2_x1, b2_y1, b2_x2, b2_y2 = target.chunk(4, -1)w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + epsw2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + epsb1_x_center, b1_y_center = b1_x1 + w1 / 2, b1_y1 + h1 / 2b2_x_center, b2_y_center = b2_x1 + w2 / 2, b2_y1 + h2 / 2center_distance = (b1_x_center - b2_x_center) ** 2 + (b1_y_center - b2_y_center) ** 2 + epswh_distance = ((w1 - w2) ** 2 + (h1 - h2) ** 2) / 4wasserstein_2 = center_distance + wh_distancereturn torch.exp(-torch.sqrt(wasserstein_2) / constant)

我们现将参数分解:

b1_x1, b1_y1, b1_x2, b1_y2 = pred.chunk(4, -1)
b2_x1, b2_y1, b2_x2, b2_y2 = target.chunk(4, -1)
  • 目的:将预测框(pred)和真实框(target)的坐标拆分成左上角(x1, y1)和右下角(x2, y2)。

  • chunk(4, -1):沿最后一个维度(即列方向)将每个框的4个坐标拆分成4个变量。例如,pred的格式是(x_min, y_min, x_max, y_max),拆分成4个张量后分别对应这四个坐标值。

再计算框的宽高:

w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + eps
w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps
  • 目的:计算预测框和真实框的宽度(w)和高度(h)。

  • + eps:为了防止宽高为0时出现数值不稳定(例如除零错误),加上一个极小值eps(默认为1e-7)。

计算中心点坐标:

b1_x_center, b1_y_center = b1_x1 + w1 / 2, b1_y1 + h1 / 2
b2_x_center, b2_y_center = b2_x1 + w2 / 2, b2_y1 + h2 / 2
  • 目的:通过左上角坐标和宽高,计算预测框和真实框的中心点坐标。

计算中心点距离:

center_distance = (b1_x_center - b2_x_center)**2 + (b1_y_center - b2_y_center)**2 + eps
  • 目的:计算两个框中心点的欧氏距离的平方。

计算宽高距离:

wh_distance = ((w1 - w2)**2 + (h1 - h2)**2) / 4
  • 目的:计算两个框宽高差异的平方,并除以4(对应高斯分布协方差矩阵的推导)。

合并得到Wasserstein距离:

wasserstein_2 = center_distance + wh_distance
  • 目的:将中心点距离和宽高距离相加,得到最终的Wasserstein距离平方。

  • 数学依据
    将边界框建模为高斯分布后,两个分布的Wasserstein距离平方可以分解为:

    其中协方差矩阵 ΣΣ 由宽高决定()。

最后归一化损失值:

return torch.exp(-torch.sqrt(wasserstein_2) / constant)
  • 目的:将Wasserstein距离转换为相似度值(取值范围0~1),作为损失函数。

  • 步骤

    1. 开平方torch.sqrt(wasserstein_2) 得到真正的Wasserstein距离 WW。

    2. 归一化:通过指数函数归一化,公式为 NWD=exp⁡(−W/C),其中 C 是归一化常数

    3. 损失值:NWD越大,表示两个框越相似,因此损失函数需要最小化 1−NWD。这里我们直接返回相似度值,实际使用时可以用 1 - NWD 作为损失。

最后

欢迎一起交流探讨 ~ 砥砺奋进,共赴山海! 

文章推荐YOLOv11小白的进击之路(二)从YOLO类-DetectionModel类出发看YOLO代码运行逻辑..._if isinstance(m, detect,afpn4head): # includes all-CSDN博客

YOLOv11小白的进击之路(七)训练输出日志解读以及训练OOM报错解决办法_yolo日志-CSDN博客 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VLN 论文精读(四)Dynamic Path Navigation for Motion Agents with LLM Reasoning

这篇笔记用来描述2025年发表在arxiv上的一篇有关VLN领域的论文&#xff0c;由港科大和达特茅斯大学联合发布&#xff0c;其核心思想有以下几点&#xff1a; 将3D环境转化为2D平面&#xff1b;2D平面中障碍物分布、机器人起点与终点信息用稀疏矩阵形式进行描述&#xff1b;与LL…

vue3之写一个aichat ----vite.config.js

vite.config.js的CSS配置 postcss-pxtorem 开发响应式网页的时候需要用到postcss-pxtorem amfe-flexible amfe-flexible是由阿里团队开发的一个库&#xff0c;它可以根据设备的屏幕宽度去动态调整HTML根元素()的字体大小&#xff0c;这意味着无论用户使用什么尺寸的设备访问你…

宝石PDF,全新 PC 版本,全部免费

宝石PDF已经运行 3 年时间&#xff0c;有客户端&#xff0c;小程序&#xff0c;一直未上 PC 版本&#xff0c;随着客户端功能升级的不及时&#xff0c;很多用户建议上 PC 版本。但是飞哥一直忙&#xff0c;这不终于给上了。 同时系统的名称也从 “PDF云转换”改为“宝石PDF”&…

.NET8使用EF Core连接SQLite

使用框架 .NET8 在nuget中&#xff0c;需要安装包&#xff1a; SQLitePCLRaw.bundle_e_sqlite3&#xff0c;版本 2.1.10 Microsoft.EntityFrameworkCore.Sqlite.Core&#xff0c;版本 9.0.0 using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microso…

HTML课后实践

实验一 【实验原理】 在搜索引擎的文本分析中&#xff0c;标题的信息权重要比正文的大&#xff0c;所以标题的样式非常重要。本实验通过把标题标记和常规文本进行对比输出&#xff0c;掌握标题标签的用法。在网页中&#xff0c;有时需要为文字设置粗体、斜体或下划线效果&#…

【紫光同创FPGA开发常用工具】FPGACPLD的下载与固化

文档内容适配技术问题说明&#xff08;非正文&#xff09;&#xff1a; 1、FPGA&CPLD如何下载位流文件&#xff1b; 2、FPGA外部flash如何固化位流文件&#xff1b; 3、PDS软件烧录界面如何新增用户flash&#xff1b; 4、CPLD内部flash如何固化位流文件&#xff1b; F…

前端传参+后端接参对照

✅ Java 后端参数接收注解 & 前端传参格式对照 后端注解前端 Content-Type前端传参方式说明RequestParamapplication/x-www-form-urlencodedURL参数 / form表单提交 / Postman form-data常用于 keyvalue 形式的参数&#xff1b;适合少量简单参数RequestParamURL拼接/api/t…

计算机网络的框架结构

计算机网络课程知识体系框架 一、计算机网络基础概念 1.1 网络组成要素 端系统&#xff08;主机、服务器&#xff09;通信链路&#xff08;有线/无线介质&#xff09;交换设备&#xff08;路由器、交换机&#xff09;协议体系&#xff08;TCP/IP协议簇&#xff09; 1.2 网络…

塔能智慧物联节能方案:点亮城市,赋能工厂

在全球积极倡导节能减排、绿色发展的时代背景下&#xff0c;塔能&#xff08;江苏&#xff09;科技有限公司凭借其创新的智慧物联节能一体化解决方案&#xff0c;在城市照明和工厂节能领域取得了显著成果。该方案不仅为城市的夜晚带来了明亮且节能的照明&#xff0c;还为工厂的…

Laravel框架下通过DB获取数据并转为数组的方法

在Laravel框架中&#xff0c;获取数据库信息并将其转换为数组是一种常见的操作&#xff0c;特别是在处理数据导出、API响应等场景中。Laravel提供了简洁而强大的数据库抽象层&#xff0c;旨在简化这类操作。接下来&#xff0c;我们将探讨几种在Laravel中通过数据库抽象层&#…

pytorch小记(九):pytorch中创建指定形状的张量: torch.empty

pytorch小记&#xff08;九&#xff09;&#xff1a;pytorch中创建指定形状的张量: torch.empty 详细解释1. 基本功能2. 语法3. 示例代码示例 1&#xff1a;创建一个 5 的未初始化张量示例 2&#xff1a;创建一个 23 的未初始化张量示例 3&#xff1a;指定数据类型和设备 4. 注…

Linux cgroup cpuset

cpuset.c 是 Linux cgroup 的 cpuset 子系统的核心实现&#xff0c;这个文件的主要作用是&#xff1a; 实现 cgroup 的 cpuset 子系统管理进程的 CPU 和内存资源访问权限提供 CPU 和内存节点的独占功能支持层级化的资源管理提供用户空间接口来配置和查看资源限制 关键数据结构…

Tailwind CSS 学习笔记(一)

一、简介 Tailwind CSS是一个工具优先的CSS 框架,只需书写HTML 代码,无需书写CSS,即可快速构建美观的网站。 二、优点 1、简洁、规整,避免了随意取类名 Tailwind CSS 的工具类(Utility classes) 能够为你提供一套约束系统,避免让你的样式表中出现随意的取值。它让颜色、…

Python自动点击器开发教程 - 支持键盘连按和鼠标连点

Python自动点击器开发教程 - 支持键盘连按和鼠标连点 这里写目录标题 Python自动点击器开发教程 - 支持键盘连按和鼠标连点项目介绍开发环境安装依赖核心代码解析1. 键盘模拟实现2. 鼠标点击实现 开发要点使用说明注意事项优化建议打包发布项目源码开发心得参考资料成品工具 项…

Cursor插件市场打不开解决

问题现象&#xff1a; cursor搜索插件的时候提示错误&#xff0c;无法搜索安装插件 error while fetching extensions.failed to fetch 问题原因 cursor默认安装使用的并不是vs code的插件市场&#xff0c;国内网络有时候打不开 解决 修改插件市场地址并重启cursor 打开cur…

【DeepSeek】本地部署DeepSeek的完整教程(Ollama+Docker+Open WebUI)

本地部署DeepSeek的完整教程 文章目录 本地部署DeepSeek的完整教程写在前面技术需求详细步骤一. 安装Ollama软件二. 安装DeepSeek-R1模型三. 安装Docker软件四. 配置Web UI界面问题解决1. 打开`docker desktop`时,一直显示`Docker Engine stopped`2. 用`Docker`拉取`Open WebU…

Java创造型模式之原型模式详解

设计模式是面向对象设计中的一种标准方法&#xff0c;用于解决常见的设计问题。原型设计模式&#xff08;Prototype Pattern&#xff09;是23种经典设计模式之一&#xff0c;属于创建型模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而不是通过构造函数或工厂…

python-leetcode 54.全排列

题目&#xff1a; 给定不含重复数字的数组nums,返回其所有可能的全排列&#xff0c;可以按任意顺序返回答案 回溯法 一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解&#xff08;或者至少不是最后一个解&#xff09;&#xff0c;回溯算法会通…

python局部变量和全局变量

文章目录 1.局部变量和全局变量2.局部变量2.1 局部变量的作用2.2 局部变量的生命周期 3. 全局变量3.1 函数不能直接修改全局变量的引用3.2 在函数内部修改全局变量的值3.3 全局变量定义的位置3.4 全局变量命名的建议 1.局部变量和全局变量 &#xff08;1&#xff09;局部变量 …

华为中小型企业项目案例

实验目的(1) 熟悉华为交换机和路由器的应用场景 (2) 掌握华为交换机和路由器的配置方法 实验拓扑实验拓扑如图所示。 华为中小型企业项目案例拓扑图 实验配置市场部和技术部的配置创建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…