DnCNN:超越高斯去噪器:用于图像去噪的深度CNN残差学习
源码、配套笔记&讲解视频,点击文末名片
- 研究背景与动机
1)什么是图像噪声?,是怎么来的?——拍照像接雨水
想象你拿个小桶去接雨水(相机传感器在接光)。
- 雨太小/天太黑:桶里水滴稀稀拉拉,抖动就明显——这就是低光/高ISO下的“沙点”。
- 桶壁不完美:材料有杂质、电子器件有热噪、读出电路有抖动,都会混进细碎杂质。
- 风一吹:压缩、传输、后期处理也可能带来块状/纹理状的“脏东西”。
最后到你手里的照片=真实画面+乱七八糟的小杂质。我们把“挑出杂质、保住真相”的过程,就叫图像去噪。
2)为什么难?——一锅米里挑沙子
- 沙子长得像米:噪声不是总呈大块大块的,它常常伪装成很细的纹理,跟真实细节黏在一起。
- 每锅都不一样:有的是夜景(噪声重),有的是日景(噪声轻);有的相机“沙子粒形大”,有的小;手机、单反、监控头各有各的“脏法”。
- 挑完不能少米:去噪不是“磨碎一切”——过度平滑就变成“水煮粥”,锐利的边缘、纹理的层次一不小心就被抹没了。
一句话:不能把“噪声”当“细节”,也不能把“细节”当“噪声”。
3)早期怎么做?——“规则手册派”
想象你有一本厨房规则手册:
- 规则1:同锅里相似的米粒应该看起来差不多;
- 规则2:边缘通常是突变,其他地方应当平滑些;
- 规则3:图像在某些变换下(比如小波/字典)会变得稀稀疏疏,容易分出“米”和“沙”。
经典方法(如各种滤波、非局部相似、稀疏表示)就是凭这些先验规则来“滤沙”。
好处:可解释、效果稳。
局限:规则写得再细,也很难涵盖所有真实世界;而且很多方法计算慢,不同“锅”(不同噪声强度/相机)还要调不同参数。
4)深度学习登场——“训练一只挑沙子的鼻子”
后来大家发现,与其写越来越厚的规则手册,不如示范成千上万锅米给模型看,让它自己总结:
- 给它看“有沙的米”和“干净的米”,
- 让它学会闻出沙子(把噪声识别出来),
- 再把沙子一把拎走,剩下就是干净米。
这就是学习型(数据驱动)去噪的直觉: - 优点:适应性强、推理快(前向一遍),特别擅长复杂细节的保留。
- 挑战:得有多样而真实的数据教它;还得小心,别把细节当噪声给“学没了”。
5)“学噪声而不是学图”——为什么更顺手?
很多现代做法(如 DnCNN 这类代表作)选择直接学习“噪声长什么样”,而不是学“干净图长什么样”。
- 直觉图:照片=干净图 + 噪声。
- 学会预测“噪声”后,用“照片−噪声”就得到干净图。
- 像在黑板上先找出粉尘再擦掉,比“把整幅画重画一遍”更省力。
- 这通常训练更稳、更快,对不同“脏法”的适应也更好。
6)为什么这个方向重要?——“相机里的一步好清洗”
去噪是图像算法的地基:
- 做超分、去模糊、增强、识别/检测/分割之前,先把噪声降下来,后面的任务都更准。
- 手机相机、医学影像、天文观测、安防监控、显微成像……全都离不开。
- 真实世界噪声很“野”:不同设备、不同光线、不同处理链——这逼着算法从“实验室好看”走向“野外也可靠”。
7)今天还在研究什么?——三道关
- 真实噪声建模:不是只会应付“教科书里的高斯噪声”,而是能打得过手机/相机/压缩带来的复合噪声。
- 细节与干净的平衡:既要干净、又要纹理不糊、边缘不粘;在主观观感和客观指标之间拿捏火候。
- 泛化与效率:一个模型尽量适配多设备多场景,同时在移动端/低算力也能跑得动。
8)把它记住的“顺口溜”
- 噪声像沙:来源多样、粒形多变、容易和细节混。
- 老法靠规:规则清晰但覆盖有限、速度慢。
- 新法靠学:看海量示例,学会“闻沙子”。
- 先闻再拎:学噪声→减掉噪声,比重画全图更省力。
- 地基越稳,楼越高:去噪好,后续任务才好。
- 核心创新点
总结:DnCNN不是去“重画整幅画”,而是先把脏东西(噪声)找出来,再一把拎走。它的几招组合拳让训练更稳、效果更好、泛化更强。
2.1 学“噪声残差”而不是学“干净图”
- 思路:输入是噪声图 y,目标不是直接预测干净图 x,而是预测“噪声” v。最后用 x=y−v^
- 直觉:找出粉尘再擦掉,比“把整张黑板重画一遍”更省力、更易收敛。论文里把这事叫残差学习(Residual Learning)。
2.2 残差学习 × 批量归一化(BN)
- 创新点:在去噪这个任务里,把残差学习和BN放在一起,训练更快更稳,并且效果更好(作者强调此前在CNN去噪里几乎没人系统用BN)。
- 类比:残差像“嗅觉”让模型先聚焦噪声,BN像“通风系统”让每层的输入分布更稳定;
- 论文证据:有对比曲线显示“残差+BN”的组合收敛更快、PSNR 更高;作者还指出两者是相辅相成而不是单向加成。
2.3 “不裁不缩”:全卷积深层架构 + 3×3 卷积 + 无池化
- 结构:首层 Conv+ReLU,中间多层 Conv+BN+ReLU,末层 Conv 输出残差;全程不做池化,靠层数堆叠扩大感受野。
- 直觉:像用多次“细刷子(3×3)”反复拂去灰尘,而不是一次粗糙大扫帚;不池化就不丢分辨率,细节不“糊”。
- 论文里明确了层次与感受野设计逻辑(感受野≈有效补丁尺寸),在σ=25时选了约17层以匹配主流方法的有效感受范围。
2.4 “边缘不花”:简单零填充,边界无伪影
- 以往很多方法要做复杂的“对称填充/多阶段填充”,DnCNN直接在卷积前零填充,却没有产生难看的边界条纹。
- 含义:更简洁的工程方案,同时保持视觉质量。
2.5 “一鱼三吃”的统一视角:把SISR、JPEG去块都当‘通用去噪’
- 关键洞见:只要把“残差”理解成“观测与理想的差”,超分辨率(SISR)和JPEG去块都能被写成“去掉残差”的同一框架里。
- 结果:一个模型就能同时搞定盲高斯去噪 + 多倍率SISR + 多质量JPEG去块。这让部署、维护、参数管理都更轻
2.6 “不用先猜噪声”:单模型盲去噪
- 做法:训练时覆盖一个噪声范围(如 [0,55]),测试时无需预估σ,直接上模型。
- 好处:鲁棒、方便、少出错(避免噪声估计误差的连锁反应)。
2.7 “有来有回”——与TNRD的理论关联
- DnCNN可以被解释为单阶段TNRD的泛化:用ReLU替代影响函数、加深网络、引入BN,并以预测残差为目标。
- 意义:不仅是“工程上好使”,也能在优化视角下讲清为什么这样有效。
2.8 “跑得快,还更准”:指标与视觉双提升
- 在固定噪声的高斯去噪上,DnCNN超过BM3D、WNNM、TNRD等传统与判别式强基线;在盲去噪上,单模型也能优于这些按噪声等级训练的模型。
- 同时受益于GPU并行,推理速度与落地友好度兼顾。
- 模型的网络结构
3.1 层级组成(对应你图里的三种色块)
- 首层:Conv + ReLU
- 卷积核:3×3;通道数:c∈{1,3};输出通道=64。
- 作用:把原图提到64张特征图,为后续表征打底。
- 中间层(第2 ~ 第D−1层):Conv + BN + ReLU(重复堆叠)
- 每层卷积核:3×3,输入/输出通道均为64;卷积后接批量归一化(BN),再接ReLU。
- 作用:逐层“剥离”噪声模式,同时用BN稳住特征分布、加速训练。
- 末层:Conv(无激活)
- 卷积核:3×3,输出通道=c(灰度=1,彩色=3)。
- 作用:把64通道特征线性还原成残差图像(噪声图)。
与很多低级视觉CNN不同,DnCNN全程不使用池化;为保持尺寸一致,各层卷积前做零填充(zero padding),实测不会产生边界伪影。
3.2 深度、感受野与“有效补丁”
- 过滤器固定用 3×3,当深度为 D(不含最后重建步)时,感受野约为 (2D+1)×(2D+1)。
- 论文根据主流去噪“有效补丁”大小来选深度:
- DnCNN-S(定噪声):D≈17(感受野≈35×35);
- DnCNN-B/3(盲去噪/一体式三任务):加深到20层。
3.3 前向数据流(和你的图一一对应)
Noisy y
→ Conv+ReLU(提特征,64通道)
→ [Conv+BN+ReLU] × (D−2)(反复细化、稳态分布)
→ Conv(线性重建)
→ Residual v^(噪声图)
→ Clean x=y−v^(得到干净图)。