图像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID
圖像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID
- 圖像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID
- 1. 基本原理
- 1.1 DnCNN
- 1.2 FFDNet
- 1.3 CBDNet
- 1.4 RIDNet
- 1.5 PMRID
- 1.6 SID
- 2. pytorch代碼
- 3. 結論
圖像降噪算法——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.2 FFDNet
FFDNet: Toward a Fast and Flexible Solution for CNN based Image Denoising
這篇論文是DnCNN的升級版,網絡在對噪聲的適應能力和計算量均要由于DnCNN,該算法網絡結構如下:
該網絡的特點主要有:
1.3 CBDNet
Toward Convolutional Blind Denoising of Real Photographs
這篇論文算是FFDNet的再一次升級,在FFDNet中通過添加一個用戶輸入的噪聲強度參數σ\sigmaσ,在CBDNet中通過添加一個全卷積網絡來學習該參數,從而達到自適應噪聲的目的,該算法的網絡結構如下:
該網絡的特點主要有:
該網絡的結構分為兩部分:第一部分為五層全卷積網絡用于噪聲估計噪聲水平圖,第二部分與FFDNet不同,為帶殘差的UnNet,用于降噪。
設計了非對稱損失函數,目的主要是為了消除非對稱敏感性,所謂非對稱敏感性指的像BM3D和FFDNet這樣的降噪算法,輸入降噪參數σ\sigmaσ較小時,降噪效果較差,輸入降噪參數σ\sigmaσ較大時,雖然紋理有損失,但是降噪效果仍然比較好。給定像素iii的估計水平σ^(yi)\hat{\sigma}(y_i)σ^(yi?)和真實值σ(yi)\sigma(y_i)σ(yi?),當σ^(yi)<σ(yi)\hat{\sigma}(y_i)<\sigma(y_i)σ^(yi?)<σ(yi?)時,應該對MSE引入更多的懲罰,因此:Lasymm?=∑i∣α?I(σ^(yi)?σ(yi))<0∣?(σ^(yi)?σ(yi))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<0e<0e<0時,Ie=1\mathbb{I}_{e}=1Ie?=1,否則為0。如果設定0<α<0.50<\alpha<0.50<α<0.5,則可以對低估誤差引入更多的懲罰。同時引入全變分正則項約束σ^(y)\hat{\sigma}(y)σ^(y)的平滑性:LTV=∥?hσ^(y)∥22+∥?vσ^(y)∥22\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:Lrec=∥x^?x∥22\mathcal{L}_{r e c}=\|\hat{x}-x\|_{2}^{2} Lrec?=∥x^?x∥22?綜上所述,整個CBDNet的目標損失函數為:L=Lrec+λasymmLasymm+λTVLTV\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?+λasymm?Lasymm?+λTV?LTV?
該算法學習的是更接近于真實噪聲的高斯泊松噪聲,而前面兩篇論文都是學習高斯噪聲;并且結合使用合成和真實噪聲數據來訓練模型,提高模型泛化能力,可以更好地對真實場景進行降噪;
1.4 RIDNet
Real Image Denoising with Feature Attention
這篇論文效果比CBDNet要更好,應該算目前降噪效果最好的算法了,論文中指出CBDNet是一個二階段去噪網絡,不夠高效靈活,而本文的一階段算法更加實用,可以在標準差已知或者未知的情況下同時處理高斯泊松噪聲,網絡結構如下:
該網絡的特點主要有:
(1)首先是兩個空洞卷積分支,用來增加感受野,然后進行拼接并進行卷積融合
(2)然后是兩個類似殘差學習的結構,用于進行特征的提取
(3)最后是注意力機制,主要由一系列1x1的卷積核構成(這個注意力機制我還不太理解是怎么回事,后面再花時間研究下),結構如下圖所示:
1.5 PMRID
Practical Deep Raw Image Denoising on Mobile Devices
這篇論文是2020 CVPR上曠視提出來的一篇非常elegant的算法,該算法的特點網絡結構比較小,通過一個k-sigma變換來解決小網絡在不同增益噪聲下的魯棒性問題,網絡結構如下圖所示:
該網絡的主要特點有:
理想像素值x?x^*x?和實際像素值xxx的計算分別如下所示:
x?=gαu?x^{*}=g \alpha u^{*} x?=gαu?x=g(αu+nd)+nrx=g\left(\alpha u+n_vt6mr5x\right)+n_{r} x=g(αu+nd?)+nr?其中,由于光子服從波粒二象性,因此服從如下高斯分布u~P(u?)u \sim P\left(u^{*}\right) u~P(u?)暗電流噪聲服從nd~N(0,σd2)n_vt6mr5x \sim N\left(0, \sigma_vt6mr5x^{2}\right) nd?~N(0,σd2?)讀出噪聲服從nr~N(0,σr2)n_{r} \sim N\left(0, \sigma_{r}^{2}\right) nr?~N(0,σr2?)因此整體滿足高斯泊松分布x~(gα)P(x?gα)+N(0,g2σd2+σr2)x \sim(g \alpha) P\left(\frac{x^{*}}{g \alpha}\right)+N\left(0, g^{2} \sigma_vt6mr5x^{2}+\sigma_{r}^{2}\right) x~(gα)P(gαx??)+N(0,g2σd2?+σr2?)我們令k=gαk=g \alphak=gα,σ2=g2σd2+σr2\sigma^{2}=g^{2} \sigma_vt6mr5x^{2}+\sigma_{r}^{2}σ2=g2σd2?+σr2?則有x~kP(x?k)+N(0,σ2)x \sim k P\left(\frac{x^{*}}{k}\right)+N\left(0, \sigma^{2}\right) x~kP(kx??)+N(0,σ2)這是xxx的均值和方差分別為E(x)=x?E(x)=x^{*} E(x)=x?Var?(x)=kx?+σ2\operatorname{Var}(x)=k x^{*}+\sigma^{2} Var(x)=kx?+σ2接下就是k-sigma變換的公式:f(x)=xk+σ2k2f(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(σ2k2,σ2k2).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(σ2k2,σ2k2)≈N(x?k,x?k)+N(σ2k2,σ2k2)=N(x?k+σ2k2,x?k+σ2k2)=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數據得到去馬賽克,去噪和色彩變化后的圖像,網絡結果如下:
該網絡的特點主要有:
2. pytorch代碼
以上說的所有的網絡模型都是可以下載到源碼的,其中一部分我在pytorch上進行過訓練和測試,這里我基于pytorch寫了一份用于PMRID訓練和測試的代碼,歡迎參考Jichao-Peng/PMRID-Pytorch
3. 結論
最近幾年的頂會CNN的降噪方法已經完全占據了主流,實驗也確實證明了CNN的降噪算法相對傳統算法在一些方面的優勢,我自己也確實被CNN方法給驚艷到了,之后再慢慢深入學習補充
此外,這里我寫一個各種算法的總結目錄圖像降噪算法——圖像降噪算法總結,對圖像降噪算法感興趣的同學歡迎參考
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的图像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像降噪算法——Variance Sta
- 下一篇: 图像降噪算法——稀疏表达:K-SVD算法