3. 经典去噪网络架构:从DnCNN到U-Net,再到Transformer
去噪网络的设计,说白了就是一场“信息保真”与“噪声抑制”的博弈。我这些年调参下来,发现一个规律:没有最好的架构,只有最合适的场景。从早期的DnCNN到后来的U-Net,再到如今大火的Transformer,每一步演进都解决了特定的痛点。
今天咱们就捋一捋这三类核心架构的设计思路。我会结合自己踩过的坑,帮你理解它们为什么这么设计,以及什么时候该选谁。
3.1 DnCNN:把“残差”玩明白的奠基者
DnCNN是2016年提出的,当时深度学习去噪刚起步。它的核心思路其实很简单:不直接学干净图像,而是学噪声。
你想想看,一张带噪图像 y = x + n,如果我们让网络直接输出 x,那网络既要学图像结构,又要学噪声分布,任务太杂了。但如果我们让网络输出 n,那它只需要专注一件事——把噪声揪出来。这就是残差学习的精髓。
核心设计要点:
- 残差学习:输出是噪声图,输入减去噪声得到干净图
- 批量归一化(BN):加速训练,防止梯度消失
- 感受野控制:用3×3小卷积核堆叠,深度决定感受野
我记得第一次用DnCNN做实验时,发现它对于高斯白噪声效果出奇的好。但换到真实噪声(比如手机拍照的噪点)就有点力不从心了。为什么?因为真实噪声不是独立同分布的,它跟信号强度有关。DnCNN的假设太理想了。
我的经验:如果你处理的是合成噪声(比如高斯、泊松),DnCNN是个不错的起点。但如果是真实场景,建议直接上U-Net或更复杂的结构。
3.2 U-Net:编码-解码的对称之美
U-Net最早是用于医学图像分割的,但后来发现它在去噪任务上也异常好用。它的设计哲学是:先压缩再还原,同时保留细节。
编码器部分,通过下采样逐步提取高层语义特征。解码器部分,通过上采样恢复空间分辨率。最关键的是跳跃连接——把编码器的浅层特征直接拼到解码器的对应层。这样一来,网络既能利用全局上下文,又不会丢失边缘、纹理等细节。
我曾经在项目里处理过一张星空照片,DnCNN把星星都抹糊了。换成U-Net之后,星星的轮廓保留得非常好。这就是跳跃连接的功劳——它让梯度可以直接回传到浅层,避免了细节丢失。
避坑指南:U-Net的参数量比DnCNN大不少。我曾经在嵌入式设备上部署时,发现推理速度跟不上。后来把通道数砍了一半,效果还能接受。所以别盲目追求大模型,先看看你的硬件能不能扛得住。
U-Net的另一个变体是残差U-Net,在跳跃连接里也加入了残差块。我个人习惯在噪声强度较高时用这个版本,收敛更快。
3.3 Transformer:自注意力带来的全局视野
Transformer原本是NLP领域的明星,后来被ViT(Vision Transformer)带到了图像领域。去噪任务里,Transformer的优势在于自注意力机制——它能让每个像素都看到整张图的信息。
你想想看,CNN的卷积核只能看到局部区域(比如3×3或5×5),要扩大感受野就得堆层数。而Transformer的注意力机制,一步到位,直接建立全局依赖。这对于处理大面积的均匀噪声(比如雾状噪点)特别有效。
但Transformer也有它的毛病:计算量太大。一张256×256的图,直接做全局注意力,复杂度是O(n²),n是像素数。这谁受得了?
常见的优化策略:
- 窗口注意力:只在局部窗口内做注意力(如Swin Transformer)
- 轴向注意力:分别沿行和列做注意力,降低复杂度
- 混合架构:CNN提取局部特征 + Transformer建模全局关系
我记得去年做一个视频去噪项目,用了纯Transformer模型,结果一张1080p的图要跑好几秒。后来换成CNN+Transformer的混合结构,速度提升了10倍,效果还差不多。所以别迷信“纯”Transformer,混合架构往往更实用。
3.4 三种架构的对比与选择
说了这么多,到底该选哪个?我整理了一张对比表,方便你快速决策:
| 架构 | 核心优势 | 主要局限 | 推荐场景 |
|---|---|---|---|
| DnCNN | 简单、轻量、训练快 | 对真实噪声泛化差 | 合成噪声、快速原型验证 |
| U-Net | 细节保留好、结构灵活 | 参数量较大 | 真实噪声、医学/天文图像 |
| Transformer | 全局建模、处理大面积噪声 | 计算量大、数据需求高 | 高分辨率、复杂噪声模式 |
我个人习惯是:先小后大,先简后繁。先用DnCNN跑个基线,看看效果。如果细节丢失严重,换U-Net。如果噪声有长程相关性(比如条纹噪声),再考虑Transformer。
3.5 架构演进路线图
下面这张图总结了从DnCNN到Transformer的演进逻辑,以及每个阶段解决的核心问题:
3.6 实战建议:如何选择你的第一个架构
如果你是刚入门,我建议从U-Net开始。为什么?
- 代码成熟:网上有大量现成的实现,改改就能用
- 效果稳定:在大多数去噪任务上,U-Net都能给出不错的结果
- 容易调试:结构直观,哪里出问题一眼就能看出来
等你把U-Net调明白了,再去看DnCNN和Transformer,你会发现很多设计思想是相通的。比如DnCNN的残差学习,在U-Net里也能用;Transformer的注意力机制,也可以作为U-Net的“插件”来增强性能。
一个小技巧:不管用哪种架构,先把数据预处理做好。我见过太多人花几周调网络结构,结果发现是数据没归一化导致的。先把基础打牢,再谈架构创新。