0. 前言 本文介绍了 SCFM空间-通道特征调制器 ,其通过双路并行注意力架构,分别从空间与通道两个维度协同增强特征表达,首次在视觉状态空间模型中实现对聚类过程中高频细节损失的有效补偿,精准破解了全局建模与局部细节不可兼得的难题。
将其作为即插即用模块,轻松助力CNN、YOLO、Transformer等深度学习模型,在不增加显著计算负担的前提下,强化关键区域与关键通道的特征响应,让模型在面对复杂纹理、边缘细节或低对比度区域时,依然能够保持锐利的边界感知与卓越的重建精度。
专栏链接: 即插即用系列专栏链接,可点击跳转免费订阅!
!
!
目录 0. 前言 1. SCFM注意力简介 2. SCFM注意力原理与创新点 🧠 SCFM注意力基本原理 🎯 SCFM注意力创新点 3. 适用范围与模块效果 🍀适用范围 ⚡模块效果 4. SCFM注意力代码实现 1. SCFM注意力简介 超高清(UHD)图像修复正陷入可扩展性危机:现有模型受限于像素级操作,其计算需求难以持续。
虽然Mamba等状态空间模型(SSM)承诺线性复杂度,但其像素级串行扫描对于UHD内容的数百万像素而言仍是根本瓶颈。
我们不禁要问:必须处理每一个像素才能理解图像吗?
本文提出C²SSM——一种视觉状态空间模型,通过从像素级串行扫描转向聚类中心级串行扫描,打破了这一禁忌。
我们的核心发现是:UHD图像丰富的特征分布可以通过神经参数化的混合模型提炼为一组稀疏的语义聚类中心。
C²SSM利用这一发现,将全局建模重构为一种新颖的双路径过程:它仅对少量聚类中心进行扫描和推理,然后通过一个原则性的相似度分布将全局上下文扩散回所有像素,同时由一个轻量级调制器保留细节。
原始论文: https://arxiv.org/pdf/2602.21917 原始代码: https://github.com/5chen/C2SSM/tree/main/ 2. SCFM注意力原理与创新点 🧠 SCFM注意力基本原理 SCFM作为C²SSM架构中的关键组件,扮演着信息补偿器的角色,与主干的聚类扫描模块并行运行。
它的核心设计思想是:当聚类操作将相似的像素聚合为语义中心时,虽然大幅压缩了计算量,但图像中那些独特的、难以被聚类代表的高频细节(如锐利边缘、精细纹理)可能会在聚合过程中被平滑或忽略。
SCFM正是为解决这一问题而生,它通过一个精巧的双分支结构,在空间和通道两个维度上分别增强特征表达,确保这些关键细节能够被完整保留并传递到后续网络中。
具体而言,SCFM的实现包含以下三个关键步骤: (1) 空间注意力分支 :首先对输入特征图分别进行最大池化和平均池化,提取出空间维度上的显著信息和整体分布信息。
将这两个池化结果在通道维度上拼接后,通过一个卷积层和Sigmoid激活函数生成空间注意力权重图。
该权重图能够突出图像中哪些空间位置包含更重要的结构信息,从而引导网络关注边缘、角点等关键区域。
(2) 通道注意力分支 :为了高效提取通道间的依赖关系,该分支先将输入特征通过两个连续的卷积层进行非线性变换,接着对变换后的特征分别进行最大池化和平均池化,将空间维度压缩为1×1的全局描述符,然后通过元素级相加融合两种池化结果,最后经Sigmoid激活生成通道注意力权重。
该权重能够自适应地强调哪些通道特征对当前复原任务更为关键。
(3) 特征融合与输出 :将原始输入特征分别与空间注意力权重和通道注意力权重逐元素相乘,得到增强后的空间特征和通道特征。
最后,将这两路增强后的特征通过独立的卷积层进行变换,并相加得到最终的输出特征。
这种并行调制的设计使得空间与通道维度的增强互不干扰,各自聚焦于不同层面的信息补偿。
🎯 SCFM注意力 创新点 双路并行调制架构 :SCFM首次在视觉状态空间模型中引入空间与通道双路并行的注意力调制机制,两条支路独立计算、协同增强,实现对高频细节的精准补偿。
轻量化设计 :整个模块仅使用池化、卷积等基础操作,计算开销极小,可作为即插即用组件灵活嵌入各类模型,无需担心显著增加推理负担。
信息补偿定位精准 :SCFM被设计为与聚类主干并行运行,而非串联堆叠,这种架构使得它能够专门负责补偿聚类过程中丢失的高频信息,与主干形成完美互补。
3. 适用范围与模块效果 🍀 适用范围 SCFM适用于通用视觉领域,特别是需要在高效率全局建模与高保真局部细节之间取得平衡的视觉任务。
它尤其适合作为聚类类、下采样类或任何可能损失细节信息的模块的补充组件。
具体而言,以下场景特别适用SCFM: UHD图像复原任务 :如超分辨率、去雨、去模糊、低光增强等,这些任务对高频细节的恢复要求极高,SCFM能够有效补偿全局建模过程中的细节损失。
轻量化视觉模型 :对于追求高效率的模型,SCFM以极低的计算成本提供显著的特征增强效果,是性能与效率权衡的理想选择。
需要细节感知的任务 :如目标检测、语义分割、图像生成等,SCFM的空间注意力能够强化关键区域的响应,通道注意力能够筛选重要特征,提升模型对细节的感知能力。
⚡模块效果 结论 :SCFM的引入使模型PSNR提升0.56 dB,同时仅增加0.18M参数量,验证了其以极小计算开销实现显著性能提升的有效性。
4. SCFM注意力代码实现 以下为SCFM 注意力机制的官方pytorch实现代码,并提供了一个更轻量化的版本:
# 空间-通道特征调制器(Spatial-Channel Feature Modulator, SCFM)
# 核心设计:基于“归一化+双注意力并行调制”的架构,
# 通过LayerNorm稳定特征分布,并行引入通道注意力(Channel Attention)与空间注意力(Spatial Attention),
# 分别强化关键通道特征与空间关键区域,再经独立卷积投影融合,实现特征的精准调制与增强,
# 提升特征的辨识度与鲁棒性,且轻量化设计适配各类视觉模型
import torch
import torch.nn as nn
import numbers
from einops import rearrange
def to_3d(x):
"""将4D特征(B,C,H,W)转换为3D序列格式(B, H*W, C)"""
return rearrange(x, 'b c h w -> b (h w) c')
def to_4d(x, h, w):
"""将3D序列格式(B, H*W, C)转换回4D特征(B,C,H,W)"""
return rearrange(x, 'b (h w) c -> b c h w', h=h, w=w)
class WithBias_LayerNorm(nn.Module):
"""带偏置的LayerNorm实现"""
def __init__(self, normalized_shape):
super(WithBias_LayerNorm, self).__init__()
if isinstance(normalized_shape, numbers.Integral):
normalized_shape = (normalized_shape,)
normalized_shape = torch.Size(normalized_shape)
assert len(normalized_shape) == 1
self.weight = nn.Parameter(torch.ones(normalized_shape))
self.bias = nn.Parameter(torch.zeros(normalized_shape))
self.normalized_shape = normalized_shape
def forward(self, x):
return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + 1e-6) * self.weight + self.bias
class LayerNorm(nn.Module):
"""2D特征的LayerNorm包装器"""
def __init__(self, dim):
super(LayerNorm, self).__init__()
self.body = WithBias_LayerNorm(dim)
def forward(self, x):
h, w = x.shape[-2:]
return to_4d(self.body(to_3d(x)), h, w)
class ChannelAttention(nn.Module):
"""通道注意力模块,基于平均池化和最大池化的双池化融合"""
def __init__(self, in_planes, ratio=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.fc = nn.Sequential(
nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False),
nn.ReLU(),
nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = self.fc(self.avg_pool(x))
max_out = self.fc(self.max_pool(x))
out = avg_out + max_out
return self.sigmoid(out)
class SpatialAttention(nn.Module):
"""空间注意力模块,基于通道维度的平均池化和最大池化拼接"""
def __init__(self, kernel_size=7):
super(SpatialAttention, self).__init__()
self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=kernel_size // 2, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = torch.mean(x, dim=1, keepdim=True)
max_out, _ = torch.max(x, dim=1, keepdim=True)
x_cat = torch.cat([avg_out, max_out], dim=1)
x_out = self.conv1(x_cat)
return self.sigmoid(x_out)
class SCFM(nn.Module):
"""
空间-通道特征调制器(Spatial-Channel Feature Modulator, SCFM)
功能:并行空间注意力与通道注意力,双路径调制特征,提升特征表达精准度
核心设计(严格遵循原始论文公式(14)):
- 归一化先行:LayerNorm稳定特征分布,为注意力调制打基础
- 双注意力并行:通道注意力强化关键通道,空间注意力强化关键区域,互补增强
- 独立投影融合:双注意力调制后的特征经独立1×1卷积投影,避免信息干扰,融合更高效
- 轻量化架构:无复杂组件,计算成本低,即插即用
原始论文公式:
F_d = Conv(ReLU(Conv(F_in)))
W_c = δ(Max(F_d) + Avg(F_d))
W_s = δ(Conv([Max(F_in); Mean(F_in)]))
F_out = Conv(W_s·F_in) + Conv(W_c·F_in)
Args:
feature_dim: 输入/输出特征通道数(需保持一致)
reduction_ratio: 通道注意力的降维比率,默认16
kernel_size: 空间注意力的卷积核大小,默认7
"""
def __init__(self, feature_dim, reduction_ratio=16, kernel_size=7):
super().__init__()
# 归一化层(对应论文Norm)
self.norm = LayerNorm(feature_dim)
# 双注意力模块(并行设计)
self.chan_attn = ChannelAttention(feature_dim, ratio=reduction_ratio)
self.spat_attn = SpatialAttention(kernel_size=kernel_size)
# 独立投影层(对应论文中的Conv)
self.conv_chan = nn.Conv2d(feature_dim, feature_dim, 1, 1, 0)
self.conv_spat = nn.Conv2d(feature_dim, feature_dim, 1, 1, 0)
def forward(self, x):
"""
Args:
x: 输入特征图,形状为 (B, C, H, W)
Returns:
调制后的特征图,形状与输入相同
"""
# Step 1: LayerNorm稳定特征分布
x_norm = self.norm(x)
# Step 2: 并行双注意力调制 + 独立投影
# 通道注意力分支:W_c·F_in
x_chan = self.conv_chan(self.chan_attn(x_norm) * x_norm)
# 空间注意力分支:W_s·F_in
x_spat = self.conv_spat(self.spat_attn(x_norm) * x_norm)
# Step 3: 融合输出
return x_chan + x_spat
# 轻量化版本(减少计算量)
class SCFMLight(nn.Module):
"""
SCFM轻量化版本,适用于资源受限场景
主要改动:
- 通道注意力降维比率提升至32
- 空间注意力卷积核缩小至5
- 移除独立投影层的冗余计算(与注意力权重复用)
"""
def __init__(self, feature_dim, reduction_ratio=32, kernel_size=5):
super().__init__()
self.norm = LayerNorm(feature_dim)
self.chan_attn = ChannelAttention(feature_dim, ratio=reduction_ratio)
self.spat_attn = SpatialAttention(kernel_size=kernel_size)
# 使用单一融合卷积,进一步降低参数量
self.fusion_conv = nn.Conv2d(feature_dim * 2, feature_dim, 1, 1, 0)
def forward(self, x):
x_norm = self.norm(x)
x_chan = self.chan_attn(x_norm) * x_norm
x_spat = self.spat_attn(x_norm) * x_norm
return self.fusion_conv(torch.cat([x_chan, x_spat], dim=1))
if __name__ == "__main__":
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
# 测试标准SCFM
x = torch.randn(1, 64, 32, 32).to(device)
model = SCFM(64).to(device)
y = model(x)
print("【SCFM 测试结果】")
print(f"输入特征维度:{x.shape}")
print(f"输出特征维度:{y.shape}")
print(f"模型参数量:{sum(p.numel() for p in model.parameters()):,}")
print("=" * 60)
# 测试轻量化版本
model_light = SCFMLight(64).to(device)
y_light = model_light(x)
print(f"【SCFMLight 测试结果】")
print(f"输出特征维度:{y_light.shape}")
print(f"轻量化模型参数量:{sum(p.numel() for p in model_light.parameters()):,}")
print("=" * 60)
# 测试梯度流动
loss = y.sum()
loss.backward()
print("梯度反向传播正常,模型可训练")
结合自己的思路,可将其即插即用至任何模型,做结构创新设计!
该模块博主已成功嵌入至YOLO26模型中,可订阅博主YOLO系列算法改进或YOLO26自研改进专栏: YOLO系列算法改进专栏链接 、 YOLO26自研改进系列专栏
