手把手教你魔改YOLOv9!

news2024/11/16 7:41:00


专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!!


一、本文介绍

        本文将一步步演示如何在YOLOv9中添加 / 替换新模块,寻找模型上的创新!

适用检测目标:   YOLOv9模块改进


二、改进步骤

《YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information》

        论文地址:   https://arxiv.org/abs/2402.13616

        代码地址:   https://github.com/WongKinYiu/yolov9

 2.1 创建一个脚本存放新模块

        为方便调用,这里我将脚本放在models包下,命名为extra.py。

 2.2 将模块复制到脚本中,并导入需要的包(以SCConv为例)

        我们将SCConv的代码复制到刚刚创建的extra.py脚本中。

import torch
import torch.nn as nn
import torch.nn.functional as F

from models.common import Conv


class SCConv(nn.Module):
    """https://github.com/MCG-NKU/SCNet/blob/master/scnet.py"""
    def __init__(self, inplanes, planes, stride=1, padding=1, dilation=1, groups=1, pooling_r=4):
        super(SCConv, self).__init__()
        self.k2 = nn.Sequential(
                    nn.AvgPool2d(kernel_size=pooling_r, stride=pooling_r),
                    Conv(inplanes, planes, k=3, s=1, p=padding, d=dilation, g=groups, act=False))
        self.k3 = Conv(inplanes, planes, k=3, s=1, p=padding, d=dilation, g=groups, act=False)

        self.k4 = Conv(inplanes, planes, k=3, s=1, p=padding, d=dilation, g=groups, act=False)

    def forward(self, x):
        identity = x

        out = torch.sigmoid(torch.add(identity, F.interpolate(self.k2(x), identity.size()[2:]))) # sigmoid(identity + k2)
        out = torch.mul(self.k3(x), out)    # k3 * sigmoid(identity + k2)
        out = self.k4(out)  # k4

        return out

2.3 对yolo.py操作

        打开models包下的yolo.py文件夹,将刚才创建的脚本导入。并在下方第700行的位置(位置可能因v9版本更新变动)加入下方代码。

2.4 运行配置文件

        创建模型配置文件(yaml文件),将我们所作改进加入到配置文件中(这一步的配置文件可以复制models  - > detect 下的yaml修改。)。对YOLO系列yaml文件不熟悉的同学可以看我往期的yaml详解教学!

YOLO系列 “.yaml“文件解读-CSDN博客

# YOLOv9

# parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
#activation: nn.LeakyReLU(0.1)
#activation: nn.ReLU()

# anchors
anchors: 3

# YOLOv9 backbone
backbone:
  [
   [-1, 1, Silence, []],  
   
   # conv down
   [-1, 1, Conv, [64, 3, 2]],  # 1-P1/2

   # conv down
   [-1, 1, Conv, [128, 3, 2]],  # 2-P2/4

   # elan-1 block
   [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 3

   # avg-conv down
   [-1, 1, ADown, [256]],  # 4-P3/8

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 5

   # avg-conv down
   [-1, 1, ADown, [512]],  # 6-P4/16

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 7

   # avg-conv down
   [-1, 1, ADown, [512]],  # 8-P5/32

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 9
  ]

# YOLOv9 head
head:
  [
   # elan-spp block
   [-1, 1, SPPELAN, [512, 256]],  # 10

   # up-concat merge
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 7], 1, Concat, [1]],  # cat backbone P4

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 13

   # up-concat merge
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 5], 1, Concat, [1]],  # cat backbone P3

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]],  # 16 (P3/8-small)

   # avg-conv-down merge
   [-1, 1, ADown, [256]],
   [[-1, 13], 1, Concat, [1]],  # cat head P4

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 19 (P4/16-medium)

   # avg-conv-down merge
   [-1, 1, ADown, [512]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 22 (P5/32-large)
   
   
   # multi-level reversible auxiliary branch
   
   # routing
   [5, 1, CBLinear, [[256]]], # 23
   [7, 1, CBLinear, [[256, 512]]], # 24
   [9, 1, CBLinear, [[256, 512, 512]]], # 25
   
   # conv down
   [0, 1, Conv, [64, 3, 2]],  # 26-P1/2

   # conv down
   [-1, 1, Conv, [128, 3, 2]],  # 27-P2/4

   # elan-1 block
   [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 28

   # avg-conv down fuse
   [-1, 1, ADown, [256]],  # 29-P3/8
   [[23, 24, 25, -1], 1, CBFuse, [[0, 0, 0]]], # 30  

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 31

   # avg-conv down fuse
   [-1, 1, ADown, [512]],  # 32-P4/16
   [[24, 25, -1], 1, CBFuse, [[1, 1]]], # 33 

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 34

   # avg-conv down fuse
   [-1, 1, ADown, [512]],  # 35-P5/32
   [[25, -1], 1, CBFuse, [[2]]], # 36

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 37
   [-1, 1, SCConv, []],  # 38

   
   
   # detection head

   # detect
   [[31, 34, 38, 16, 19, 22], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)
  ]

3.4 训练过程

        最后,复制我们创建的模型配置,填入训练脚本(train_dual)中(不会训练的同学可以参考我之前的文章。),运行即可。

YOLOv9 最简训练教学!-CSDN博客


如果觉得本文章有用的话给博主点个关注吧!


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

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

相关文章

供水管网水力模型的建立与应用

阐述管网水力模型构建流程,建立供水管网水力模型。通过数据录入生成管网基本拓扑结构及物理信息,在模型简化之后利用监测数据进行模型校核,保障管网模型满足精度要求。利用管网模型进行管网工况分析,掌握管网内压力分布与管道流速分布状态,提出管网运行薄弱环节。 给…

Docker容器(3)单容器管理

一、单容器 1.1概念简介 Docker三个重要概念: 仓库(Repository); 镜像(Image); 容器(Container). *Docker的三个重要概念是仓库(Repository)、镜像(Image)和容器(Container)**。具体如下: **镜像(Image)**:Docker镜像是创建容器的基础,它类似…

ToDesk - macOS 上轻便好用的远程控制

文章目录 官网 https://www.todesk.com个人版(免费)下载地址: https://www.todesk.com/download.html 支持系统类型 Windows、macOS、Android、iOS、Linux 应用大小为 320MB 左右 使用界面

具身智能计算系统,机器人时代的 Android | 新程序员

【导读】具身智能作为一种新兴的研究视角和方法论,正在刷新我们对智能本质及其发展的理解:传统的 AI 模型往往将智能视为一种独立于实体存在的抽象能力,而具身智能则主张智能是实体与其环境持续互动的结果。 本文深度剖析了具身智能计算系统…

Python进阶学习:Pandas--DataFrame--如何把几列数据合并成新的一列

Python进阶学习:Pandas–DataFrame–如何把几列数据合并成新的一列 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1…

回溯是怎么回事(算法村第十八关青铜挑战)

组合 77. 组合 - 力扣(LeetCode) 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],…

SpringCloud Alibaba(保姆级入门及操作)

第一章 微服务概念 1.0 科普一些术语 科普一下项目开发过程中常出现的术语,方便后续内容的理解。 **服务器:**分软件与硬件,软件:类型tomcat这种跑项目的程序, 硬件:用来部署项目的电脑(一般性能比个人电脑好) **服务:**操作系统上术语:一个程序,开发中术语:一个…

基于PyTorch深度学习实战入门系列-(1)环境配置

Pytorch环境安装配置2024最新版 下载安装Anaconda Anaconda下载网址:Free Download | Anaconda 创建虚拟环境 打开Anaconda Prompt # conda create -n 环境名 [需要的库] # 例子: conda create -n pytorchpy39 python3.9安装过程中需要确认输入 y 回车…

如何使用Potplayer远程访问本地群晖NAS搭建的WebDAV中的本地资源

文章目录 本教程解决的问题是:按照本教程方法操作后,达到的效果是:1 使用环境要求:2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透,映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…

mysql数据库学习笔记2——linux系统下安装,对库,表的基本操作语句

关于在linux系统下安装可以查看linux 安装mysql服务(超详细)_cannot write to-CSDN博客相关教程 对库的一些操作有 show databases查看有哪些数据库,create database “新建数据库名称” 创建新的数据库,use “数据库名称”切换…

透明加密软件的三种技术点介绍

常见的透明加密软件一般以透明加密技术为核心技术。透明加密主要有两种技术支撑,一种是核心层(也称为驱动层)的透明加密技术,另一种是应用层的透明加密技术。由于应用层存在着适应性和稳定性差等缺陷,与驱动层相比在安…

轻松爬取跨境电商商品数据集|电商跨境电商必备技术电商商品数据采集|数据采集API接口

跨境电商商品数据采集爬取方案 在之前写过一篇关于网页爬取的文章,使用的是亮数据这个工具,并且带领大家进行了注册,介绍了一些相关的功能。现在我们来探索一下如何爬取某大型电商商品数据集 很多电商科技企业,致力于通过各种高…

Windows环境下的调试器探究——硬件断点

与软件断点与内存断点不同,硬件断点不依赖被调试程序,而是依赖于CPU中的调试寄存器。 调试寄存器有7个,分别为Dr0~Dr7。 用户最多能够设置4个硬件断点,这是由于只有Dr0~Dr3用于存储线性地址。 其中,Dr4和Dr5是保留的…

【C++从0到王者】第四十七站:最小生成树

文章目录 一、最小生成树的概念1.概念2.最小生成树的构造方法 二、Kruskal算法1.算法思想2.代码实现 三、Prim算法1.算法思想2.代码实现3.试试所有节点为起始点 一、最小生成树的概念 1.概念 连通图:在无向图中,若从顶点v1到顶点v2有路径,则…

改进YOLO系列 | YOLOv5/v7 引入通用高效层聚合网络 GELAN | YOLOv9 新模块

今天的深度学习方法专注于如何设计最合适的目标函数,以使模型的预测结果最接近真实情况。同时,必须设计一个合适的架构,以便为预测提供足够的信息。现有方法忽视了一个事实,即当输入数据经过逐层特征提取和空间转换时,会丢失大量信息。本文将深入探讨数据通过深度网络传输…

性能测试-反编译jar

方法一,使用jd-gui 1、官网下载:Java Decompiler 2、下载mac版本后,解压,如下所示: 双击 JD_GUI,提示错误,如下所示: 已经安装了java 17,是java 1.8以上版本&#xff0…

十二、Qt自定义Widget组件、静态库与动态库

一、自定义Widget组件 1、自定义Widget组件 使用步骤采用提升法(promotion)重新定义paintEvent事件 2、实现程序 (1)创建项目,基于QWidget (2)添加类,为Widget组件提升类 #inclu…

通过jenkins进行部署java程序到centos上

1.通过jumpserver访问到centos上,准备下java环境 // step1: 先编辑下 vim /etc/profile// step2: 编写好环境变量 JAVA_HOME/usr/local/java export JAVA_HOME export ZOOKEEPER_HOME/opt/zookeeper/apache-zookeeper-3.7.0-bin PATH$PATH:$JAVA_HOME/bin:$ZOOKEEP…

WordPress通过宝塔面板的入门安装教程【保姆级】

WordPress安装教程【保姆级】【宝塔面板】 前言一:安装环境二:提前准备三:域名解析四:开始安装五:安装成功 前言 此教程适合新手,即使不懂代码,也可轻松安装wordpress 一:安装环…

Maven面试题

以下是一些关于Maven的经典面试题以及它们的答案: 1、什么是Maven? Maven是一个项目管理工具,用于构建、管理、发布Java项目。 2、为什么要使用Maven而不是手动管理项目依赖? Maven提供了依赖管理、统一的构建、打包、文档生…