YOLO11改进-模块-引入多尺度小波池化变压器MWPT 通过结合小波变换、多尺度池化以及门控机制等技术解决多尺度、小目标、边缘模糊等问题
手势识别在人机交互等领域应用广泛,但面临手部姿态多变、环境因素干扰等挑战。深度学习发展促使基于注意力的模型兴起,Transformer 在自然语言处理和计算机视觉诸多任务表现出色,也被用于手势识别。不过,传统 Transformer 处理视觉数据时,存在计算复杂度高(二次注意力机制计算复杂度达O(n2) )、空间复杂度高以及特征图维度处理不够灵活等问题。在这样的研究背景下,为了实现高效准确的动态手势识别,本文提出了一种全新的 Multiscale Wavelet Pooling Transformer(MWPT)模型,并将其应用于 GestFormer 架构中。该模型旨在克服传统 Transformer 的缺陷,通过引入多尺度小波池化注意力机制和门控网络,在减少计算成本的同时,提升模型对动态手势的识别性能,为手势识别领域的发展提供新的思路和方法。
上面是原模型,下面是改进模型

1. 多尺度小波池化变压器MWPT介绍
MWPT 模型的理论基础融合了 PoolFormer 的高效令牌混合机制、小波变换的特性、多尺度池化策略以及门控网络原理。它以 PoolFormer 为核心,用基于池化的令牌混合替代传统 Transformer 中计算复杂的注意力机制,降低模型复杂度。同时,引入多尺度小波池化注意力(MWPA)机制,借助小波变换将输入特征分解为不同频率的子带,获取多尺度信息,再经多尺度池化聚合这些信息,增强模型对不同尺度特征的捕捉能力。此外,门控深度可分离前馈网络(GDFN)通过门控机制和深度可分离卷积,对特征进行筛选和变换,使模型能够聚焦于关键信息,有效提升动态手势识别的性能
从提供的图片来看,MWPT模块主要包含以下几个部分:
多尺度小波池化注意力(MWPA):MWPA 是 MWPT 中的关键创新组件。它先对输入特征进行小波变换,将输入特征 F 分解为 4 个子空间,即近似分量(LL)和水平(LH)、垂直(HL)、对角(HH)三个方向的细节分量。这些系数是小波变换后分解出的正弦波的幅度。之后,利用深度可分离卷积对这些系数分别进行增强处理,以突出重要特征。为了有效提取多尺度信息,MWPA 采用多尺度池化(MSP)机制。具体来说,使用 3 种不同大小的滤波器(3×3、5×5、7×7)对经过小波系数处理(WCP)块的输出特征进行池化操作。这 3 个不同尺度的池化层能够捕捉到不同大小和分辨率的特征信息,例如,较小的 3×3 滤波器可以关注到局部的细节特征,而较大的 7×7 滤波器则更擅长捕捉整体的结构特征。最后,将这 3 个池化层的输出进行平均,得到一个综合了多尺度信息的增强特征,作为 MWPA 块的最终输出。
门控深度可分离前馈网络(GDFN):GDFN 主要用于对 MWPA 输出的特征进行进一步变换和筛选,以控制信息的流动。它基于前馈网络(FFN)进行了两项重要改进,即引入门控机制和深度可分离卷积。在结构上,GDFN 通过深度可分离卷积对输入特征进行线性变换,同时对两个并行的特征进行元素相乘操作,其中一个特征经过 GELU 激活函数处理。其计算公式为P′=Wp0Gating(P)+P 、Gating(P)=ϕ(Wd1Wp1(P))⊙Wd2Wp2(P)。这种设计使得 GDFN 能够有选择地将重要特征和精细信息传递到 Transformer 块的后续阶段,让模型能够更加专注于图像中关键的细节信息,从而提升整体性能。
2. YOLOv11与MWPT的结合
本文使用MWPT模块替换C3K2模块中的普通卷积,在复杂场景目标检测中,二者分别提取动态变化与空间位置等特征,融合后提升检测精度,还能强化对不同尺度手势的感知,提高检测稳定性
3. MWPT代码部分
YOLOv8_improve/YOLOv11.md at master · tgf123/YOLOv8_improve · GitHub
视频讲解:YOLOv11模型改进讲解,教您如何修改YOLOv11_哔哩哔哩_bilibili
YOLOv11全部代码,现有几十种改进机制。
4. 将MWPT引入到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行成功
from sympy import false
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
if __name__=="__main__":
# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
model = YOLO(r"E:\Part_time_job_orders\YOLO\YOLOv11\ultralytics\cfg\models\11\yolo11_PHA.yamy")\
.load(r'E:\Part_time_job_orders\YOLO\YOLOv11\yolo11n.pt') # build from YAML and transfer weights
results = model.train(data=r'E:\Part_time_job_orders\YOLO\YOLOv11\ultralytics\cfg\datasets\VOC_my.yaml',
epochs=300,
imgsz=640,
batch=64,
# cache = False,
# single_cls = False, # 是否是单类别检测
# workers = 0,
# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
amp = True
)