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分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~