
本文基于YOLOv13 官方仓库iMoonLab/yolov13ultralytics 8.3.63 fork实测整理Windows/CPU 环境全程可跑flash_attn 自动降级为标准注意力。注意力机制模块本身与模型版本无关但插入位置、yaml 层号、注册细节在 v13 里完全不同这篇全部按 v13 重讲。MLCAMixed Local Channel AttentionEAAI 2024把局部、全局、通道、空间四种信息揉进一个模块并靠先降分辨率再算注意力把计算量压得很低——是近年小目标/密集场景里涨点很稳的即插即用模块。前言YOLOv13清华团队HyperACE 超图 FullPAD 全流水线聚合架构把检测 backbone 换成了 DSC3k2/A2C2f/DSConv 的全新组合还引入了 HyperACE 超图模块和 7 个 FullPAD_Tunnel 门控——v11 时代的第 11 层插注意力在 v13 里根本不存在。这篇以 MLCAEAAI 2024为例演示注意力模块如何真正迁移到 v13结构分析、插入点选择、层号顺移、注册适配全套实测验证。专栏目录YOLOv13改进目录一览含 v11 全系列专栏地址YOLO改进专栏——持续更新各方向即插即用改进一、先看懂 YOLOv13 的结构插入点变了对照官方yolov13.yaml节选层号从 0 数起backbone: - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 - [-1, 1, Conv, [128, 3, 2, 1, 2]] # 1-P2/4 - [-1, 2, DSC3k2, [256, False, 0.25]]# 2 - [-1, 1, Conv, [256, 3, 2, 1, 4]] # 3-P3/8 - [-1, 2, DSC3k2, [512, False, 0.25]]# 4 - [-1, 1, DSConv, [512, 3, 2]] # 5-P4/16 - [-1, 4, A2C2f, [512, True, 4]] # 6 - [-1, 1, DSConv, [1024, 3, 2]] # 7-P5/32 - [-1, 4, A2C2f, [1024, True, 1]] # 8 ★backbone末端 head: - [[4, 6, 8], 2, HyperACE, [...]] # 9 ★超图模块吃三个尺度 - [-1, 1, nn.Upsample, [...]] # 10 - [ 9, 1, DownsampleConv, []] # 11 - [[6, 9], 1, FullPAD_Tunnel, []] # 12 ★门控引用了第9层 ...共7个FullPAD_Tunnel分散在全网 - [[23, 27, 31], 1, Detect, [nc]] # 32与 v11 的三大差异没有 SPPF 和 C2PSAbackbone 末端是 A2C2f层8v11 的第 11 层插入法失效HyperACE层9聚合 [4,6,8] 三个尺度是 v13 的增强核心7 个 FullPAD_Tunnel 把增强特征分发回全网它们的 from 引用横跨 4-27 层——插入任何新层这些引用全部要顺移漏一个就报错。插入点选择本文选在层 8backbone 末端 A2C2f之后与 v11 系列backbone 末端插入的位置对应这里插入的通道数 c1256v13n 宽度系数 0.25A2C2f[1024] 经宽度缩放后输出 256正好喂给 MLCA。其他合理位置还有层 9 后HyperACE 之后、层 17/21/26/30 后Neck 各尺度方法相同。二、MLCA 原理速览模块本身与模型版本无关这里简要回顾详细讲解见文末 v11 版链接。MLCA 出自论文《A mixed local channel attention mechanism for object detection》Engineering Applications of Artificial Intelligence, EAAI 2024官方源码github.com/wandahangFY/MLCA。它要解决的问题很直接**通道注意力SE/ECA只有哪个通道重要**完全丢失空间位置信息坐标注意力CA补上了方向感知但方向池化在原始分辨率上做特征图越大计算开销越大CBAM 通道空间串联两次卷积参数和计算都翻倍。MLCA 的设计思想一句话概括在低分辨率图上同时算全局通道注意力和局部空间注意力加权融合后上采样。数据流分四步局部分支空间信息输入特征图经自适应平均池化降到5×5得到保留空间结构的低分辨率图把它的空间位置展平成序列用 ECA 式的一维卷积做相邻位置交互再 Sigmoid 得到局部注意力图全局分支通道信息对低分辨率图再池化成1×1同样用一维卷积做跨通道交互Sigmoid 后广播到5×5得到全局注意力图混合两个注意力图按权重相加——att att_global × (1−w) att_local × w默认 w0.5通道与空间各占一半上采样回原尺寸用自适应池化把5×5的混合注意力插值回H×W乘回原特征图。和 CA 对比就明白它省在哪CA 的方向池化在H×W上做MLCA 只在5×5上做注意力部分的计算量缩小了几十倍而全局描述子加进每个局部位置的设计又保证了缩小的同时不丢全局语义。MLCA 同时覆盖通道、空间、局部、全局四种信息参数量极少两个 1D 卷积核共约 10 个参数本文实测即插即用。三、实现代码v13/v11 通用import math import torch import torch.nn as nn import torch.nn.functional as F class MLCA(nn.Module): Mixed Local Channel Attention (Wan et al., EAAI 2024)。 def __init__(self, in_size, local_size5, gamma2, b1, local_weight0.5): super().__init__() self.local_size local_size self.gamma gamma self.b b self.local_weight local_weight # ECA 式自适应卷积核k |log2(C)/γ b/γ|取奇数 t int(abs(math.log(in_size, 2) b) / gamma) k t if t % 2 else t 1 self.conv nn.Conv1d(1, 1, kernel_sizek, padding(k - 1) // 2, biasFalse) # 全局分支 self.conv_local nn.Conv1d(1, 1, kernel_sizek, padding(k - 1) // 2, biasFalse) # 局部分支 self.local_arv_pool nn.AdaptiveAvgPool2d(local_size) self.global_arv_pool nn.AdaptiveAvgPool2d(1) def forward(self, x): b, c, m, n x.size() local_arv self.local_arv_pool(x) # (b,c,ls,ls) 低分辨率局部图 global_arv self.global_arv_pool(local_arv) # (b,c,1,1) 全局描述子 # 局部分支空间位置展平成序列做一维卷积再还原 temp_local local_arv.view(b, c, -1).transpose(-1, -2).reshape(b, 1, -1) y_local self.conv_local(temp_local) y_local y_local.reshape(b, self.local_size * self.local_size, c).transpose(-1, -2).view( b, c, self.local_size, self.local_size) # 全局分支跨通道一维卷积 temp_global global_arv.view(b, c, -1).transpose(-1, -2) y_global self.conv(temp_global).transpose(-1, -2).unsqueeze(-1) # (b,c,1,1) # 混合并上采样回原分辨率 att_local y_local.sigmoid() att_global F.adaptive_avg_pool2d(y_global.sigmoid(), [self.local_size, self.local_size]) att_all F.adaptive_avg_pool2d( att_global * (1 - self.local_weight) att_local * self.local_weight, [m, n]) return x * att_all注意__init__的第一个参数是通道数in_size用于计算 ECA 核大小所以注册方式与第一篇的 SE 相同——**需要传入输入通道数c1**不能走无参数透传的else分支。四、添加步骤v13 版注意注册分支不同1. 修改ultralytics/nn/modules/block.py把MLCA类整体粘贴到文件末尾yolov13 的 block.py 有 60 个类粘贴到末尾即可。2. 修改ultralytics/nn/modules/__init__.py⚠️与 TripletAttention 那篇不同v13 的__init__.py导入块最后一项DSC3k2已经有尾逗号from .block import (...)和__all__两处都如此所以这里不需要再补逗号直接在后面追加MLCA即可。两处都要改缺一不可from .block import ( ... DSC3k2, # ← v13 这里已经有尾逗号无需补 MLCA, ) __all__ ( ... DSC3k2, # ← 同样已有尾逗号 MLCA, )3. 修改ultralytics/nn/tasks.py顶部导入块加上MLCA同样以DSC3k2结尾且已有尾逗号直接追加即可from ultralytics.nn.modules import ( AIFI, ... DSC3k2, MLCA, # 新增 )4. 注册通道数分支v13 关键区别⚠️v13 新坑MLCA 需要传入输入通道数c1映射到in_size它和 SE/CA 一样不能走无参数透传的else分支。8.3.63 的parse_model()里已经有一组只需输入通道数的注意力模块分支EMA/CAA 等走的就是这里把MLCA加进这个集合即可elif m in {SE, CBAMAtt, ECA, CA, MLCA}: # 注意力模块只需输入通道数 args.insert(0, ch[f])提示v13 该分支里可能已包含EMA、CAA等只需把MLCA补进同一集合保持args.insert(0, ch[f])不变。yaml 里写MLCA, []即可通道数由上面这行自动注入。5. yaml 插入与层号顺移v13 的重头戏在第 8 层后插入- [-1, 1, MLCA, []]成为第 9 层后面 24 层全部顺移 1尤其注意 7 个 FullPAD_Tunnel 的 from 引用变化9→10、10→11、11→12。完整 yaml实测可直接运行见下一节。五、yaml 模型文件# Ultralytics YOLOv13n MLCA 混合局部通道注意力 # 基于官方 yolov13.yaml在 backbone 末端原层8 A2C2f后插入注意力层9 nc: 80 # number of classes scales: n: [0.50, 0.25, 1024] s: [0.50, 0.50, 1024] l: [1.00, 1.00, 512] x: [1.00, 1.50, 512] backbone: # [from, repeats, module, args] - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 - [-1, 1, Conv, [128, 3, 2, 1, 2]] # 1-P2/4 - [-1, 2, DSC3k2, [256, False, 0.25]]# 2 - [-1, 1, Conv, [256, 3, 2, 1, 4]] # 3-P3/8 - [-1, 2, DSC3k2, [512, False, 0.25]]# 4 - [-1, 1, DSConv, [512, 3, 2]] # 5-P4/16 - [-1, 4, A2C2f, [512, True, 4]] # 6 - [-1, 1, DSConv, [1024, 3, 2]] # 7-P5/32 - [-1, 4, A2C2f, [1024, True, 1]] # 8 - [-1, 1, MLCA, []] # 9 ★MLCA新增层后续层号全部1 head: - [[4, 6, 8], 2, HyperACE, [512, 8, True, True, 0.5, 1, both]] # 10 - [-1, 1, nn.Upsample, [None, 2, nearest]] # 11 - [ 10, 1, DownsampleConv, []] # 12原from 9→10 - [[6, 10], 1, FullPAD_Tunnel, []] # 13原9→10 - [[4, 11], 1, FullPAD_Tunnel, []] # 14原10→11 - [[8, 12], 1, FullPAD_Tunnel, []] # 15原11→12 - [-1, 1, nn.Upsample, [None, 2, nearest]] # 16 - [[-1, 13], 1, Concat, [1]] # 17 cat backbone P4 - [-1, 2, DSC3k2, [512, True]] # 18 - [[-1, 10], 1, FullPAD_Tunnel, []] # 19原9→10 - [ 18, 1, nn.Upsample, [None, 2, nearest]] # 20 - [[-1, 14], 1, Concat, [1]] # 21 cat backbone P3 - [-1, 2, DSC3k2, [256, True]] # 22 - [ 11, 1, Conv, [256, 1, 1]] # 23原10→11 - [[22, 23], 1, FullPAD_Tunnel, []] # 24原21/22→22/23 - [-1, 1, Conv, [256, 3, 2]] # 25 - [[-1, 19], 1, Concat, [1]] # 26 cat head P4 - [-1, 2, DSC3k2, [512, True]] # 27 - [[-1, 10], 1, FullPAD_Tunnel, []] # 28原9→10 - [ 27, 1, Conv, [512, 3, 2]] # 29原26→27 - [[-1, 15], 1, Concat, [1]] # 30 cat head P5 - [-1, 2, DSC3k2, [1024,True]] # 31 - [[-1, 12], 1, FullPAD_Tunnel, []] # 32原11→12 - [[24, 28, 32], 1, Detect, [nc]] # 33 Detect(P3,P4,P5)六、成功运行结果yolo detect train modelyolov13n-MLCA.yaml datamydata.yaml epochs100 imgsz640 batch16Python 方式from ultralytics import YOLO model YOLO(yolov13n-MLCA.yaml).load(yolov13n.pt) model.train(datamydata.yaml, epochs100, imgsz640, batch16)本文实测YOLOv13 官方仓库Windows CPU构建即测基线 yolov13n: 2,494,151 parameters, 6.5 GFLOPs MLCA: 2,494,161 parameters, 6.6 GFLOPs 第9层MLCA [] 3 epochs completed in 0.001 hours. Results saved to runs\detect\v13_mlca✅ 单元与整网断言全部通过第 9 层为MLCA总参数量恰为基线 10两个一维卷积核手工顺移后的 33 层 yaml 全部引用正确模型成功构建✅ model builds, layer 9 MLCA。模型ParamsGFLOPs增量说明YOLOv13n 基线2.49M6.5-官方结构不含SPPF/C2PSAMLCA2.49M6.610通道空间局部全局四合一七、总结v13 迁移的三个关键插入点按 v13 结构重新选backbone 末端是 A2C2f 不是 C2PSA、FullPAD_Tunnel/Concat/Detect 的引用层号全量顺移、导入块尾逗号问题在 v13 已预置DSC3k2 自带尾逗号直接追加即可。与 TripletAttention 那篇不同的是MLCA 需要输入通道数必须走elif m in {SE, CBAMAtt, ECA, CA, MLCA}: args.insert(0, ch[f])这个只需输入通道数的注册分支不能走无参透传。MLCA 在 v13 上同样只 10 参数却同时覆盖了局部、全局、通道、空间四种信息先降采样、再算注意力、后上采样的工程设计在小目标/密集场景尤其划算。下一篇预告GAMGlobal Attention Mechanism的 v13 迁移版——更大感受野的全局注意力如何接入 FullPAD 架构。觉得有帮助的话点赞收藏关注三连支持一下评论区欢迎交流你的实验结果~专栏目录YOLOv13改进目录一览含 v11 全系列 专栏地址YOLO改进专栏——持续更新各方向即插即用改进