YOLOv9改进 ,YOLOv9改进损失函数采用SlideLoss来处理样本不平衡问题


在这里插入图片描述


摘要

作者提出了一种基于 YOLOv5 改进的实时人脸检测模型,称为YOLO-FaceV2。设计了一个感受野增强模块(RFE)来提升小尺度人脸的感受野,并引入了 NWD 损失,以弥补 IoU 在小目标位置偏差上的敏感性。针对人脸遮挡问题,提出了 SEAM 注意力模块,并引入了排斥损失进行优化。此外,作者使用 Slide 加权函数来解决易样本和难样本的不平衡问题,并基于有效感受野信息来设计锚框。为了解决样本不平衡问题,因此本文采用 SlideLoss 损失函数。


理论介绍

Slide Loss的核心在于处理样本不平衡问题,对检测中的难易样本进行加权。其主要目的是在训练过程中,将更多的关注放在难样本上,让模型对这些样本的学习更为深入,而不过度关注简单样本。
Slide Loss 的设计灵感来源于样本的 IoU 值。它通过设置一个 IoU 的平均值阈值(记为µ),将样本分为易样本和难样本:

  • 易样本:IoU 值高于 µ 的样本。
  • 难样本:IoU 值低于 µ 的样本。

Slide Loss 的权重设计像“滑梯”形状,对接近阈值 µ 的样本赋予较高权重。其具体操作是:

  • 赋予低于阈值的难样本较高的权重,使模型在训练时对这些样本更为关注。
  • 逐渐降低对易样本的权重,减少其在梯度更新中的影响。

理论详解可以参考链接:论文地址
代码可在这个链接找到:代码地址

下文都是手把手教程,跟着操作即可添加成功


目录

  • 摘要
  • 理论介绍
  • 🎓一、YOLOv9原始版本代码下载
    • 🍀🍀1.YOLOv9模型结构图
    • 🍀🍀2.环境配置
  • 🎓二、SlideLoss代码
    • 🍀🍀1.代码如下:
  • 🎓三、添加方法
  • 🎓四、yaml 文件修改
  • 🎓五、训练文件修改
  • 总结


🎓一、YOLOv9原始版本代码下载

官网的源码下载地址 :YOLOv9官网代码

官网打不开的话,从我的网盘下载就行,网盘下载地址: YOLOv9原始版本源码下载,提取码: eajp

注意注意注意:如果在我之前的文章下载过YOLOv9源码,不用重新下载了,没有特殊说明都是用同一个版本的源码

🍀🍀1.YOLOv9模型结构图

根据 yolov9.yaml 画出 yolo 整体结构图,如下图所示
在这里插入图片描述

🍀🍀2.环境配置

环境配置参考教程链接:链接: 环境配置链接,如果已经配置好环境可以忽略此步骤


🎓二、SlideLoss代码

🍀🍀1.代码如下:

import math
class SlideLoss(nn.Module):def __init__(self, loss_fcn):super(SlideLoss, self).__init__()self.loss_fcn = loss_fcnself.reduction = loss_fcn.reductionself.loss_fcn.reduction = 'none'  # required to apply SL to each elementdef forward(self, pred, true, auto_iou=0.5):loss = self.loss_fcn(pred, true)if auto_iou < 0.2:auto_iou = 0.2b1 = true <= auto_iou - 0.1a1 = 1.0b2 = (true > (auto_iou - 0.1)) & (true < auto_iou)a2 = math.exp(1.0 - auto_iou)b3 = true >= auto_ioua3 = torch.exp(-(true - 1.0))modulating_weight = a1 * b1 + a2 * b2 + a3 * b3loss *= modulating_weightif self.reduction == 'mean':return loss.mean()elif self.reduction == 'sum':return loss.sum()else:  # 'none'return loss

🎓三、添加方法

之后将第二章的代码添加到 utils/loss_tal_dual.py 文件里面,如下截图:
在这里插入图片描述

在该文件 找到 ComputeLoss 类,按照下面修改即可:
原始代码是:

        BCEcls = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h["cls_pw"]], device=device), reduction='none')

需要创建 SlideLoss 实例更改传入的损失函数,修改后的代码:

        BCEcls = SlideLoss(nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h["cls_pw"]], device=device), reduction='none'))

在这里插入图片描述


🎓四、yaml 文件修改

大家也尝试可以在 head 部分继续添加注意机制、改进的卷积等,改法都是换汤不换药


🎓五、训练文件修改

在项目里找到 train_dual.py 文件。

  1. 在 ’–weights’ 参数的 defaut 处设置为空。
  2. 在 ’–cfg’ 参数的 defaut 处设置填改进的模型配置文件路径。
  3. 在’–data’ 参数的 default 处设置为数据集配置文件路径。
  4. ‘–hyp’ 参数可以默认。
  5. ’–epochs’ 中的参数设置为 100 ,表示需经过 100 轮训练。
  6. '–batch-size’ 表示一次训练所抓取的数据样本数量,其大小影响训练速度和模型优化,此处将其参数设置为 4 ,根据自己电脑性能设置大一些也是可以的。

前面六个参数是常用参数,需要注意的是 ’–weights’ 参数可以留空,就是不需要权重,从头训练。
注意注意注意:一般做科研改进工作时候可以不用预训练权重
在这里插入图片描述


总结

把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!

在这里插入图片描述

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

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

相关文章

设计模式——策略模式(c++)

策略模式&#xff08;Strategy Pattern&#xff09;在 C 中的实现 1. 策略模式定义 策略模式定义了一系列算法&#xff08;策略类&#xff09;&#xff0c;将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;达到灵活使用不同策略的目的。在策略模式中&#xff0…

strcpy放字符串,strcat接着放字符串

#include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_ARGS 10 #define USAGE_LEN 256int main(int argc, char *argv[]) {char usage[USAGE_LEN];char *args[MAX_ARGS];int i, arg_count 0;// 构建使用说明字符串strcpy(usage, "U…

uni-app中使用 unicloud 云开发平台③

文章目录 六、hbuilderX 中使用 unicloud 云开发平台文档传统业务开发流程什么是 unicloudunicloud 优点开发流程uncloud 构成云数据库云存储及 CDN创建云函数工程七、unicloud api 操作云函数调用云函数实现云数据库基本增删改查1. 获取数据库引用云存储操作六、hbuilderX 中使…

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数&#xff08;Loss Functions&#xff09;计算网络误差 引言1. 分类交叉熵损失&#xff08;Categorical Cross-Entropy Loss&#xff09;2. 分类交叉熵损失类&#xff08;The Categorical Cross-Entropy Loss Class&#xff09;展示到目前为止的所有代码3. 准确率计算…

rust并发

文章目录 Rust对多线程的支持std::thread::spawn创建线程线程与 move 闭包 使用消息传递在线程间传送数据std::sync::mpsc::channel()for received in rx接收两个producer 共享状态并发std::sync::Mutex在多个线程间共享Mutex&#xff0c;使用std::sync::Arc 参考 Rust对多线程…

PDF24:多功能 PDF 工具使用指南

PDF24&#xff1a;多功能 PDF 工具使用指南 在日常工作和学习中&#xff0c;PDF 是一种常见且重要的文档格式。无论是查看、编辑、合并&#xff0c;还是转换 PDF 文件&#xff0c;能够快速高效地处理 PDF 文档对于提高工作效率至关重要。PDF24 是一款免费、功能全面的 PDF 工具…

CentOS 安装 Python 3.11.9完整流程

在 CentOS 上安装 Python 3.11.9 并替换系统中的默认 Python 版本&#xff0c;可以按照以下步骤来进行。请注意&#xff0c;替换默认 Python 版本可能会影响系统的其他工具和依赖&#xff0c;因此请谨慎操作。 步骤 1&#xff1a;安装依赖 首先&#xff0c;确保系统安装了编译…

java数据结构与算法:栈

栈 1、栈的基本概念2、Java模拟简单的顺序栈实现3、增强功能版栈4、利用栈实现字符串逆序5、利用栈判断分隔符是否匹配6、总结 1、栈的基本概念 **栈&#xff08;英语&#xff1a;stack&#xff09;**又称为堆栈或堆叠&#xff0c;栈作为一种数据结构&#xff0c;是一种只能在…

【Conda】Windows下conda的安装并在终端运行

下载 在官网下载 https://www.anaconda.com/download/success 安装 双击 一直下一步安装 配置环境变量 为了在终端运行&#xff0c;需配置环境变量 进入到安装conda的目录并复制路径 设置高级环境变量 在终端运行 输入&#xff1a; conda list表明可以正常运行 参考…

游戏引擎学习第七天

视频参考:https://www.bilibili.com/video/BV1QFmhYcE69 ERROR_DEVICE_NOT_CONNECTED 是一个错误代码&#xff0c;通常在调用 XInputGetState 或 XInputSetState 函数时返回&#xff0c;表示指定的设备未连接。通常会出现以下几种情况&#xff1a; 未连接控制器&#xff1a;如…

用 Collections.synchronizedSet 创建线程安全的 HashSet

在 Java 中&#xff0c;HashSet 本身并不是线程安全的。如果在多线程环境下使用 HashSet&#xff0c;你需要采取额外的同步措施来保证线程安全。Collections 工具类提供了一种简便的方法来创建线程安全的集合——synchronizedSet 方法。这种方法通过在所有公共方法上添加同步块…

【网络安全渗透测试零基础入门】之SNMP放大攻击原理及实战演示,零基础入门到精通,收藏这一篇就够了!

前言 这是小强给粉丝盆友们整理的网络安全渗透测试入门阶段dos与ddos渗透与防御教程。 喜欢的朋友们&#xff0c;记得给我点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。 SNMP&#xff08;Simple Network Management Protocol &#xff09;&#xff1a;简单…

el-dialog 设置 水平垂直居中 高度不固定

小记一下&#xff1a; 希望实现不管内容高度多少 el-dialog都能水平垂直居中 效果&#xff1a; css: .form-view-dialog{display: flex;align-items: center;justify-content: center;.el-dialog{margin: 0 auto; }.el-dialog__body{max-height: 75vh; // 可选择 设置一个最…

后端接口返回二进制文件,前端 window.opent预览展示

详细步骤 1.修改 PreviewApi 函数&#xff1a; 设置 responseType 为 ‘arraybuffer’&#xff0c;以接收二进制数据。 export const PreviewApi (data) > request({method: post,url: /dev-api/preview,responseType: arraybuffer,data });3.处理响应&#xff1a; 使用…

EMC Plus:外壳中的 PCB 演示

EMC Plus 提供了计算任何导入的近场源文件的字段统计信息的高级功能。在本演示中&#xff0c;我将指导您完成分析辐射电场的分步工作流程&#xff0c;特别是由 EMC Plus 中从 SIwave 导入的近场源产生的辐射电场。让我们开始吧&#xff01; 概述 以下模型是计算机机箱&#x…

【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载

软件介绍 下载iOS旧版应用&#xff0c;简化繁琐的抓包流程。 一键生成去更新IPA&#xff08;手机安装后&#xff0c;去除App Store的更新检测&#xff09;。 软件界面 支持系统 Windows 10/Windows 8/Windows 7&#xff08;由于使用了Fiddler库&#xff0c;因此需要.Net环境…

SQLite Where 子句

SQLite Where 子句 SQLite 是一种轻量级的数据库管理系统&#xff0c;广泛应用于移动设备和嵌入式系统。它支持标准的 SQL 语法&#xff0c;包括 SELECT, INSERT, UPDATE, DELETE 等命令。在执行这些命令时&#xff0c;WHERE 子句用于指定过滤条件&#xff0c;从而精确地控制操…

SpringBoot沙箱环境支付宝支付

1、创建应用 登录支付宝开放平台 支付宝开放平台网址 &#xff1a;支付宝 (alipay.com) 支付宝开放平台 下拉最下边 2、获取appId、支付宝公钥、应用私钥 3、开始创建spring boot项目 #支付宝支付配置 alipay:#你的APPIDappId: 902************#你的应用私钥privateKey: MIIE…

Ceph 中Crush 算法的理解

Crush&#xff08;Controlled Replication Under Scalable Hashing&#xff09;算法是一种可扩展的、分布式的副本数据放置算法&#xff0c;广泛用于存储系统中&#xff0c;特别是Ceph分布式存储系统中。以下是对CRUSH算法的详细解释&#xff1a; 一、算法原理 CRUSH算法根据…

计算机图形学 实验二 三维模型读取与控制

目录 一、实验内容 二、具体内容 (在实验2.3的基础上进行修改) 1、OFF格式三维模型文件的读取 2、三维模型的旋转动画 3、键盘鼠标的交互 4、模型的修改 三、代码 一、实验内容 读取实验提供的off格式三维模型&#xff0c;并对其赋色。利用鼠标和键盘的交互&#xff0…