目录
一 基于Haar的小波变换
二 使用基于Haar的小波变换Down_wt处理替换模型结构中的Conv和ADown 实践
1 整体修改
2 配置文件
3 训练
三 报错处理
一 基于Haar的小波变换
Haar小波是最简单的小波形式之一,具有易于计算和实现的优点。使用二维离散小波变换(2D DWT),将图像信息矩阵分解为细节矩阵(水平分量、垂直分量和对角线分量)和信息矩阵。最后,使用这些矩阵信息重构图像。通过使用Haar小波作为基函数,对原始图像进行压缩处理,减少图像大小,同时还会尽可能保持图像质量(图像边缘和细节方面会保留,不会损失很大)。
官方代码地址:GitCode - 开发者的代码家园
二 使用基于Haar的小波变换Down_wt处理替换模型结构中的Conv和ADown 实践
1 整体修改
① 新建 haar_HWD.py文件
在yolov9/models目录下新建haar_HWD.py文件,文件内容如下:
import torch
# 导入PyTorch中的神经网络模块
import torch.nn as nn
# 导入DWTForward
from pytorch_wavelets import DWTForward
__all__ = ['Down_wt']
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')
# 定义一个包含卷积层、批归一化层和ReLU激活函数的序列模块conv_bn_relu
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):
# 对输入x进行小波变换,得到低频分量yL和高频分量yH
yL, yH = self.wt(x)
# 从高频分量中提取出水平低频分量y_HL、垂直低频分量y_LH和对角线低频分量y_HH
y_HL = yH[0][:,:,0,::]
y_LH = yH[0][:,:,1,::]
y_HH = yH[0][:,:,2,::]
# 将yL、y_HL、y_LH和y_HH按通道拼接起来
x = torch.cat([yL, y_HL, y_LH, y_HH], dim=1)
# 上述输出X输入到conv_bn_relu模块中进行卷积操作和激活函数处理
x = self.conv_bn_relu(x)
# 返回最终的X
return x
② 修改yolov9/models/yolo.py文件
搜索“parse_model”的部分,进行如下修改:
2 配置文件
yolov9-c_haar_HWD.yaml的内容与原始文件的内容对比如下:
backbone |
head |
3 训练
上述修改完毕后,我们开始训练吧!🌺🌺🌺
训练示例:
cd yolov9项目路径
# 激活yolov9环境
conda activate yolov9
# 开始训练
python3 train_dual.py --cfg=models/detect/yolov9-c_haar_HWD.yaml --data=data/fire.yaml --epoch=100 --batch-size=4 --imgsz=640 --hyp=data/hyps/hyp.scratch-high.yaml
三 报错处理
【报错】ModuleNotFoundError: No module named 'pytorch_wavelets'
【解决方法】安装 pytorch_wavelets
pip install pytorch_wavelets -i https://pypi.tuna.tsinghua.edu.cn/simple
到此,本文分享的内容就结束啦!遇见便是缘,感恩遇见!!!💛 💙 💜 ❤️ 💚