YOLOv9改进策略 | Conv篇 | 利用 Haar 小波的下采样HWD替换传统下采样(改变YOLO传统的Conv下采样)

一、本文介绍

本文给大家带来的改进机制是Haar 小波的下采样HWD替换传统下采样(改变YOLO传统的Conv下采样)在小波变换中,Haar小波作为一种基本的小波函数,用于将图像数据分解为多个层次的近似和细节信息,这是一种多分辨率的分析方法。我将其用在YOLOv9上其明显降低参数和GFLOPs在V9上使用该机制后参数量为530W计算量GFLOPs为240(均有大幅度下降),欢迎大家订阅本专栏,本专栏每周更新3-5篇最新机制,更有包含我所有改进的文件和交流群提供给大家。

  欢迎大家订阅我的专栏一起学习YOLO!  

专栏地址:YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏 

目录

一、本文介绍

二、原理介绍

三、核心代码 

四、手把手教你添加HWD机制

 4.1 修改一

4.2 修改二 

4.3 修改三 

4.4 修改四 

五、HWD的yaml文件和运行记录

5.1 HWD的yaml文件

5.2 HWD的训练过程截图 

五、本文总结


二、原理介绍

官方论文地址:官方论文地址点击此处即可跳转(论文需要花钱此论文)

官方代码地址:官方代码地址点击此处即可跳转


论文介绍了一种基于Haar小波变换的图像压缩方法及其压缩图像质量的评估方法。下面是对论文内容的详细分析:

主要内容和方法

1. Haar小波变换的介绍:

  •    Haar小波是最简单的小波形式之一,具有易于计算和实现的优点。
  •    文章中应用了二维离散小波变换(2D DWT),将图像信息矩阵分解为细节矩阵和信息矩阵。
  •    重构图像使用这些矩阵和小波变换的信息完成。

2. 图像压缩技术:

  •    压缩技术通过使用Haar小波作为基函数,减少图像文件大小,同时尽可能保持图像质量。
  •    压缩过程包括将图像信息转换为更易于编码的格式,这通常涉及转换、量化和熵编码。

结论:论文证明了Haar小波变换是一种有效的图像压缩工具,尤其适合需要高压缩比而又不希望图像质量下降太多的应用场景。此外,通过对比传统的DCT和最新的小波变换方法,作者指出Haar小波在处理图像边缘和细节方面具有一定的优势,尤其是在压缩高分辨率图像时。

 


三、核心代码 

本节的代码使用方式看章节四!

PS:# 按照这个第三方库需要安装pip install pytorch_wavelets==1.3.0
                                            # 如果提示缺少pywt库则安装 pip install 

import torch
import torch.nn as nn
try:
    from pytorch_wavelets import DWTForward # 按照这个第三方库需要安装pip install pytorch_wavelets==1.3.0
                                            # 如果提示缺少pywt库则安装 pip install PyWavelets
except:
    pass

class Down_wt(nn.Module):
    def __init__(self, in_ch, out_ch):
        super(Down_wt, self).__init__()
        self.wt = DWTForward(J=1, mode='zero', wave='haar')
        self.conv_bn_relu = nn.Sequential(
                                    nn.Conv2d(in_ch*4, out_ch, kernel_size=1, stride=1),
                                    nn.BatchNorm2d(out_ch),
                                    nn.ReLU(inplace=True),
                                    )
    def forward(self, x):
        yL, yH = self.wt(x)
        y_HL = yH[0][:,:,0,::]
        y_LH = yH[0][:,:,1,::]
        y_HH = yH[0][:,:,2,::]
        x = torch.cat([yL, y_HL, y_LH, y_HH], dim=1)
        x = self.conv_bn_relu(x)
        return x

if __name__ == "__main__":
    # Generating Sample image
    image_size = (1, 64, 224, 224)
    image = torch.rand(*image_size)

    # Model
    model = Down_wt(64, 32)

    out = model(image)
    print(out.size())


四、手把手教你添加HWD机制

 4.1 修改一

第一还是建立文件,我们找到如下yolov9-main/models文件夹下建立一个目录名字呢就是'modules'文件夹(用群内的文件的话已经有了无需新建)!然后在其内部建立一个新的py文件将核心代码复制粘贴进去即可。

 


4.2 修改二 

第二步我们在该目录下创建一个新的py文件名字为'__init__.py'(用群内的文件的话已经有了无需新建),然后在其内部导入我们的检测头如下图所示。


4.3 修改三 

然后我们找到如下文件''models/yolo.py''在开头的地方导入我们的模块按照如下修改->

(如果你看了我多个改进机制此处只需要添加一个即可,无需重复添加)

注意的添加位置要放在common的导入上面!!!!!

​​​​


4.4 修改四 

按照我的添加在parse_model里添加即可。

到此就修改完成了,大家可以复制下面的yaml文件运行。


五、HWD的yaml文件和运行记录

5.1 HWD的yaml文件

主干和Neck全部用上该卷积轻量化到机制的yaml文件。

# YOLOv9

# parameters
nc: 80  # number of classes
depth_multiple: 1  # model depth multiple
width_multiple: 1  # 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, Down_wt, [128]],  # 2-P2/4
   # elan-1 block
   [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 3
   # conv down
   [-1, 1, Down_wt, [256]],  # 4-P3/8
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 5
   # conv down
   [-1, 1, Down_wt, [512]],  # 6-P4/16
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 7
   # conv down
   [-1, 1, Down_wt, [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)

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

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

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

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 22 (P5/32-large)
   
   # 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, Down_wt, [128]],  # 27-P2/4

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

   # conv down fuse
   [-1, 1, Down_wt, [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

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

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

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

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

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


5.2 HWD的训练过程截图 


五、本文总结

到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv9改进有效涨点专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

专栏地址:YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏 

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

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

相关文章

什么是自动化测试?如何做自动化测试?

前面介绍了功能测试和接口测试,在介绍接口测试时提到了实现API自动化。那具体什么是自动化,为什么要做自动化,这里我们集中总结。 一. 什么是自动化? 顾名思义,自动化测试是相对人工测试而言的,它是指把人…

以太网帧格式解析

以太网的正式标准是IEEE802.3,它规定了以太网传输的帧结构。 以太网帧格式如下图所示: 以太网传输数据时,是按照上图的格式,自左到右依次传输的。需要注意的是前导码和SFD不属于以太网协议的内容,应该是属于物理层数据…

AI检索增强生成引擎-RAGFlow-深度理解知识文档,提取真知灼见

💡 RAGFlow 是什么? RAGFlow是一款基于深度文档理解构建的开源RAG(Retrieval-Augmented Generation)引擎。RAGFlow个人可以为各种规模的企业及提供一套专业的RAG工作流程,结合针对用户群体的大语言模型(LL…

我独自升级崛起怎么下载 一文分享我独自升级崛起游戏下载教程

我独自升级崛起怎么下载 一文分享我独自升级崛起游戏下载教程 我独自升级:崛起是一款由韩国漫画改编而成的热门多人网络在线联机游戏,这款游戏是一款的角色扮演类型游戏,游戏有着独一无二的剧情模式。小伙伴们在游戏中可以体验到独特的成长系…

Meta提出全新文档级嵌入框架,利用LLM来增强信息检索能力

近年来,基于嵌入式检索(embedding-based search)或密集检索(dense retrieval)相比传统的稀疏检索(sparse retrieval)或基于词袋(bag of words)的方法,已经展示…

王道C语言督学营OJ课后习题(课时20)

#include<stdio.h> int main() {printf("%3d%3d",0,13);return 0; }

图深度学习——2.图的理论知识

1.图 1.1 图的定义 图是由节点&#xff08;顶点&#xff09;和边构成的数学结构。图用于表示对象之间的关系&#xff0c;其中节点表示对象&#xff0c;边表示对象之间的关系。 一个图&#xff0c;记为 G <V, E> &#xff0c;它包括以下两个要素&#xff1a; 1.节点&am…

函数的内容

一&#xff0c;概念 封装一份可以被重复执行的代码块&#xff0c;让大量代码重复使用 二&#xff0c;函数使用 大体分两步&#xff1a;声明函数&#xff0c;调用函数 声明函数有关键字&#xff1a;function 函数名&#xff08;&#xff09;{ 函数体 } 为基本格式&#xf…

linux系统安全与应用【下】

目录 1.开关机安全控制 1.1GRUB限制 2.终端登录安全控制 2.1 限制root只在安全终端登录 2.2 禁止普通用户登录 3.弱口令检测 3.1 Joth the Ripper&#xff08;JR&#xff09; 4.网络端口扫描 4.1 nmap命令 1.开关机安全控制 1.1GRUB限制 通常情况下在系统开机进入GRU…

哈希表实现[很详细!]

目录 哈希表 定义节点类 根据hash码获取value 向hash表存入新key value,如果key重复,则更新value 根据hash码删除,返回删除的value 关于resize()一些问题的解答 冲突测试 MurmurHash 设计思考 练习 Leetcode01 Leetcode03 Leetcode49 Leetcode217 Leetcode136 L…

人工智能大模型培训老师叶梓 探索知识库问答中的查询图生成:处理多跳复杂问题的新方法

在人工智能领域&#xff0c;基于知识库的问答&#xff08;KBQA&#xff09;技术正变得越来越重要。它使得机器能够理解自然语言问题&#xff0c;并从结构化的知识库中检索答案。然而&#xff0c;面对多跳复杂问题&#xff0c;传统的KBQA方法往往力不从心。近期&#xff0c;研究…

账号安全基本措施1

一、系统账号清理 1.1 将用户设置为无法登录 useradd -s /sbin/nologin lisi shell类型设置为/sbin/nologin用户将无法使用bash或其他shell来登录系统。 1.2 锁定用户。passwd -l 用户名 正常情况下是可以送普通用户切换到其他普通用户的 当锁定密码后passwd -l lisi就用普…

第22天:安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用

第二十二天 一、PHP留言板前后端功能实现 开发环境&#xff1a; DW PHPStorm PhpStudy Navicat Premium DW : HTML&JS&CSS开发 PHPStorm : 专业PHP开发IDE PhpStudy &#xff1a;Apache MYSQL环境 Navicat Premium: 全能数据库管理工具 二、数据库创建&架…

【解决】echarts条形图纵坐标显示不全

先说结论&#xff1a; option:{...grid: {containLabel: true},... }这个属性是控制整体的坐标标签的。加上这个就可以显示完整了。然后再根据其他属性调整标签的字体、颜色之类的 yAxis : [{...axisLabel:{width:100,overflow:break,truncate:...,color:red,fontSize:10,},..…

JavaScript进阶部分知识总结

作用域 局部作用域 作用域规定了变量能够被访问的范围&#xff0c;离开了这个范围变量就不能被访问作用域分为&#xff1a;局部作用域和全局作用域 局部作用域分为函数作用域和块作用域 1.函数作用域&#xff1a; 在函数内部声明的变量只能在函数内部被访问&#xff0c;外…

AWD线下攻防万字最完整战术(记第一届“长城杯”半决赛战术)

目录 准备阶段 1.登录比赛平台&#xff08;获取资产&#xff09; 查看账号账号修改 服务器SSH口令mysqlWEB服务口令(后台密码)数据库后台管理员密码 账号用户检查 2.dump源码&#xff08;方便应急响应恢复靶机&#xff09; 网站源码备份 压缩文件解压文件备份到服务器本地上传…

这10款VS Code神仙插件,嵌入式程序员必备

大家好&#xff0c;我是知微&#xff01; 嵌入式软件开发工程师平时可能更多的是使用Source Insight、Keil、IAR来阅读代码&#xff0c;写代码。 VSCode大家都听说过&#xff0c;功能十分强大&#xff0c;而且免费&#xff01; 或许是因为这款软件上手有一定的学习成本&…

css:echarts渐变色转换为css渐变色

通过一个下拉框来选择渐变类型&#xff0c;为了简化&#xff0c;我设置了三种&#xff1a;水平方向的渐变、垂直方向的渐变和径向渐变用&#xff0c;表格来配置echarts渐变色的百分比位置和颜色。 config是表格里的数据格式如下&#xff1a; offset是百分比位置&#xff0c;co…

C语言项目实践——贪吃蛇

引言&#xff1a;本篇博客中&#xff0c;我将会使用结构体&#xff0c;链表&#xff0c;WIN32 API等一系列知识完成C语言项目——贪吃蛇的实现。在观看此篇博客之前&#xff0c;请将这些知识所熟悉&#xff0c;不然可能会造成理解困难。 更多有关C语言的知识详解可前往个人主页…

[C++][算法基础]求组合数(IV)

输入 &#x1d44e;,&#x1d44f;&#xff0c;求 的值。 注意结果可能很大&#xff0c;需要使用高精度计算。 输入格式 共一行&#xff0c;包含两个整数 &#x1d44e; 和 &#x1d44f;。 输出格式 共一行&#xff0c;输出 的值。 数据范围 1≤b≤a≤5000 输入样例…