前言本文介绍了基于Haar小波的下采样HWD模块与YOLO26的结合以解决语义分割任务中池化特征导致重要空间信息丧失的问题。HWD模块由无损特征编码模块和特征表示学习模块组成通过Haar小波变换降低特征图空间分辨率并保留信息。我们将HWD代码集成进YOLO26 实验显示结合HWD的YOLO26在不同模态图像数据集上或能提高分割性能减少信息不确定性。文章目录 YOLO26改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLO26改进专栏文章目录前言介绍摘要文章链接基本原理Haar小波Haar小波降采样HWD核心代码YOLO26引入代码注册步骤1:步骤2配置yolo26-HWD.yaml实验脚本结果介绍摘要下采样操作如最大池化或步幅卷积被广泛应用于卷积神经网络CNN中用于聚合局部特征、扩大感受野和最小化计算开销。然而对于语义分割任务在局部邻域内进行池化特征可能会导致重要空间信息的丧失而这些信息对于逐像素的预测是有帮助的。为了解决这个问题我们引入了一种简单但有效的池化操作称为基于Haar小波的下采样HWD模块。该模块可以轻松集成到CNN中以提高语义分割模型的性能。HWD的核心思想是应用Haar小波变换来降低特征图的空间分辨率同时尽可能保留信息。此外为了研究HWD的优点我们提出了一种新颖的度量标准称为特征熵指数FEI用于衡量CNN下采样后的信息不确定程度。具体而言FEI可以用来指示下采样方法在语义分割中保留关键信息的能力。我们的综合实验表明提出的HWD模块可以1在不同模态图像数据集和各种CNN架构上有效提高分割性能且2相比传统下采样方法能有效减少信息不确定性。我们的实现可在https://github.com/apple1986/HWD获取。文章链接论文地址论文地址代码地址代码地址基本原理Haar小波Haar小波是一种最简单的正交小波其基本函数由两个函数构成尺度函数 ϕ和小波函数 ψ。具体定义如下尺度函数ϕ0(x):ϕ 0 ( x ) { 1 if 0 ≤ x 1 0 otherwise ϕ0(x) \begin{cases} 1 \text{if } 0 \leq x 1 \\ 0 \text{otherwise} \end{cases}ϕ0(x){10if0≤x1otherwise一维Haar变换的尺度函数ϕ1(x)和小波函数ψ1(x):ϕ 1 ( x ) 1 2 ( ϕ 0 ( 2 x ) ϕ 0 ( 2 x − 1 ) ) ϕ1(x) \frac{1}{\sqrt{2}}(ϕ0(2x) ϕ0(2x - 1))ϕ1(x)21(ϕ0(2x)ϕ0(2x−1))ψ 1 ( x ) 1 2 ( ϕ 0 ( 2 x ) − ϕ 0 ( 2 x − 1 ) ) ψ1(x) \frac{1}{\sqrt{2}}(ϕ0(2x) - ϕ0(2x - 1))ψ1(x)21(ϕ0(2x)−ϕ0(2x−1))通过这些函数Haar变换可以将信号分解成低频尺度函数和高频小波函数成分。对于二维信号如灰度图像Haar小波变换会产生四个分量低频分量A以及水平H、垂直V和对角线D方向的高频分量 。Haar小波降采样HWDHaar小波降采样HWD是一种用于语义分割的降采样模块旨在通过Haar小波变换减少特征图的空间分辨率同时尽量保留信息。HWD模块主要由两个部分组成无损特征编码模块利用Haar小波变换来降低特征图的空间分辨率同时保持所有信息。Haar小波变换是一种紧凑、二进制、正交的小波变换广泛应用于图像编码、边缘提取和二进制逻辑设计 。特征表示学习模块由标准的1×1卷积层、批归一化层和ReLU激活函数组成用于提取辨别性特征。此模块调整特征图的通道数以适应后续层并过滤冗余信息 。核心代码importtorchimporttorch.nnasnnfrompytorch_waveletsimportDWTForwardclassDown_wt(nn.Module):def__init__(self,in_ch,out_ch):super(Down_wt,self).__init__()# 定义离散小波变换 (DWT) 前向操作self.wtDWTForward(J1,modezero,wavehaar)# 定义卷积、批归一化和ReLU的组合self.conv_bn_relunn.Sequential(nn.Conv2d(in_ch*4,out_ch,kernel_size1,stride1),# 1x1卷积层输入通道数为in_ch*4输出通道数为out_chnn.BatchNorm2d(out_ch),# 批归一化层nn.ReLU(inplaceTrue),# ReLU激活函数)defforward(self,x):# 对输入进行小波变换yL,yHself.wt(x)# yL是低频分量yH是高频分量y_HLyH[0][:,:,0,::]# 获取高频分量中的水平细节分量y_LHyH[0][:,:,1,::]# 获取高频分量中的垂直细节分量y_HHyH[0][:,:,2,::]# 获取高频分量中的对角细节分量# 将低频分量和所有高频分量在通道维度上拼接xtorch.cat([yL,y_HL,y_LH,y_HH],dim1)# 通过卷积、批归一化和ReLU组合xself.conv_bn_relu(x)returnx# 返回处理后的输出YOLO26引入代码在根目录下的ultralytics/nn/目录新建一个sample目录然后新建一个以HWD为文件名的py文件 把代码拷贝进去。需要安装pytorch_wavelets进入ultralytics/nn/otherModules目录下载pytorch_waveletsgit clone https://github.com/fbcotter/pytorch_wavelets 如果很慢可以使用下面的镜像命令 git clone https://gitclone.com/github.com/fbcotter/pytorch_wavelets安装cd pytorch_wavelets pip install .importtorchimporttorch.nnasnnfrompytorch_waveletsimportDWTForwardclassDown_wt(nn.Module):def__init__(self,in_ch,out_ch):super(Down_wt,self).__init__()self.wtDWTForward(J1,modezero,wavehaar)self.conv_bn_relunn.Sequential(nn.Conv2d(in_ch*4,out_ch,kernel_size1,stride1),nn.BatchNorm2d(out_ch),nn.ReLU(inplaceTrue),)defforward(self,x):yL,yHself.wt(x)y_HLyH[0][:,:,0,::]y_LHyH[0][:,:,1,::]y_HHyH[0][:,:,2,::]xtorch.cat([yL,y_HL,y_LH,y_HH],dim1)xself.conv_bn_relu(x)returnx注册在ultralytics/nn/tasks.py中进行如下操作步骤1:fromultralytics.nn.sample.HWDimportDown_wt步骤2修改def parse_model(d, ch, verboseTrue):Down_wt配置yolo26-HWD.yamlultralytics/cfg/models/26/yolo26-HWD.yaml# Ultralytics AGPL-3.0 License - https://ultralytics.com/license# Ultralytics YOLO26 object detection model with P3/8 - P5/32 outputs# Model docs: https://docs.ultralytics.com/models/yolo26# Task docs: https://docs.ultralytics.com/tasks/detect# Parametersnc:80# number of classesend2end:True# whether to use end-to-end modereg_max:1# DFL binsscales:# model compound scaling constants, i.e. modelyolo26n.yaml will call yolo26.yaml with scale n# [depth, width, max_channels]n:[0.50,0.25,1024]# summary: 260 layers, 2,572,280 parameters, 2,572,280 gradients, 6.1 GFLOPss:[0.50,0.50,1024]# summary: 260 layers, 10,009,784 parameters, 10,009,784 gradients, 22.8 GFLOPsm:[0.50,1.00,512]# summary: 280 layers, 21,896,248 parameters, 21,896,248 gradients, 75.4 GFLOPsl:[1.00,1.00,512]# summary: 392 layers, 26,299,704 parameters, 26,299,704 gradients, 93.8 GFLOPsx:[1.00,1.50,512]# summary: 392 layers, 58,993,368 parameters, 58,993,368 gradients, 209.5 GFLOPs# YOLO26n backbonebackbone:# [from, repeats, module, args]-[-1,1,Conv,[64,3,2]]# 0-P1/2-[-1,1,Conv,[128,3,2]]# 1-P2/4-[-1,2,C3k2,[256,False,0.25]]-[-1,1,Conv,[256,3,2]]# 3-P3/8-[-1,2,C3k2,[512,False,0.25]]-[-1,1,Conv,[512,3,2]]# 5-P4/16-[-1,2,C3k2,[512,True]]-[-1,1,Conv,[1024,3,2]]# 7-P5/32-[-1,2,C3k2,[1024,True]]-[-1,1,SPPF,[1024,5,3,True]]# 9-[-1,2,C2PSA,[1024]]# 10# YOLO26n headhead:-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,6],1,Concat,[1]]# cat backbone P4-[-1,2,C3k2,[512,True]]# 13-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,4],1,Concat,[1]]# cat backbone P3-[-1,2,C3k2,[256,True]]# 16 (P3/8-small)-[-1,1,Down_wt,[256]]-[[-1,13],1,Concat,[1]]# cat head P4-[-1,2,C3k2,[512,True]]# 19 (P4/16-medium)-[-1,1,Down_wt,[512]]-[[-1,10],1,Concat,[1]]# cat head P5-[-1,1,C3k2,[1024,True,0.5,True]]# 22 (P5/32-large)-[[16,19,22],1,Detect,[nc]]# Detect(P3, P4, P5)实验脚本importwarnings warnings.filterwarnings(ignore)fromultralyticsimportYOLOif__name____main__:# 修改为自己的配置文件地址modelYOLO(./ultralytics/cfg/models/26/yolo26-HWD.yaml)# 修改为自己的数据集地址model.train(data./ultralytics/cfg/datasets/coco8.yaml,cacheFalse,imgsz640,epochs10,single_clsFalse,# 是否是单类别检测batch8,close_mosaic10,workers0,optimizerMuSGD,# optimizerSGD,ampFalse,projectruns/train,nameyolo26-HWD,)结果