FeMaSR(Frequency-aware Multi-scale Super-Resolution)的核心思路是在超分辨率重建中引入频域处理。传统超分网络通常通过堆叠卷积和残差块来学习低分辨率到高分辨率的映射,但卷积核的局部感受野和空间域损失函数会让输出偏向平滑,难以有效恢复高频纹理。FeMaSR的做法是先把中间特征变换到傅里叶域,对振幅和相位进行单独调制,再逆变换回空间域,使网络具备显式的频率感知能力。

这种设计的直接好处是频率分量的调整不再依赖深层非线性映射,而是通过复数域中的逐元素乘法完成。振幅反映了不同频率成分的能量强弱,相位决定了边缘和纹理的位置。将两者分开处理,可以避免空间域操作中高频与低频特征的相互干扰。下面从频率感知的必要性、模块实现、训练策略和工程落地几个角度展开。
频率感知为什么成为超分的关键
超分辨率重建是一个典型的病态逆问题。低分辨率图像在降采样过程中丢失了大量高频信息,而卷积网络在拟合映射时天然存在低频偏好。很多模型虽然通过注意力机制扩大感受野,但对频域结构仍缺乏直接控制。FeMaSR将特征图通过FFT映射到频域后,不同频率分量可以被独立加权,使网络在训练时更容易学习到高频细节。相比空间域中常见的残差学习和通道注意力,频域操作天然具备全局交互能力,这是空间局部卷积难以替代的。
从信号处理角度看,图像的空域像素与频域系数是等价表示,但频域系数具有稀疏性和全局性。自然图像的能量主要集中在低频,而细节纹理分布在高频。空间域卷积提取特征的感受野受限,即使堆叠很多层,高频特征的传播仍然容易衰减。傅里叶域特征调制相当于给网络提供了一条全局频域捷径:任何空间位置的纹理都能通过频谱系数一次性交互,不需要逐层传递。对于规则纹理、重复图案和细小边缘,这种全局频域建模尤其有效。
现有超分方法如RCAN、SwinIR等在空间域采用通道注意力和窗口自注意力,虽然性能强,但频域信息利用不够显式。FeMaSR的贡献在于补充了频率分支,与空间分支并行或串联,让网络同时维护空域局部表示和频域全局表示。频率分支可以看作一种可学习的频谱滤波器,它不直接替换空间卷积,而是作为补充结构,帮助网络在保持空间细节的同时增强频域控制能力。
傅里叶域特征调制的模块设计
模块的输入是空间特征图 x,形状为 B×C×H×W。首先使用二维快速傅里叶变换 torch.fft.rfft2 得到复数频谱。因为输入是实数,rfft2 只保留一半频率分量,减少计算量。接着将复数频谱拆成振幅和相位:振幅用绝对值计算,相位用角度计算。可学习参数分别对振幅做缩放、对相位做平移或旋转。振幅缩放可以直接用 sigmoid 或 softplus 限制范围,防止数值过大;相位调整需要小心,因为相位是周期量,通常使用一个可学习复数权重 W 与频谱相乘,而不是直接加偏置。这样可以保持相位在周期范围内稳定更新。
import torch
import torch.nn as nn
class FourierModulation(nn.Module):
def __init__(self, channels):
super().__init__()
# 振幅与相位各分配一个可学习权重
self.amp_weight = nn.Parameter(torch.ones(1, channels, 1, 1))
self.pha_weight = nn.Parameter(torch.zeros(1, channels, 1, 1))
def forward(self, x):
# x: [B, C, H, W]
fft_feat = torch.fft.rfft2(x, norm='ortho')
amp = torch.abs(fft_feat)
pha = torch.angle(fft_feat)
# 对振幅做缩放,对相位做小幅平移
amp = amp * torch.sigmoid(self.amp_weight)
pha = pha + torch.tanh(self.pha_weight) * 0.1
# 重建复数特征并逆变换
modulated = torch.polar(amp, pha)
out = torch.fft.irfft2(modulated, s=x.shape[-2:], norm='ortho')
return out
逆变换前可以用 torch.polar 将调制后的振幅和相位组合回复数,再用 torch.fft.irfft2 恢复空间特征。恢复后的特征与原始输入按残差方式相加。这样做既能保持主干特征稳定,又能引入频域增强。实际使用时,频域模块可以插入到多个尺度,与空间注意力交叉布置。例如在低分辨率特征阶段使用全局频域调制,在高分辨率阶段使用局部空间卷积,兼顾计算效率和重建质量。
复杂度方面,FFT 的时间复杂度为 O(N log N),对高分辨率特征图做大尺寸FFT仍有一定成本。因此工程上通常只在低分辨率特征阶段使用,或采用分组FFT降低通道计算量。还可以使用 rfft2 代替完整 fft2,因为输入是实数,频谱对称,只计算一半频率,计算量和内存占用都能减少约一半。
训练策略与损失函数设计
仅依靠空间域 L1 或 L2 损失训练,频域分支容易退化为恒等映射,无法发挥频率调制的作用。常见的做法是联合空域损失和频域损失。空域损失约束像素一致,频域损失约束频谱振幅与相位,可以平衡结构保真与纹理恢复。频域损失直接作用于 rfft2 之后的复数频谱,让网络在频率域也保持与目标图像的一致性。
def frequency_loss(pred, target):
pred_fft = torch.fft.rfft2(pred, norm='ortho')
target_fft = torch.fft.rfft2(target, norm='ortho')
amp_loss = torch.nn.functional.l1_loss(
torch.abs(pred_fft), torch.abs(target_fft)
)
pha_loss = torch.nn.functional.l1_loss(
torch.angle(pred_fft), torch.angle(target_fft)
)
return amp_loss + 0.5 * pha_loss
损失权重需要调参。频域损失权重过大可能引入振铃伪影,因为频域优化对相位噪声敏感。训练前期可以设置较小权重,后期逐步增加;或者使用多阶段训练,先训练空间分支,再冻结后训练频域分支。数据增强方面,随机裁剪、翻转和旋转都要保证频域一致性,旋转在频域同样旋转,这一点在实现时需要注意。否则频域损失会与数据增强产生矛盾,影响收敛。
优化器通常使用 Adam,初始学习率 2e-4,配合余弦退火。批大小受限于显存,可考虑梯度累积。模型评估除了 PSNR 和 SSIM,还可关注 LPIPS 等感知指标,因为频域增强对感知质量影响更明显。对于训练集,建议混合同一场景的不同降质方式,例如双三次降采样和高斯模糊降采样,这样网络能学到更鲁棒的频域调制模式。
工程落地与性能对比思考
傅里叶域特征调制带来的性能提升与计算开销需要权衡。在轻量级超分模型上,可以先在小尺度特征上加入一个频域分支,验证 PSNR 是否提升。若效果不明显,需要检查归一化:FFT 前最好对特征做层归一化或实例归一化,避免数值范围过大导致梯度不稳定。另外,复数运算在移动端和边缘设备上的支持情况需要提前评估,必要时可以转换为实数矩阵运算代替。
工程中的一个常见坑是频谱的直流分量集中在左上角,低频和高频分布不均匀。直接采用全局可学习权重容易忽略位置差异,可设计频段分组权重,比如将频谱按半径分为低频、中频、高频区域分别调制。这样参数量增加不大,但能提升控制粒度。另一个需要注意的点是相位损失存在周期性跳变,实际计算时可以使用相位差的余弦距离或直接约束实部和虚部,避免角度直接相减带来的不连续性。
相比纯空间域方法,FeMaSR 在重复纹理和规则边缘上通常有更好的视觉效果,但对不规则噪声可能更敏感。实际部署时可将频域模块与空间注意力结合,形成互补。移动端部署需要将 rfft2 替换为定点实现或使用硬件加速 FFT 库,并注意复数运算的内存占用。总体来看,傅里叶域特征调制为超分网络提供了一种轻量且有效的频率感知能力,适合作为空间域方法的补充模块。