



























本文介绍了动态混合层(DML),并将相关改进模块集成进YOLO26。DML是SRConvNet核心组件,用于解决轻量级图像超分辨率任务中特征捕捉和通道适应性问题。它通过通道扩展拆分、多尺度动态深度卷积、通道洗牌与融合等步骤,实现多尺度局部信息聚合和通道自适应增强。DML的动态卷积具有内容感知适配和分组共享效率优势,多尺度设计能覆盖全尺度图像细节。我们将DML相关模块集成到YOLO26,注册并配置yaml文件。实验表明,改进后的YOLO26有较好的效果。
文章目录: YOLO26改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总
专栏链接: YOLO26改进专栏
最近,视觉变换器(Vision Transformers)在多种任务中展现了相较于卷积神经网络(ConvNet)的优势,包括单图像超分辨率(SISR)。变换器的成功可归因于其不可或缺的多头自注意力(MHSA)机制,该机制能够用较少的参数有效地建模全局连接性。然而,MHSA 的二次复杂度通常会导致巨大的计算成本和内存占用,限制了它们在移动设备上的高效部署,相较于广泛使用的轻量级 ConvNet。在本研究中,我们深入探索了基于 ConvNet 和基于变换器的超分辨率(SR)模型之间的关键区别,从而提出了 SRConvNet,它吸收了这两者的优点,以实现轻量级的 SISR。我们的 SRConvNet 通过两个主要设计来实现:(1)傅里叶调制注意力(FMA),一种类似于 MHSA 的但更加计算和参数效率高的运算符,它执行区域频率-空间调制与聚合,以确保长短期依赖关系的建模;(2)动态混合层(DML),利用混合尺度的深度可分离动态卷积,通过通道分割和重排来探索多尺度上下文信息,从而提升模型的局部性和适应性。结合 FMA 和 DFN,我们可以构建一个纯变换器风格的 ConvNet,在效率与准确性之间权衡,来与最优秀的轻量级 SISR 模型竞争。大量实验表明,SRConvNet 在计算和参数方面能够比最近的最先进的轻量级 SISR 方法实现更高效的超分辨率重建,同时保持相当的性能。代码可在 https://github.com/lifengcs/SRConvNet 获取。
论文地址:论文地址
代码地址:代码地址
动态混合层(Dynamic Mixing Layer, DML)是SRConvNet的核心组件之一,专为解决轻量级图像超分辨率(SISR)任务中局部多尺度特征捕捉与通道适应性增强两大痛点设计,旨在替代传统Vision Transformer(ViT)中局限于线性变换的前馈网络(FFN),同时融合卷积神经网络(ConvNet)的局部建模优势与动态权重的灵活性。
传统ViT的FFN仅通过“线性层+激活函数”实现特征变换,无法有效捕捉图像的局部空间依赖;后续改进方法(如卷积FFN、混合尺度卷积FFN)虽引入卷积增强局部性,但存在明显缺陷:
针对上述问题,DML的设计聚焦两大核心目标:
DML的架构遵循“通道扩展-拆分-多尺度动态卷积-通道混合-融合”的逻辑,具体流程如图2c(文档附图)所示,输入为FMA输出的特征$\bar{X} \in \mathbb{R}^{H×W×C}$($H,W$为空间尺寸,$C$为通道数),输出为融合多尺度局部特征的$\hat{X} \in \mathbb{R}^{H×W×C}$,关键步骤如下:
两个分支分别采用5×5和7×7动态深度卷积(Dynamic Depthwise Convolution),通过“全局特征感知-动态权重生成-局部特征聚合”实现自适应多尺度学习,以$\tilde{X}_1$(5×5卷积分支)为例:
动态卷积核$w$与分支特征$\tilde{X}_1$按“分组-局部窗口”方式进行元素乘累加,公式如下: $$\hat{X}1=\sum{u=-\Delta}^{\Delta} \sum_{v=-\Delta}^{\Delta} w(i, j, u, v) \otimes \tilde{X}_1(i+u, j+v, G)$$ 其中:
与传统静态卷积(如MixCFN的固定核)相比,DML的动态卷积具有两大优势:
通过5×5和7×7两个分支的互补:
class MixFFN(nn.Module):
def __init__(self, dim, num_kernels=16):
super().__init__()
self.proj_in = nn.Conv2d(dim, dim * 2, 1)
self.conv1 = DyConv(dim, kernel_size=5, groups=dim, num_kernels=num_kernels)
self.conv2 = DyConv(dim, kernel_size=7, groups=dim, num_kernels=num_kernels)
self.proj_out = nn.Conv2d(dim * 2, dim, 1)
self.norm = LayerNorm(dim, eps=1e-6, data_format="channels_first")
self.act = nn.GELU()
def forward(self, x):
shortcut = x
x = self.norm(x)
x = self.act(self.proj_in(x))
x1, x2 = torch.chunk(x, 2, dim=1)
x1 = self.act(self.conv1(x1)).unsqueeze(dim=2)
x2 = self.act(self.conv2(x2)).unsqueeze(dim=2)
x = torch.cat([x1, x2], dim=2)
x = rearrange(x, 'b c g h w -> b (c g) h w')
x = self.proj_out(x)
x = x + shortcut
return x
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
# 修改为自己的配置文件地址
model = YOLO('./ultralytics/cfg/models/26/yolo26-C2PSA_DML.yaml')
# 修改为自己的数据集地址
model.train(data='./ultralytics/cfg/datasets/coco8.yaml',
cache=False,
imgsz=640,
epochs=10,
single_cls=False, # 是否是单类别检测
batch=8,
close_mosaic=10,
workers=0,
# optimizer='MuSGD',
optimizer='SGD',
amp=False,
project='runs/train',
name='yolo26-C2PSA_DML',
)

此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。