当前位置: 首页 > news >正文

YOLOv10改进系列 ---- Conv篇 ---- 2024利用 Haar 小波的下采样HWD替换传统下采样

目录

一、本文介绍

二、原理介绍

 三、核心代码

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

4.1 修改一

4.2 修改二

4.3 修改三

4.4 修改四

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

5.1 HWD的yaml文件1

5.2 训练代码

5.3 HWD的训练过程截图

六、本文总结


一、本文介绍

本文给大家带来的改进机制是 Haar 小波的下采样HWD替换传统下采样 (改变YOLO传统的Conv 下采样 )在小波变换中,Haar小波作为一种基本的小波函数,用于将图像数据分解为多个层次的近似和细节信息,这是一种多分辨率的分析方法。我将其用在YOLOv11上其明显降低参数和GFLOPs在 V11n 上使用该机制后参数量为 220W计算量GFLOPs为5.5(轻量化效果十分明显)。

系列专栏 :

YOLOv10改进(更换卷积、添加注意力、更换主干网络、图像去噪、去雾、增强等)涨点系列------发论文必备​​​https://blog.csdn.net/m0_58941767/category_12881481.html


 二、原理介绍

官方论文地址: 官方论文地址点击此处即可跳转(论文需要花钱此论文)https://www.sciencedirect.com/science/article/abs/pii/S0031320323005174

官方代码地址: 官方代码地址点击此处即可跳转https://github.com/apple1986/HWD/blob/main/HWD.py

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

主要内容和方法

1. Haar小波变换的介绍:

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

2. 图像压缩技术:

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

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


 三、核心代码

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

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 修改一

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


4.2 修改二

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


4.3 修改三

第三步我门中到如下文件'ultralytics/nn/tasks.py'进行导入和注册我们的模块。


4.4 修改四

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


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

PS:注意本文的改进机制需要关闭AMP运行否则会报精度错误!

5.1 HWD的yaml文件1

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
 
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
  s: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
  m: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
  l: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
  x: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs
 
# YOLO11n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Down_wt, [128]] # 1-P2/4
  - [-1, 2, C3k2, [256, False, 0.25]]
  - [-1, 1, Down_wt, [256]] # 3-P3/8
  - [-1, 2, C3k2, [512, False, 0.25]]
  - [-1, 1, Down_wt, [512]] # 5-P4/16
  - [-1, 2, C3k2, [512, True]]
  - [-1, 1, Down_wt, [1024]] # 7-P5/32
  - [-1, 2, C3k2, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 2, C2PSA, [1024]] # 10
 
# YOLO11n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 2, C3k2, [512, False]] # 13
 
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)
 
  - [-1, 1, Down_wt, [256]]
  - [[-1, 13], 1, Concat, [1]] # cat head P4
  - [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)
 
  - [-1, 1, Down_wt, [512]]
  - [[-1, 10], 1, Concat, [1]] # cat head P5
  - [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)
 
  - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)

5.2 训练代码

大家可以创建一个py文件将我给的代码复制粘贴进去,配置好自己的文件路径即可运行。

PS:注意本文的改进机制需要关闭AMP运行否则会报精度错误!

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
 
if __name__ == '__main__':
    model = YOLO('yolo11-Haar.yaml')
    # 如何切换模型版本, 上面的ymal文件可以改为 yolov11s.yaml就是使用的v11s,
    # 类似某个改进的yaml文件名称为yolov11-XXX.yaml那么如果想使用其它版本就把上面的名称改为yolov11l-XXX.yaml即可(改的是上面YOLO中间的名字不是配置文件的)!
    # model.load('yolov11n.pt') # 是否加载预训练权重,科研不建议大家加载否则很难提升精度
    model.train(data=r"C:\Users\Administrator\PycharmProjects\yolov5-master\yolov5-master\Construction Site Safety.v30-raw-images_latestversion.yolov8\data.yaml",
                # 如果大家任务是其它的'ultralytics/cfg/default.yaml'找到这里修改task可以改成detect, segment, classify, pose
                cache=False,
                imgsz=640,
                epochs=100,
                single_cls=False,  # 是否是单类别检测
                batch=4,
                close_mosaic=0,
                workers=0,
                device='0',
                optimizer='SGD', # using SGD 优化器 默认为auto建议大家使用固定的.
                # resume=, # 续训的话这里填写True, yaml文件的地方改为lats.pt的地址,需要注意的是如果你设置训练200轮次模型训练了200轮次是没有办法进行续训的.
                amp=False,  # 如果出现训练损失为Nan可以关闭amp
                project='runs/train',
                name='exp',
                )

5.3 HWD的训练过程截图

PS:注意本文的改进机制需要关闭AMP运行否则会报精度错误!


六、本文总结

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

相关文章:

  • 传入一个list map,寻找最大的key和对应的vlaue
  • 快速定位并优化CPU 与 JVM 内存性能瓶颈
  • 黑客入侵动图特效实现
  • linux下pip下载项目失败
  • Vue.js 入门指南:从基础到实战
  • 解析跨域:原理、解决方案与实践指南
  • 算法日记20:SC72最小生成树(prim朴素算法)
  • C++ 多态详解
  • New-api大模型代理聚合创建渠道使用多个大模型
  • C++(23):利用this参数更方便的实现CRTP
  • 检索增强生成(RAG)技术应用方案设计
  • 【AIGC】冷启动数据与多阶段训练在 DeepSeek 中的作用
  • 网页版的俄罗斯方块
  • 01-零基础入门嵌入式系统
  • Comsol 双层带穿孔多孔材料背衬的穿孔板的吸声:亥姆霍兹共振腔的能量耗散
  • C++类与对象深度解析(一):从引用、内联函数到构造析构的编程实践
  • 广西壮族自治区园区投促中心党委书记陶德文率团到访深兰科技
  • 【软件分享】Beyond Compare 4
  • 2025.2.19——1500
  • 认识AD2428芯片
  • 国务院关税税则委员会关于调整对原产于美国的进口商品加征关税措施的公告
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额超5万元
  • 盖茨说对中国技术封锁起到反作用
  • 加强战略矿产出口全链条管控工作部署会召开
  • 有关部门负责人就《新时代的中国国家安全》白皮书答记者问
  • “饿了么”枣庄一站点两名连襟骑手先后猝死,软件显示生前3天每日工作超11小时