ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv13改进策略【卷积层篇】| NeurIPS 2022 gnConv 递归门控卷积,把自注意力翻译成一个卷积算子

YOLOv13改进策略【卷积层篇】| NeurIPS 2022 gnConv 递归门控卷积,把自注意力翻译成一个卷积算子 本文基于YOLOv13 官方仓库iMoonLab/yolov13ultralytics 8.3.63 fork实测整理Windows/CPU 全程可跑。HorNetRao et al., NeurIPS 2022的核心洞察自注意力的 q·k 加权求和本质就是逐点乘门控 线性投影的递归——把它写成卷积形式就是 gnConvrecursive gated convolution。输入经 1×1 分成查询与门控两路门控路过大核深度卷积后按维度切成 order 份递归地乘门控→升维——以普通卷积的复杂度建模高阶空间交互。本文基于官方 raoyongming/HorNet 等价内嵌替换进 v13n 的层 22P3 引导投影 1×1 卷积实测13,200 参数。前言卷积层篇的替换式玩法层数不变、无顺移但替换对象不是下采样而是Neck 里 P3 引导分支的 1×1 投影卷积层 22——它负责把 HyperACE 的引导特征压到检测分辨率是引导信息怎么喂给检测头的咽喉。gnConv 出自 NeurIPS 2022《HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions》官方源码 github.com/raoyongming/HorNet官方类名gnconv本文仅把类名规范为GnConv。本文所有数据均在 v13n 上实测。专栏目录YOLOv13改进目录一览专栏地址YOLOv13改进专栏——持续更新各方向即插即用改进一、替换点分析head: ... - [-1, 2, DSC3k2, [256, True]] # 21 主干 P3 分支 - [10, 1, Conv, [256, 1, 1]] # 22 ← 本文替换这一层 - [[21, 22], 1, FullPAD_Tunnel, []] # 23 ...层数不变无顺移。层 22 的输入输出都是 64 通道width0.25 缩放后——gnConv 是保形算子输出通道输入通道严丝合缝。原层是 1×1 卷积8,320 参数零空间感受野gnConv 内置 7×7 深度卷积 递归门控的高阶交互替换后该路径的空间建模能力大幅增强参数只增加 13,200。FullPAD 的 [21, 22] 引用、Detect 的引用全部原样可用。二、gnConv 原理速览自注意力的卷积翻译自注意力 q·k 相似度加权 v 的求和。HorNet 指出这等价于用 k 的函数门控 v、再用线性层混合的递归形式——于是用卷积件替换注意力件投影分叉1×1 卷积把输入升到 2C切成pwa查询C/16与abc被门控特征其余门控路abc 过 7×7深度卷积空间交互后按维度切成 order 份维度从 C/16 逐级到 C/2递归门控x pwa * dw_1x pw_i(x) * dw_{i1}循环 order-1 次——每轮乘一份门控 → 1×1 升维order5 时实现五阶空间交互输出投影1×1 卷积回到 C为什么强高阶交互多轮乘法门控让特征之间的依赖从二阶普通注意力扩展到五阶而全部计算都是深度卷积 1×1——没有 softmax、没有 (HW)² 矩阵分辨率越高越划算保形模块输出通道输入通道注册走只需输入通道数的分支yaml 写[]要求通道能被 2^(order-1)16 整除。三、实现代码官方 raoyongming/HorNet 的gnconv等价内嵌仅去掉 gflayer 分支与打印、forward 收敛为单输入签名已做同权重输出逐位比对max diff 0import torch import torch.nn as nn def get_dwconv(dim, kernel, bias): return nn.Conv2d(dim, dim, kernel_sizekernel, padding(kernel - 1) // 2, biasbias, groupsdim) class GnConv(nn.Module): gnConv 递归门控卷积 (Rao et al., NeurIPS 2022, HorNet)官方 raoyongming/HorNet 的 gnconv 等价内嵌仅去掉 gflayer 分支与打印、 forward 收敛为单输入签名官方类名 gnconv此处仅规范命名便于 yaml 调用。 把自注意力的 q·k 加权求和翻译成卷积1×1 投影出 pwa查询与 abc 被门控特征abc 经 7×7 深度卷积后按维度切成 order 份然后递归地 乘上门控 → 1×1 升维 → 再乘下一份门控——以远低于注意力的代价实现 高阶空间交互。要求 channel 能被 2^(order-1) 整除。 保形模块输入输出同形状。 def __init__(self, dim, order5, s1.0): super().__init__() self.order order self.dims [dim // 2 ** i for i in range(order)] self.dims.reverse() assert dim % 2 ** (order - 1) 0, channel 必须能被 2^(order-1) 整除 self.proj_in nn.Conv2d(dim, 2 * dim, 1) self.dwconv get_dwconv(sum(self.dims), 7, True) self.proj_out nn.Conv2d(dim, dim, 1) self.pws nn.ModuleList( [nn.Conv2d(self.dims[i], self.dims[i 1], 1) for i in range(order - 1)] ) self.scale s def forward(self, x): fused_x self.proj_in(x) pwa, abc torch.split(fused_x, (self.dims[0], sum(self.dims)), dim1) dw_abc self.dwconv(abc) * self.scale dw_list torch.split(dw_abc, self.dims, dim1) x pwa * dw_list[0] for i in range(self.order - 1): x self.pws[i](x) * dw_list[i 1] x self.proj_out(x) return x注意签名是保形风格yaml 写[]parse_model 自动注入 c1注册走只需输入通道数的分支。四、添加步骤v13 版1. 修改ultralytics/nn/modules/conv.pyget_dwconv函数与GnConv类粘贴到 conv.py 末尾。2. 修改ultralytics/nn/modules/__init__.pyfrom .conv import (...)里追加GnConv,__all__里给最后一项DSConv补逗号后追加GnConv。3. 修改ultralytics/nn/tasks.py顶部导入块加GnConvparse_model()里新增分支保形模块yaml 写[]通道数自动注入elif m is GnConv: # GnConv保形模块只需输入通道数 args.insert(0, ch[f])插入位置elif m is FullPAD_Tunnel:之后、else:之前。五、yaml 模型文件只改第 22 层其余与官方 yolov13.yaml 逐行一致# Ultralytics YOLOv13n GnConv 递归门控卷积 nc: 80 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 head: - [[4, 6, 8], 2, HyperACE, [512, 8, True, True, 0.5, 1, both]] # 9 - [-1, 1, nn.Upsample, [None, 2, nearest]] # 10 - [ 9, 1, DownsampleConv, []] # 11 - [[6, 9], 1, FullPAD_Tunnel, []] # 12 - [[4, 10], 1, FullPAD_Tunnel, []] # 13 - [[8, 11], 1, FullPAD_Tunnel, []] # 14 - [-1, 1, nn.Upsample, [None, 2, nearest]] # 15 - [[-1, 12], 1, Concat, [1]] # 16 cat backbone P4 - [-1, 2, DSC3k2, [512, True]] # 17 - [[-1, 9], 1, FullPAD_Tunnel, []] # 18 - [17, 1, nn.Upsample, [None, 2, nearest]] # 19 - [[-1, 13], 1, Concat, [1]] # 20 cat backbone P3 - [-1, 2, DSC3k2, [256, True]] # 21 - [-1, 1, GnConv, []] # 22 ★GnConv替换1×1投影卷积层数不变 - [[21, 22], 1, FullPAD_Tunnel, []] # 23 - [-1, 1, Conv, [256, 3, 2]] # 24 - [[-1, 18], 1, Concat, [1]] # 25 cat head P4 - [-1, 2, DSC3k2, [512, True]] # 26 - [[-1, 9], 1, FullPAD_Tunnel, []] # 27 - [26, 1, Conv, [512, 3, 2]] # 28 - [[-1, 14], 1, Concat, [1]] # 29 cat head P5 - [-1, 2, DSC3k2, [1024,True]] # 30 - [[-1, 11], 1, FullPAD_Tunnel, []] # 31 - [[23, 27, 31], 1, Detect, [nc]] # 32 Detect(P3, P4, P5)六、成功运行结果yolo detect train modelyolov13n-GnConv.yaml datamydata.yaml epochs100 imgsz640 batch4Python 方式from ultralytics import YOLO model YOLO(yolov13n-GnConv.yaml).load(yolov13n.pt) model.train(datamydata.yaml, epochs100, imgsz640, batch4)本文实测YOLOv13 官方仓库Windows CPUv13n 结构替换层 22基线 yolov13n: 2,494,151 parameters, 6.5 GFLOPs GnConv: 2,507,351 parameters, 6.7 GFLOPs 第22层GnConv 3 epochs completed. Results saved to runs\detect\v13_gnconv_smoke✅ 断言全部通过① 适配版与官方gnconv同权重输出逐位一致max diff 0② 第 22 层为GnConv总参数量恰为基线 13,200模块 21,520 − 原 1×1 卷积 8,320③model.save引用包含第 22 层FullPAD [21, 22] 消费其输出梯度可达无悬空层④ 层数不变整网 640 前向正常3 轮冒烟训练正常收敛。参数量分解64 通道order5部件参数量说明proj_in 1×164→1288,320分出查询与门控两路dwconv 7×7 深度卷积124 组6,076门控路的空间交互pws 四段 1×14→8→16→32→642,840递归升维proj_out 1×164→644,224输出投影合计21,52013,200原层为 1×1 卷积 8,320模型ParamsGFLOPs说明YOLOv13n 基线2,494,1516.5官方结构GnConv2,507,3516.7五阶递归门控空间交互七、总结gnConv 的三点记忆锚注意力→卷积的翻译乘门控 线性投影的递归等价于高阶空间交互、order 控制阶数order5 时维度按 C/16→C/8→C/4→C/2→C 递归升维通道需能被 16 整除、替换零感受野的 1×1 最划算本篇替换的 P3 引导投影原来完全没有空间建模能力。它与 Involution上篇同走动态核路线Involution 逐位置生成核、交互只在 k² 邻域内gnConv 用递归门控把交互阶数堆到五阶——一个空间更深一个阶数更高。觉得有帮助的话点赞收藏关注三连支持一下评论区欢迎交流你的实验结果~专栏目录YOLOv13改进目录一览 专栏地址YOLOv13改进专栏——持续更新各方向即插即用改进
返回列表