





























本文介绍了高效判别频域前馈网络(EDFFN),并将其集成到YOLO26中。EDFFN是为解决图像复原中局部信息表征不足和频域计算成本过高问题而提出的。传统方法存在SSM全局信息偏向性和频域FFN高计算成本的问题,EDFFN通过将频域操作位置从FFN中间层迁移到末端,降低了计算成本并保留了性能。其结构包括特征投影与激活、降维与频域转换、判别性频域筛选、逆变换与特征融合。我们将EDFFN集成到YOLO26,注册并配置yaml文件,实验表明改进后的模型有良好表现。
文章目录: YOLO26改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总
专栏链接: YOLO26改进专栏

卷积神经网络(CNN)和视觉变换器(Vision Transformers,ViT)在图像复原任务中都取得了优异的性能。虽然 ViT 在有效捕捉长距离依赖关系和输入特征方面通常优于 CNN,但其计算复杂度会随着图像分辨率的提高而呈二次增长,这一限制阻碍了其在高分辨率图像复原中的实际应用。
本文提出了一种简单而有效的视觉状态空间模型(EVSSM)用于图像去模糊,充分利用了状态空间模型(SSM)在处理视觉数据方面的优势。与现有方法采用多个固定方向扫描来提取特征而导致计算成本显著增加不同,我们设计了一种高效的视觉扫描模块,在每个基于 SSM 的子模块前引入多种几何变换,从而在保持高效率的同时捕捉有用的非局部信息。
此外,为了更有效地提取和表示局部信息,我们还提出了一种基于频域的高效判别前馈网络(EDFFN),能够准确估计图像中对清晰图像复原有用的频率信息。
大量实验结果表明,所提出的 EVSSM 在多个基准数据集和真实图像上均优于现有最先进方法,展现出良好的性能表现。
论文地址:论文地址
代码地址:代码地址
Efficient Discriminative Frequency Domain-based Feedforward Network(高效判别频域前馈网络),是该研究为解决图像复原中“局部信息表征不足”与“频域计算成本过高”问题而提出的核心组件之一。
EDFFN的提出主要针对两类关键问题:
| EDFFN的核心创新是调整频域操作的位置,从“FFN中间层”迁移到“FFN末端”,具体逻辑如下: | 对比维度 | 传统DFFN(FFTformer) | 改进后EDFFN(本文) |
|---|---|---|---|
| 频域操作位置 | FFN中间层(大通道特征) | FFN末端(通道数=输入特征) | |
| 通道数规模 | 输入特征的3~6倍 | 与输入特征一致(如48通道) | |
| FFT计算成本 | 高(大通道特征耗时) | 低(小通道特征高效) | |
| 量化矩阵学习 | 基于冗余通道,信息利用率低 | 基于紧凑通道,聚焦关键信息 |
这一调整的本质是:利用FFN“先升维增强表征、后降维压缩信息”的特性,在降维后的紧凑特征上执行频域筛选——既避免了大通道FFT的冗余计算,又能精准捕捉对复原有用的频域信息(如高频细节、低频结构)。
结合论文图1(d)及文字描述,EDFFN的具体结构的流程如下,核心是“线性变换→激活→频域筛选→输出”的闭环:
class EDFFN(nn.Module):
def __init__(self, dim, ffn_expansion_factor=2, bias=False):
super(EDFFN, self).__init__()
hidden_features = int(dim * ffn_expansion_factor)
self.patch_size = 8
self.dim = dim
self.project_in = nn.Conv2d(dim, hidden_features * 2, kernel_size=1, bias=bias)
self.dwconv = nn.Conv2d(hidden_features * 2, hidden_features * 2, kernel_size=3, stride=1, padding=1,
groups=hidden_features * 2, bias=bias)
self.fft = nn.Parameter(torch.ones((dim, 1, 1, self.patch_size, self.patch_size // 2 + 1)))
self.project_out = nn.Conv2d(hidden_features, dim, kernel_size=1, bias=bias)
def forward(self, x):
x_dtype = x.dtype
x = self.project_in(x)
x1, x2 = self.dwconv(x).chunk(2, dim=1)
x = F.gelu(x1) * x2
x = self.project_out(x)
b, c, h, w = x.shape
h_n = (8 - h % 8) % 8
w_n = (8 - w % 8) % 8
x = torch.nn.functional.pad(x, (0, w_n, 0, h_n), mode='reflect')
x_patch = rearrange(x, 'b c (h patch1) (w patch2) -> b c h w patch1 patch2', patch1=self.patch_size,
patch2=self.patch_size)
x_patch_fft = torch.fft.rfft2(x_patch.float())
x_patch_fft = x_patch_fft * self.fft
x_patch = torch.fft.irfft2(x_patch_fft, s=(self.patch_size, self.patch_size))
x = rearrange(x_patch, 'b c h w patch1 patch2 -> b c (h patch1) (w patch2)', patch1=self.patch_size,
patch2=self.patch_size)
x=x[:,:,:h,:w]
return x.to(x_dtype)
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
# 修改为自己的配置文件地址
model = YOLO('./ultralytics/cfg/models/26/yolo26-C2PSA_EDFFN.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', # 使用MuSGD优化器,会报错
optimizer='SGD',
amp=False,
project='runs/train',
name='yolo26-C2PSA_EDFFN',
)

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