Bootstrap

图像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID

图像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID

1. 基本原理

这篇博客主要介绍几篇经典的CNN相关的图像降噪算法,其中DnCNN -> FFDNet -> CBDNet -> RIDNet -> PMRID我觉得这是一条越来越优的降噪网络主线,而SID是一个端到端的ISP网络,除了降噪还包含了demosaic等功能,因此单独列到最后。

1.1 DnCNN

Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising
这篇论文算是使用CNN进行图像降噪最为经典的算法之一,算法并不复杂,但是在PSNR的指标上超过了BM3D,该算法框架如下图所示:
在这里插入图片描述
该网络的特点主要有:

  1. 网络分为三部分,第一部分为Conv+Relu(一层),第二部分为Conv+BN+Relu(若干层),第三部分为Conv(一层),网络层数为17或者20层。
  2. 网络学习的是图像残差,也就是带噪图像和无噪图像差值,损失函数采用的MSE。
  3. 论文中强调了batch normalization的作用

1.2 FFDNet

FFDNet: Toward a Fast and Flexible Solution for CNN based Image Denoising
这篇论文是DnCNN的升级版,网络在对噪声的适应能力和计算量均要由于DnCNN,该算法网络结构如下:
在这里插入图片描述
该网络的特点主要有:

  1. 该网络的结构和DnCNN一致,但是输入输出不同,网络输入为原始带噪图像降采样获得的四张子图以及一张由用户输入的参数 σ \sigma σ生成的噪声水平图像,输出为四张降噪后的子图,通过上采样获得最终的降噪图像。使用的损失函数仍然是MSE。
  2. 由于该网络的输入中包含一个有用户控制的参数,该算法对于不同噪声的适应程度要优于DnCNN

1.3 CBDNet

Toward Convolutional Blind Denoising of Real Photographs
这篇论文算是FFDNet的再一次升级,在FFDNet中通过添加一个用户输入的噪声强度参数 σ \sigma σ,在CBDNet中通过添加一个全卷积网络来学习该参数,从而达到自适应噪声的目的,该算法的网络结构如下:
在这里插入图片描述
该网络的特点主要有:

  1. 该网络的结构分为两部分:第一部分为五层全卷积网络用于噪声估计噪声水平图,第二部分与FFDNet不同,为带残差的UnNet,用于降噪。

  2. 设计了非对称损失函数,目的主要是为了消除非对称敏感性,所谓非对称敏感性指的像BM3D和FFDNet这样的降噪算法,输入降噪参数 σ \sigma σ较小时,降噪效果较差,输入降噪参数 σ \sigma σ较大时,虽然纹理有损失,但是降噪效果仍然比较好。给定像素 i i i的估计水平 σ ^ ( y i ) \hat{\sigma}(y_i) σ^(yi)和真实值 σ ( y i ) \sigma(y_i) σ(yi),当 σ ^ ( y i ) < σ ( y i ) \hat{\sigma}(y_i)<\sigma(y_i) σ^(yi)<σ(yi)时,应该对MSE引入更多的惩罚,因此: L asymm  = ∑ i ∣ α − I ( σ ^ ( y i ) − σ ( y i ) ) < 0 ∣ ⋅ ( σ ^ ( y i ) − σ ( y i ) ) 2 \mathcal{L}_{\text {asymm }}=\sum_{i}\left|\alpha-\mathbb{I}_{\left(\hat{\sigma}\left(y_{i}\right)-\sigma\left(y_{i}\right)\right)<0}\right| \cdot\left(\hat{\sigma}\left(y_{i}\right)-\sigma\left(y_{i}\right)\right)^{2} Lasymm =iαI(σ^(yi)σ(yi))<0(σ^(yi)σ(yi))2 e < 0 e<0 e<0时, I e = 1 \mathbb{I}_{e}=1 Ie=1,否则为0。如果设定 0 < α < 0.5 0<\alpha<0.5 0<α<0.5,则可以对低估误差引入更多的惩罚。同时引入全变分正则项约束 σ ^ ( y ) \hat{\sigma}(y) σ^(y)的平滑性: L T V = ∥ ∇ h σ ^ ( y ) ∥ 2 2 + ∥ ∇ v σ ^ ( y ) ∥ 2 2 \mathcal{L}_{T V}=\left\|\nabla_{h} \hat{\sigma}(y)\right\|_{2}^{2}+\left\|\nabla_{v} \hat{\sigma}(y)\right\|_{2}^{2} LTV=hσ^(y)22+vσ^(y)22最后一部分就是MSE: L r e c = ∥ x ^ − x ∥ 2 2 \mathcal{L}_{r e c}=\|\hat{x}-x\|_{2}^{2} Lrec=x^x22综上所述,整个CBDNet的目标损失函数为: L = L r e c + λ a s y m m L a s y m m + λ T V L T V \mathcal{L}=\mathcal{L}_{r e c}+\lambda_{a s y m m} \mathcal{L}_{a s y m m}+\lambda_{T V} \mathcal{L}_{T V} L=Lrec+λasymmLasymm+λTVLTV

  3. 该算法学习的是更接近于真实噪声的高斯泊松噪声,而前面两篇论文都是学习高斯噪声;并且结合使用合成和真实噪声数据来训练模型,提高模型泛化能力,可以更好地对真实场景进行降噪;

1.4 RIDNet

Real Image Denoising with Feature Attention
这篇论文效果比CBDNet要更好,应该算目前降噪效果最好的算法了,论文中指出CBDNet是一个二阶段去噪网络,不够高效灵活,而本文的一阶段算法更加实用,可以在标准差已知或者未知的情况下同时处理高斯泊松噪声,网络结构如下:
在这里插入图片描述
该网络的特点主要有:

  1. 这个网路的结构设计得相对复杂,主要包括三部分:特征提取、4个EMA组成的残差模型、重建。其中特征提取和重建模块都是卷积层+ReLU层。EMA的结构如上图中下半部分框图所示:
    (1)首先是两个空洞卷积分支,用来增加感受野,然后进行拼接并进行卷积融合
    (2)然后是两个类似残差学习的结构,用于进行特征的提取
    (3)最后是注意力机制,主要由一系列1x1的卷积核构成(这个注意力机制我还不太理解是怎么回事,后面再花时间研究下),结构如下图所示:
    在这里插入图片描述
  2. 该网络的损失函数为L1损失函数: L ( W ) = 1 N ∑ i = 1 N ∥ RIDNet ⁡ ( x i ) − y i ∥ 1 L(\mathcal{W})=\frac{1}{N} \sum_{i=1}^{N}\left\|\operatorname{RIDNet}\left(x_{i}\right)-y_{i}\right\|_{1} L(W)=N1i=1NRIDNet(xi)yi1

1.5 PMRID

Practical Deep Raw Image Denoising on Mobile Devices
这篇论文是2020 CVPR上旷视提出来的一篇非常elegant的算法,该算法的特点网络结构比较小,通过一个k-sigma变换来解决小网络在不同增益噪声下的鲁棒性问题,网络结构如下图所示:在这里插入图片描述
该网络的主要特点有:

  1. 这个网络的结构大体上还是一个UNet的结构,为了降低计算量使用了separable conv卷积,然后使用的是5x5的模型来降低模型深度,使用stride为2的卷积进行下采样,以及2x2的deconv结构进行上采样,使用3x3的separable conv来进行skip connnection的通道构建。可以说网络结构是小而精美。
  2. 该论文我觉得最有启示的一点是提出了k-sigma变换,像FFDNet,CBDNet都是通过设置网络参数来适应不同强度的噪声,而本文是通过将不同强度的噪声进行归一化来简化网络结构,这个思路有点类似于generalization anscombe transform,不了解的同学可以了解下,下面我们来简单进行下k-simga变换的推导,首先是CMOS Sensor的成像模型入下图所示:
    在这里插入图片描述理想像素值 x ∗ x^* x和实际像素值 x x x的计算分别如下所示:
    x ∗ = g α u ∗ x^{*}=g \alpha u^{*} x=gαu x = g ( α u + n d ) + n r x=g\left(\alpha u+n_{d}\right)+n_{r} x=g(αu+nd)+nr其中,由于光子服从波粒二象性,因此服从如下高斯分布 u ∼ P ( u ∗ ) u \sim P\left(u^{*}\right) uP(u)暗电流噪声服从 n d ∼ N ( 0 , σ d 2 ) n_{d} \sim N\left(0, \sigma_{d}^{2}\right) ndN(0,σd2)读出噪声服从 n r ∼ N ( 0 , σ r 2 ) n_{r} \sim N\left(0, \sigma_{r}^{2}\right) nrN(0,σr2)因此整体满足高斯泊松分布 x ∼ ( g α ) P ( x ∗ g α ) + N ( 0 , g 2 σ d 2 + σ r 2 ) x \sim(g \alpha) P\left(\frac{x^{*}}{g \alpha}\right)+N\left(0, g^{2} \sigma_{d}^{2}+\sigma_{r}^{2}\right) x(gα)P(gαx)+N(0,g2σd2+σr2)我们令 k = g α k=g \alpha k=gα σ 2 = g 2 σ d 2 + σ r 2 \sigma^{2}=g^{2} \sigma_{d}^{2}+\sigma_{r}^{2} σ2=g2σd2+σr2则有 x ∼ k P ( x ∗ k ) + N ( 0 , σ 2 ) x \sim k P\left(\frac{x^{*}}{k}\right)+N\left(0, \sigma^{2}\right) xkP(kx)+N(0,σ2)这是 x x x的均值和方差分别为 E ( x ) = x ∗ E(x)=x^{*} E(x)=x Var ⁡ ( x ) = k x ∗ + σ 2 \operatorname{Var}(x)=k x^{*}+\sigma^{2} Var(x)=kx+σ2接下就是k-sigma变换的公式: f ( x ) = x k + σ 2 k 2 f(x)=\frac{x}{k}+\frac{\sigma^{2}}{k^{2}} f(x)=kx+k2σ2经过k-sigma变换后, f ( x ) f(x) f(x)满足 f ( x ) ∼ P ( x ∗ k ) + N ( σ 2 k 2 , σ 2 k 2 ) . f(x) \sim \mathcal{P}\left(\frac{x^{*}}{k}\right)+\mathcal{N}\left(\frac{\sigma^{2}}{k^{2}}, \frac{\sigma^{2}}{k^{2}}\right) . f(x)P(kx)+N(k2σ2,k2σ2).我们将泊松分布 P \mathcal{P} P近似是哟啊那个高斯分布 N ( λ , λ ) \mathcal{N}(\lambda, \lambda) N(λ,λ)代替,则有 P ( x ∗ k ) + N ( σ 2 k 2 , σ 2 k 2 ) ≈ N ( x ∗ k , x ∗ k ) + N ( σ 2 k 2 , σ 2 k 2 ) = N ( x ∗ k + σ 2 k 2 , x ∗ k + σ 2 k 2 ) = N [ f ( x ∗ ) , f ( x ∗ ) ] \begin{aligned} & P\left(\frac{x^{*}}{k}\right)+\mathcal{N}\left(\frac{\sigma^{2}}{k^{2}}, \frac{\sigma^{2}}{k^{2}}\right) \\ \approx & \mathcal{N}\left(\frac{x^{*}}{k}, \frac{x^{*}}{k}\right)+\mathcal{N}\left(\frac{\sigma^{2}}{k^{2}}, \frac{\sigma^{2}}{k^{2}}\right) \\ =& \mathcal{N}\left(\frac{x^{*}}{k}+\frac{\sigma^{2}}{k^{2}}, \frac{x^{*}}{k}+\frac{\sigma^{2}}{k^{2}}\right) \\ =& \mathcal{N}\left[f\left(x^{*}\right), f\left(x^{*}\right)\right] \end{aligned} ==P(kx)+N(k2σ2,k2σ2)N(kx,kx)+N(k2σ2,k2σ2)N(kx+k2σ2,kx+k2σ2)N[f(x),f(x)]使用标定的k和sigma按照k-sigma公式变换后,原始的噪声分布就只和没有噪声的数据 x ∗ x^* x有关,因此就可以避免不同增益下噪声不同带来的负担。

1.6 SID

Learning to See in the Dark
这篇论文除了提供一个非常有用的数据集之外,还提出了一个端到端的网络结果,直接处理Raw数据得到去马赛克,去噪和色彩变化后的图像,网络结果如下:
在这里插入图片描述
该网络的特点主要有:

  1. 输入为bayer图拆分出来的4通道数据,分辨率变为原来的一半,输出为12通道的数据,分辨率为原图的一般,然后经过sub-pixel复原全分辨率的RGB三通道数据,其中ConvNet默认是一个UNet的数据结构。
  2. 损失函数使用L1的损失函数,因此降噪的结果显得比较平滑。
  3. 该网络并没有专门的设计降噪网络,因此降噪效果并不是特别出色,但是其在颜色复原上会有较为明显的优势,并且该网络泛化能力差,一款相机得单独训练一个网络。

2. pytorch代码

以上说的所有的网络模型都是可以下载到源码的,其中一部分我在pytorch上进行过训练和测试,这里我基于pytorch写了一份用于PMRID训练和测试的代码,欢迎参考Jichao-Peng/PMRID-Pytorch

3. 结论

最近几年的顶会CNN的降噪方法已经完全占据了主流,实验也确实证明了CNN的降噪算法相对传统算法在一些方面的优势,我自己也确实被CNN方法给惊艳到了,之后再慢慢深入学习补充

此外,这里我写一个各种算法的总结目录图像降噪算法——图像降噪算法总结,对图像降噪算法感兴趣的同学欢迎参考

;