YOLO11改进-Backbone-引入TransXNet替换YOLO backbone 学习全局和局部动态信息,提高检测精度
Vision Transformer 的缺陷:Vision Transformer(ViT)运用多头自注意力机制在计算机视觉领域取得进展,但它缺乏卷积神经网络(CNNs)所具有的归纳偏差,导致泛化能力相对较弱。像 Swin Transformer 虽引入移位窗口自注意力融入归纳偏差并降低计算成本,可窗口化注意力的局部特性又限制了感受野。
CNN - Transformer 混合网络的困境:为解决 ViT 的问题,诸多研究构建了 CNN - Transformer 混合网络,将卷积和自注意力集成到令牌混合器中。然而,标准卷积存在局限性:一方面,卷积核是静态的,与能动态计算注意力矩阵的自注意力不同,这导致两者在表示能力上存在差异,削弱了模型的建模能力;另一方面,在深度堆叠混合令牌混合器时,卷积的静态性质阻碍了其对自注意力生成特征的有效融合与利用。
大感受野和动态卷积的需求:网络需要大感受野和归纳偏差来捕捉丰富上下文信息。通过有效感受野(ERF)分析发现,在网络各阶段使用全局自注意力能扩大模型 ERF,而且将动态卷积与全局自注意力结合可进一步扩大感受野。所以,设计一种能与自注意力深度集成的输入相关动态卷积机制十分必要。
上面是原模型,下面是改进模型

1. TransXNet介绍
D - Mixer 动态特征聚合:D - Mixer 将输入特征图沿通道维度均分为两个子特征图,分别由 OSRA 和 IDConv 处理,OSRA 用于捕捉全局信息,IDConv 用于提取局部特征,两者输出拼接后经 STE 聚合,这种方式使模型能根据输入动态聚合全局和局部信息,增强表示能力。
IDConv 动态卷积:IDConv 通过自适应平均池化聚合空间上下文,经卷积生成注意力图,再经 softmax 等操作生成与输入相关的卷积核。与其他动态卷积相比,它能为每个注意力组生成空间变化的注意力图,更有效地编码局部特征,且计算开销更低。
MS - FFN 多尺度信息融合:MS - FFN 使用四个不同尺度的并行深度卷积处理不同通道,可捕捉多尺度信息,相比普通 FFN 能更好地利用丰富通道表示,提升模型对不同尺度物体的特征提取能力。
从提供的图片来看,SSA模块主要包含以下几个部分:
整体分层架构:TransXNet 采用分层架构,包含四个阶段。每个阶段都有一个补丁嵌入层,用于将图像转换为特征图,后续连接多个由 DPE、D - Mixer 和 MS - FFN 组成的块,实现特征的逐步提取和融合。
基本块组成
动态位置编码(DPE)层:通过残差 7×7 深度卷积实现,为输入特征添加位置信息,公式为DPE(X)=DWConv7×7(X)+X。
双动态令牌混合器(D - Mixer):是核心组件,由 OSRA、IDConv 和 STE 构成,实现全局和局部信息的动态融合。
多尺度前馈网络(MS - FFN):采用四个不同尺度(1×1、3×3、5×3、7×7)的并行深度卷积,对特征进行多尺度处理,有效探索多尺度信息 。
2. YOLOv11与TransXNet的结合
使用 TransXNet 替换YOLO11的 backbone,能凭借其双动态令牌混合器,同时学习全局和局部动态信息,增强特征表示能力,进而提升目标检测精度;而且它计算成本较低,在保持性能的同时可减少计算资源消耗,提升检测效率。
3. TransXNet代码部分
视频讲解:
YOLOv8_improve/YOLOv11.md at master · tgf123/YOLOv8_improve · GitHub
用一篇论文教您如何使用YOLOv11改进模块写一篇1、2区论文_哔哩哔哩_bilibili
YOLOv11模型改进讲解,教您如何替换原有的YOLO11 backbone提升精度_哔哩哔哩_bilibili
YOLOv11全部代码,现有一百多种改进机制。
4. TransXNet引入到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_models路径下,如下图所示。
第二:在task.py中导入包
第三:在YOLOv11\ultralytics\nn\tasks.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行成功
from sympy import falsefrom ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorldif __name__=="__main__":# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型model = YOLO(r"EE:\bilibili\model\YOLOV8_new\ultralytics-main\ultralytics\cfg\models\11\yolo11_transxnet_t.yaml")\.load(r'E:\Part_time_job_orders\YOLO\YOLOv11\yolo11n.pt') # build from YAML and transfer weightsresults = 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)