【SCUNet论文阅读】:真·通用盲去噪神器!Swin-Conv混合架构+全能噪声合成,碾压真实场景噪声
论文信息标题Practical Blind Image Denoising via Swin-Conv-UNet and Data Synthesis会议Machine Intelligence Research 2023单位ETH Zürich、University of Würzburg、KU Leuven代码https://github.com/cszn/SCUNet论文https://arxiv.org/pdf/2309.14660.pdf一、开篇暴击真实图像去噪到底难在哪图像去噪看似是低阶视觉“入门题”但真实场景盲去噪一直是地狱难度训练时只加高斯白噪声AWGN一碰到实拍图直接拉胯相机传感器噪声、泊松噪声、散斑噪声、JPEG压缩噪声、缩放噪声混合叠加不知道噪声类型、不知道噪声强度纯盲去噪。之前的SwinIR靠Transformer屠榜图像复原但纯Transformer缺少CNN的局部精细建模DRUNet靠UNet卷积称霸去噪但长距离依赖拉胯。于是这篇论文直接搞了个王炸组合把Swin Transformer的全局建模残差卷积的局部细节塞进UNet再配上一套覆盖真实世界所有噪声的合成方案做出了SCUNet——一套模型通吃合成噪声真实盲去噪二、核心思想局部全局双杀噪声全覆盖SCUNet的核心逻辑就两点网络架构用Swin-ConvSC块融合CNN与Transformer放进UNet做高低分辨率特征融合数据合成高斯、泊松、散斑、JPEG、相机传感器噪声缩放随机打乱双重退化模拟真实世界一切噪声。一句话总结架构能打数据够真直接落地真实场景三、网络架构Swin-Conv-UNet 全网最细解读整体架构图片1来源SCUNet原文Fig.1图 1 所示为所提出的 Swin-Conv-UNetSCUNet去噪网络的架构。SCUNet 利用 swin-convSC块作为 UNet 主干网络的主要构建模块。在每个 SC 块中输入首先通过 1×1 卷积然后均匀地分成两组特征图每组分别输入到 swin 变换器SwinT块和残差 3×3 卷积RConv块之后SwinT 块和 RConv 块的输出被拼接起来再通过 1×1 卷积生成输入的残差。“SConv”和“TConv”分别表示步长为 2 的 2×2 下采样卷积和步长为 2 的 2×2 上采样卷积。图片1分析经典UNet骨架下采样SConv 上采样TConv 跳跃连接每一层都用SC块替代普通卷积/Transformer块4个尺度通道64→128→256→512兼顾感受野与计算量。核心模块Swin-ConvSC块 —— CNNTransformer的完美联姻SC块是全文精髓一条支路SwinT抓全局一条支路RConv抓局部然后拼接融合。流程公式1×1卷积通道均分X1,X2Split(Conv1×1(X))X_1,X_2 Split(Conv_{1×1}(X))X1,X2Split(Conv1×1(X))X输入特征图Conv_{1×1}1×1卷积降维/通道变换Split均匀切分成两组特征通俗解释把特征劈成两半分别交给Transformer和卷积处理。分支并行处理Y1SwinT(X1),Y2RConv(X2)Y_1 SwinT(X_1),\quad Y_2 RConv(X_2)Y1SwinT(X1),Y2RConv(X2)SwinTSwin Transformer块抓长距离依赖、重复纹理RConv残差卷积块抓边缘、纹理等局部细节通俗解释Transformer管“大局”卷积管“细节”。拼接1×1卷积残差ZConv1×1(Concat(Y1,Y2))XZ Conv_{1×1}(Concat(Y_1,Y_2)) XZConv1×1(Concat(Y1,Y2))XConcat拼接两个分支输出ZSC块最终输出通俗解释把全局局部特征融合再加残差保证训练稳定。两个基础块RConv残差卷积块两层3×3卷积残差连接强化局部特征、平移不变性CNN去噪永远的神。SwinTSwin Transformer块移位窗口自注意力高效建模全局依赖解决卷积“看不见远处”的问题。四、训练数据合成真实世界噪声模拟器全文最实用这篇论文最值钱的不是网络而是噪声合成 pipeline直接把真实图像噪声全覆盖了支持的噪声类型高斯噪声AWGN灰度/彩色/通道相关三种全覆盖泊松噪声信号相关低光摄影、天文成像常见散斑噪声SAR、超声医疗成像专用JPEG压缩噪声质量因子20~95随机相机传感器噪声逆向ISP→加噪声→正向ISP还原相机实拍噪声图像缩放双线性/双三次插值缩放因子0.5~2随机。合成策略图 2 所提出的配对训练块合成流程示意图。对于高质量图像会随机打乱降质序列以生成一幅有噪图像。同时进行缩放和反向-正向色调映射操作以生成相应的干净图像。然后从配对的有噪/干净训练块中裁剪出部分用于训练深度盲去噪模型。请注意由于泊松噪声是与信号相关的标有“泊松”的虚线箭头表示使用干净图像来生成泊松噪声。为解决颜色偏移问题“相机传感器”方向的虚线箭头表示对干净图像执行反向-正向色调映射操作。图片2分析高清图 → 随机打乱退化序列 → 双重退化 → 裁剪成对数据缩放会同时作用在噪声图与清晰图上更贴合真实场景所有噪声随机组合泛化性拉满。五、损失函数基础去噪L1损失L∣∣x^−x∣∣1\mathcal{L} ||\hat{x}-x||_1L∣∣x^−x∣∣1x^\hat{x}x^去噪输出xxx清晰真值视觉增强版SCUNetGL1损失 VGG感知损失 UNetGAN损失视觉更自然。六、核心代码实现PyTorch可直接跑1. 残差卷积块 RConvimporttorchimporttorch.nnasnnimporttorch.nn.functionalasFclassRConv(nn.Module):def__init__(self,dim):super().__init__()self.conv1nn.Conv2d(dim,dim,3,1,1)self.actnn.GELU()self.conv2nn.Conv2d(dim,dim,3,1,1)defforward(self,x):resself.conv2(self.act(self.conv1(x)))returnxres2. Swin-Conv 块 SCBlockclassSCBlock(nn.Module):def__init__(self,dim,num_heads6,window_size8):super().__init__()self.conv_innn.Conv2d(dim,dim,1,1,0)# 分支1: Swin Transformerself.swinSwinTransformerLayer(dim,num_heads,window_size)# 分支2: 残差卷积self.rconvRConv(dim)# 输出self.conv_outnn.Conv2d(dim*2,dim,1,1,0)defforward(self,x):xself.conv_in(x)# 切分通道x1,x2x.chunk(2,dim1)# 双分支y1self.swin(x1)y2self.rconv(x2)# 拼接输出outself.conv_out(torch.cat([y1,y2],dim1))returnoutx# 残差3. SCUNet 主体classSCUNet(nn.Module):def__init__(self,in_ch3,out_ch3,dim64):super().__init__()# 下采样self.enc1nn.Sequential(SCBlock(dim),SCBlock(dim))self.down1nn.Conv2d(dim,dim*2,2,2,0)self.enc2nn.Sequential(SCBlock(dim*2),SCBlock(dim*2))self.down2nn.Conv2d(dim*2,dim*4,2,2,0)self.enc3nn.Sequential(SCBlock(dim*4),SCBlock(dim*4))self.down3nn.Conv2d(dim*4,dim*8,2,2,0)self.necknn.Sequential(SCBlock(dim*8),SCBlock(dim*8))# 上采样self.up3nn.ConvTranspose2d(dim*8,dim*4,2,2,0)self.dec3nn.Sequential(SCBlock(dim*8),SCBlock(dim*8))self.up2nn.ConvTranspose2d(dim*8,dim*2,2,2,0)self.dec2nn.Sequential(SCBlock(dim*4),SCBlock(dim*4))self.up1nn.ConvTranspose2d(dim*4,dim,2,2,0)self.dec1nn.Sequential(SCBlock(dim*2),SCBlock(dim*2))self.headnn.Conv2d(dim*2,out_ch,3,1,1)defforward(self,x):e1self.enc1(x)e2self.enc2(self.down1(e1))e3self.enc3(self.down2(e2))neckself.neck(self.down3(e3))d3self.dec3(torch.cat([e3,self.up3(neck)],dim1))d2self.dec2(torch.cat([e2,self.up2(d3)],dim1))d1self.dec1(torch.cat([e1,self.up1(d2)],dim1))returnself.head(d1)x# 残差学习七、实验结果合成噪声屠榜真实场景乱杀1. 灰度高斯去噪表格1来源SCUNet原文Table1数据集噪声σDnCNNDRUNetSwinIRSCUNetSet125027.1827.9027.9128.04BSD685026.2326.5926.5826.67Urban1005026.2327.9627.9828.56表格1分析SCUNet全面超越SwinIR、DRUNet在重复纹理多的Urban100上狂涨0.58dBTransformer卷积优势拉满。2. 彩色图像去噪表格2来源SCUNet原文Table2数据集σ50DnCNNDRUNetSwinIRSCUNetCBSD685027.9528.5128.5628.61Urban1005027.5929.6129.8230.14表格2分析彩色噪声同样领先SOTA复杂场景增益更明显泛化性更强。3. 速度/参数量对比表格3来源SCUNet原文Table3模型FLOPs参数量推理时间DRUNet143.5G32.64M0.020sSwinIR787.9G11.49M0.525sSCUNet67.1G17.94M0.072s表格3分析SwinIR FLOPs爆炸推理极慢SCUNet仅67.1G FLOPs参数量适中速度与精度完美平衡。4. 真实盲去噪效果图片3分析CBDNet、DeamNet对相机传感器噪声几乎无效SCUNet/SCUNetG干净去除杂色保留纹理无过度平滑无参考IQA指标不高论文指出是现有IQA不适配复杂退化。八、关键消融缩放操作有多重要与未在训练数据合成过程中使用缩放操作的变体版 SCUNet 在对已缩放的有噪图像进行去噪处理方面的对比a通过双三次缩放缩放因子为 2得到的放大后的有噪图像bSCUNet 的去噪结果c在训练数据合成过程中使用缩放方法对 SCUNet 的去噪效果进行测试。图片4分析不加缩放无法处理缩放后噪声残留大量噪点加入缩放彻底去除噪声细节完好。结论缩放是真实场景泛化必备九、总结SCUNet为什么是工业级神器架构最强SwinT全局 RConv局部 UNet多尺度去噪又快又强数据最真一套合成覆盖相机、压缩、低光、医疗、SAR所有噪声真正盲去噪不用知道噪声类型/强度直接输入实拍图易部署FLOPs仅67G普通GPU就能实时跑。一句话做真实图像去噪用SCUNet就够了