YOLO11 改进 – 即插即用 _ SMFA自调制特征聚合:双分支协同破解特征冗余,增强多尺度目标感知

前言

本文介绍了轻量级自调制特征聚合网络SMFANet及其核心模块SMFA在YOLOv11中的结合应用。为解决基于Transformer的图像恢复方法计算开销大、捕获局部细节能力弱的问题,提出SMFA模块,通过EASA分支建模非局部信息,LDE分支捕获局部细节,还提出PCFN精炼特征。我们将SMFA集成进YOLOv11,实验表明,SMFANet系列在重建性能与计算效率上取得更佳平衡,改进后的YOLOv11也取得了良好实验结果。

文章目录: YOLOv11改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总

专栏链接: YOLOv11改进专栏

文章目录

[TOC]

介绍

摘要

基于Transformer架构的图像恢复方法凭借其自注意力(Self-Attention, SA)机制在挖掘非局部信息方面的独特优势,在高分辨率图像重建任务中展现出显著的性能提升。然而,传统Transformer中的点积自注意力计算机制存在巨大的计算开销,严重制约了其在低功耗设备中的实际部署应用。此外,自注意力机制固有的低通滤波特性限制了其对局部细节信息的捕获能力,导致重建结果往往呈现过度平滑的趋势。针对上述技术挑战,本研究提出了一种创新的 自调制特征聚合模块 (Self-Modulation Feature Aggregation, SMFA),通过协同整合局部与非局部特征交互机制来实现更精确的图像重建效果。具体而言,SMFA模块引入了一种高效的自注意力近似计算分支(Efficient Approximation of Self-Attention, EASA)用于建模非局部依赖关系,同时采用局部细节估计分支(Local Detail Estimation, LDE)专门负责捕获精细的局部结构信息。此外,我们进一步设计了基于部分卷积(Partial Convolution)的前馈网络架构(PCFN),用于精细化处理由SMFA模块提取的特征表示。大量实验验证结果表明,所提出的 SMFANet 系列模型在多个公共基准数据集上实现了重建性能与计算效率之间的最优平衡。特别地,与×4倍超分辨率下的SwinIR-light模型相比,SMFANet+在五个标准测试集上的平均性能提升达到0.14dB,推理运行速度提升约10倍,而模型计算复杂度(以FLOPs衡量)仅为其43%左右。相关源代码及预训练模型已全面开源,访问地址为: https://github.com/Zheng-MJ/SMFANet

文章链接

论文地址: 论文地址

代码地址: 代码地址

基本原理:

SMFANet(轻量级自调制特征聚合网络)是一种专为高效图像超分辨率(Image Super-Resolution, SR)设计的深度学习模型。其主要目标是通过有效的特征提取和聚合技术,在保持较低计算复杂度的同时,提升图像重建的质量。以下是对SMFANet及其核心组件自调制特征聚合模块(SMFA)的详细介绍。

SMFANet的整体架构

SMFANet的架构主要由以下几个部分组成:

  1. 输入层

    • 接收低分辨率图像作为输入。
  2. 浅层特征提取模块

    • 使用一个3×3的卷积层提取输入图像的浅层特征。这一层的作用是捕捉图像的基本特征,为后续的特征处理打下基础。
  3. 特征调制块(FMBs)

    • 浅层特征经过特征调制块进行处理。每个特征调制块由两个主要组件组成:

      • 自调制特征聚合模块(SMFA) :负责整合局部和非局部特征。

      • 部分卷积前馈网络(PCFN) :进一步精炼特征,增强特征的代表性。

  4. 图像重建模块

    • 经过特征调制块处理后的特征被送入图像重建模块。该模块使用3×3卷积层和PixelShuffle层进行上采样,最终生成高分辨率图像。

SMFA

自调制特征聚合模块(Self-Modulation Feature Aggregation, SMFA)是SMFANet中的核心组件,旨在有效地整合局部和非局部特征,以提升图像超分辨率(Image Super-Resolution, SR)的性能

SMFA模块主要由两个分支组成:

  1. EASA(Efficient Adaptive Self-Attention)分支

    • 该分支专注于捕捉非局部信息。通过全局特征的调制,EASA能够识别图像中的重要结构和模式。
  2. LDE(Local Detail Estimation)分支

    • LDE分支则负责提取局部特征,确保在重建过程中保留细节信息。它通过并行处理来捕捉图像的局部特征。

SMFA模块的工作流程可以分为以下几个步骤:

  1. 特征输入

    • SMFA接收来自浅层特征提取模块的输入特征 Fin。
  2. 通道扩展

    • 输入特征通过1×1卷积进行通道扩展,以增加特征的维度,便于后续处理。
  3. 特征分割

    • 扩展后的特征被分割为两部分,分别送入EASA和LDE分支进行处理。
  4. EASA分支处理

    • 在EASA分支中,首先对输入特征进行下采样,以获取低频内容。接着,计算输入特征的全局方差,以调制处理后的低频特征。这一过程使得EASA能够优先关注信息丰富的区域,从而增强对非局部结构信息的探索。
  5. LDE分支处理

    • LDE分支使用卷积层并行处理输入特征,以捕捉局部细节。通过这种方式,LDE能够有效地提取图像中的细微特征,确保重建过程中不会丢失重要的局部信息。
  6. 特征融合

    • EASA和LDE分支的输出特征通过元素级相加进行融合,形成代表性的输出特征 Fρ。这一融合过程确保了网络能够同时利用局部和非局部信息。
  7. 输出特征

    • 最终,经过1×1卷积处理的输出特征被送入后续的特征调制块(FMB)或图像重建模块,进行进一步处理和高分辨率图像的生成。

核心代码

class SMFA(nn.Module):
    def __init__(self, dim=36):
        super(SMFA, self).__init__()
        self.linear_0 = nn.Conv2d(dim,dim*2,1,1,0)
        self.linear_1 = nn.Conv2d(dim,dim,1,1,0)
        self.linear_2 = nn.Conv2d(dim,dim,1,1,0)

        self.lde = DMlp(dim,2)

        self.dw_conv = nn.Conv2d(dim,dim,3,1,1,groups=dim)

        self.gelu = nn.GELU()
        self.down_scale = 8

        self.alpha = nn.Parameter(torch.ones((1,dim,1,1)))
        self.belt = nn.Parameter(torch.zeros((1,dim,1,1)))

    def forward(self, f):
        _,_,h,w = f.shape
        y, x = self.linear_0(f).chunk(2, dim=1)
        x_s = self.dw_conv(F.adaptive_max_pool2d(x, (h // self.down_scale, w // self.down_scale)))
        x_v = torch.var(x, dim=(-2,-1), keepdim=True)
        x_l = x * F.interpolate(self.gelu(self.linear_1(x_s * self.alpha + x_v * self.belt)), size=(h,w), mode='nearest')
        y_d = self.lde(y)
        return self.linear_2(x_l + y_d)    

实验

脚本

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO

if __name__ == '__main__':
#     修改为自己的配置文件地址
    model = YOLO('/root/ultralytics-main/ultralytics/cfg/models/11/yolov11-SMFA.yaml')
#     修改为自己的数据集地址
    model.train(data='/root/ultralytics-main/ultralytics/cfg/datasets/coco8.yaml',
                cache=False,
                imgsz=640,
                epochs=10,
                single_cls=False,  # 是否是单类别检测
                batch=8,
                close_mosaic=10,
                workers=0,
                optimizer='SGD',
                amp=True,
                project='runs/train',
                name='SMFA',
                )

结果

THE END