【论文阅读】Invertible Denoising Network A Light Solution for Real Noise Removal

发布于:2022-12-20 ⋅ 阅读:(451) ⋅ 点赞:(0)

🚩前言

  • 🐳博客主页:😚睡晚不猿序程😚
  • ⌚首发时间:2022.9.12
  • ⏰最近更新时间:2022.9.12
  • 🙆本文由 睡晚不猿序程 原创,首发于 CSDN
  • 🤡作者是蒻蒟本蒟,如果文章里有任何错误或者表述不清,请 tt 我,万分感谢!orz


1. 内容简介

论文标题:Invertible Denoising Network: A Light Solution for Real Noise Removal

作者:Yang Liu,Zhenyue Qin,Saeed Anwar 等

发布于:CVPR 2021

自己认为的关键词:可逆神经网络,图像去噪


2. 摘要浏览

解决的问题:使用 INN 进行图像去噪

困难:输入是包含噪声的图像,而反向输出是干净的图像,这二者是符合不同的概率分布的

本文工作:提出了一个去噪网络 InvDN,他可以将带噪声的输入转换成一个分辨率较低的清晰图像以及包含有噪声的一个隐藏表示

架构: InvDN,他可以将带噪声的输入转换成一个分辨率较低的清晰图像以及包含有噪声的一个隐藏表示,为了清除噪声, InvDN 将噪声的隐藏表示替换为了从一个先验分布中采样的样本(应该就是高斯分布了),然后二者再走一遍网络的反向过程,得到一个清晰的图像

【感觉这个结构很神奇,首先他会输入一个带噪声的图像,输出是一个降低了分辨率的清晰图像以及一个含噪声的向量 z,接着将整个网络反过来,将 z 替换成从高斯分布中采样的 z H F z_{HF} zHF ,最后输出一个清晰的图像】

完成效果

  1. 在图像去噪领域成为了 SOTA(SIDD 数据集),并且使用的时间更少
  2. 相比起 DANet 参数量更小,仅为其的 4.2%
  3. 通过操纵人造的噪声向量表示,可以生成和原图像相似的噪声

【看了这个摘要感觉还是云里雾里,INN 反向不是应该生成和原来差不多的东西吗(比如正向加噪声反向去噪声)为啥在这里正反向变成一起的了?感觉有点莫名其妙】

【感觉以前似乎没有看了摘要后这么迷糊的论文,接下去往下看把】

3. 图片、表格浏览

图一

image-20220911164144308

第一页就放了一张好看的图片,对比了各个模型的效果

可以看到 InvDN 不会过度平滑,并且边缘更为锐利,且看起来人造痕迹更少,我们把细节放大可以更为明显的看出各个模型之间的差距

图二

image-20220911164346060

左:展示了可逆变换中的 Squeeze 操作,左边是采用的棋盘分解的操作,这个是在早期的 NICE 以及 Glow 做的操作。

右:展示了小波变换的操作,展示的应该是 Haar 小波,可以降低分辨率并增加通道数量,看起来这篇文章使用了小波变换来代替了原本的棋盘分解来划分通道

图三

image-20220911164657015

这个应该就是整个网络的架构图了(感觉我确实有点拐不过弯来)

正向:输入一张带噪声的图片,学习低分辨率的图像和隐变量 z,

反向:将隐变量 z 替换为从高斯分布中取样的 z H F z_{HF} zHF ,然后和低分辨率的图像 LR 一起输入网络,得到了一张干净的图像

【有点不能理解,如果正向是分离噪声和图像的话,那么反向是不是应该就是把图像和噪声合成起来?感觉好奇怪啊,是不是我对图像去噪领域的理解有很大的偏差?】

【等下会不会是因为这个原因:原本的噪声向量被我们丢弃了,这里使用的是一个添加进来的从高斯分布中采样的一个向量 z H F z_{HF} zHF,所以合成出来的图像应该是没有噪声的 !!!原来如此!这样就解释的通了

前面作者也提到了,我们如果使用人造的噪声表示可以模拟出原来的噪声,我在想是不是我们提取出了某种噪声的表示,然后我们再把这个噪声表示和其他的图片进行合成,就可以模拟出原本的噪声了,确实是很巧妙的方法,感觉和 GAN 是不是有共通之处,之前组会听同学汇报的时候讲的,GAN 的生成器可以提取出图像的某种特征,在这里就是提取出噪声的特征了把】

表一

image-20220911170443881

表示了可逆块在正向以及反向的时候所做到操作,其中 ϕ \phi ϕ 可以是任意的网络,这是 INN 的特性

图四

image-20220911170822559

使用了三行进行对比

a:SIDD 数据集,作者展现了一张基本是暗部的图片(黑漆漆的啥也看不到呀),他想说明的是这个 InvDN 即使是在黑暗的环境下,还是可以产生更为干净且较少人造感的图片

b:DND 数据集,展现了 InvDN 可以非常清晰的重建细微边缘

c: RNI 数据集,展现了其更少的扰动以及边缘无伪影

图五

image-20220911171522488

这个应该是模块选择的对比图

左边:使用了 Haar 小波变换/棋盘分解的对比,可以看出使用 Haar 小波变换的效果会更好

右边:使用了 Dense Block/Residual Block 作为 ϕ \phi ϕ 的对比图,可以看出,使用残差连接会比使用密集连接要好【很神奇,按照我的想法可能是使用密集连接会更好】

表二

image-20220911171854112

这里应该是列出了一个对比图,把各种方法放在一起进行了对比,并标注了自己的方法的

【有一个小问题,是否可逆为啥也要放上去,可不可逆无所谓把是不是】

但是相比起来,他的参数值真的是小到爆炸,却能达到很不错的效果

表三

image-20220911173243084

使用不同的降采样块和可逆块带来的不同效果,可以看出太少不好,但是太多也不好

图六

image-20220911173446982

展示了在使用 MC self-ensemble【这是啥】之前和之后的效果,黑色部分表示有更大的差异,可以看出使用了这个 MC self-ensemble 可以让模型效果更好

表四

image-20220911173638844

用 SIDD 作为验证集,在前向传播和反向传播的时候组合使用各种损失,使用 PSNR 作为评价指标来评估模型的有效性,看样子那个标红的效果最好,但是好像大家相差不多?差距都在0.1这个范围

表五

image-20220911174346982

使用模型生成噪声图像的 AKLD 值,这个值越小越好

图七

image-20220911175100374

a:使用 PCA 进行可视化,其中粉色的是提取出来的噪声样本 z,蓝色的是干净的样本 z H F z_{HF} zHF

b:原本的噪声图像

c:生成的去噪图像

小结

该文论使用了一个 INN 来进行图像去噪工作。首先正向过程会提取出分辨率较低的图像向量以及噪声向量,之后将噪声向量替换为从高斯分布中采样的干净向量,然后经过 INN 的反向过程,就可以得到一个去噪之后的清晰图像。所以应该是这样理解的,正向是图像分解,把图像分解为较低分辨率的图像和噪声向。反向是图像合成,把低分辨率的图像和重新采样的 z 进行合成,得到一个没有噪声的图像

该模型对之前的按通道划分进行了小小的改进,引入了小波变换,Haar 小波变换会把图像变为原本的四分之一,但是通道数会变成原本的四倍。然后直接进行按通道划分即可,没用使用棋盘分解或者是 1x1 卷积之类的操作。我觉得如果加上这些操作会不会信息融合的能力会变得更好?

在可逆神经网络可变的函数区域,作者使用了 Dense Block 作为替代。我认为密集连接确实可以让网络保存之前信息的能力变强,其优于残差块是可以预知的。


4. 引言浏览

图像去噪任务:将一个有噪声的图像恢复为清晰的图像

传统方法:传统的方法将图像去噪任务当作一个最大后验概率的优化问题,其假设了噪声分布和自然图像分布的先验值。这些算法在去除合成的噪声上效果显著,但是在去除现实世界的噪声上表现不佳,因为这些假设背离了显示场景

现代方法:使用 CNN 进行图像去噪。为了保证其效果,网络结构往往很深很大,在现实场景中并不使用(比如要把这个模型放入边缘设备,例如手机和摄像头中)

可逆神经网络:使用可逆神经网络进行去噪工作有三个好处

  1. 模型是轻量化的,模型的编码器和解码器使用的是同一套参数
  2. 可逆神经网络能保持输入图像的信息,因为他是无损的
  3. 在反向传播中节约内存

上面这三个特性让 INN 可以适用于小型设备,并且网络的输入以及反向输出的结果是遵循相同的分布的。

困难:但是在去噪任务中,输入图像是含噪声的,而恢复的图像是清晰的无噪声的,二者遵循不同的分布。因此我们就需要做一些修改,在进行反向输出之前,我们把高维噪声向量抛弃,然后再进行反向输出。因为这一方式有较大的困难,所以噪声去除这一工作没有在可逆网络相关的模型或者是文献中被讨论

文章工作:提出了一个可逆去噪网络 InvDN,他解决了上面的这一困难。和先前的可逆模型不同,其涉及两个不同的高维向量:其一包含噪声和高频的清晰内容,其二仅仅对图像的清晰部分进行编码。

前向传播的过程中,InvDN 会把输入图像转换为一个较低分辨率的隐藏表示(但是其通道数增加)

训练:作者训练 InvDN,让其使得低分辨率图像的隐藏表示的前三个通道和低分辨率的高清图一致,因为可逆网络是无损的,所以噪声信号就是其他的剩余通道。为了完全移除噪声,我们把包含有噪声的通道全部丢弃。这样会带来一些副作用,比如说原本一些高分辨率图像信息也被我们丢弃了。为了重建这些信息,我们从一个先验分布中(应该就是高斯分布了)重新采样了一个高维变量,并用来替代被我们丢弃的变量

贡献

  1. 第一次设计了用于显示图片去噪工作的可逆神经网络
  2. 原先的可逆网络仅能服从一个单独的分布,文中提出的 INN 服从两个分布(拆解为了两个,噪声张量服从一个分布,低分辨率图像服从一个分布),InvDN 因此不仅能去除噪声,也可以合成新的噪声
  3. 在 SIDD 数据集上达到了新的 SOTA(但是有个问题,我去 Paper with code 上查询好像并没有看到他的记录,似乎里面的对比模型 DANet 排名第八
  4. 可以生成新的和原先的噪声图像相似的图像(应该就是模拟噪声了)

自由阅读

5. 可逆去噪网络(原文第三章)

作者将会先介绍一些可逆神经网络的背景知识,然后之后再描述 InvDN 的细节

5.1 可逆神经网络

最开始是提出用来自监督学习的概率模型,他可以把一个分布通过连续函数转换成另一个分布,并且不会损失信息。使用可逆网络,可以把一个服从简单分布的 z 映射到一个复杂分布。

5.2 INN 的去噪应用的困难

大部分的 INN 应用于图像生成以及 rescaling 任务,这些模型认为输入和输出图像服从同一分布。但是去噪不同,我们可以认为输入的噪声图像和转换的清晰图像是服从不同分布的。而再可逆变换中,是不会损失信息的(是不是可以认为可逆变换会保留噪声信息)

因为噪声信息在我们把输入图像转变为隐变量的时候仍然保留,所以我们并不希望网络有这种特性(但是他就是有这种特性啊哈哈哈哈)

所以作者提出了一个想法,如果我们可以在可逆变换中解耦噪声和清晰信号,我们或许可以重建一个清晰图像,并且不用考虑在分析噪声和图像的过程中会丢失重要信息。接下来作者就要讲他们是如何使用可逆变换来提取噪声和清晰图像信号的了

5.3 设计理念

使用 INN 来学习一个观察 y(带噪声图像)的隐藏表示并且能解耦噪声和清晰图像

使用 Squeeze layer 和 Haar Wavelet Transformation 来进行可逆的特征提取

【上面二者都可以降低图像分辨率,提升图像的通道数,并且哈尔小波变换可重构出各种分辨率的图像,变换过程中没有丢失信息

二维的哈尔小波变换将图片分解为四个部分:

A:低频信息

H:水平高频信息

V:垂直高频信息

D:对角高频信息

作者表示,他们不是直接分离噪声信号和清晰图像信号,而是分离噪声图像的低分辨率和高频分量。因为采样理论表明,在下采样的过程中,高频信号会被丢弃

因此,如果我们能让转换后生成的隐藏表示的前三个通道和下采样之后的清晰图像一致,高频信息就会被编码到其他的通道中去,通过观测,高频信息中包含有噪声。在反向输出的时候,作者抛弃了所有高频表示,然后从低分辨率图像中重建清晰图像,这个过程用公式表示为:
p ( y ) = p ( x L R , x H F , n ) = p ( x L R ) p ( x H F , n ∣ x L R ) p(\mathbf{y})=p\left(\mathbf{x}_{\mathrm{LR}}, \mathbf{x}_{\mathrm{HF}}, \mathbf{n}\right)=p\left(\mathbf{x}_{\mathrm{LR}}\right) p\left(\mathbf{x}_{\mathrm{HF}}, \mathbf{n} \mid \mathbf{x}_{\mathrm{LR}}\right) p(y)=p(xLR,xHF,n)=p(xLR)p(xHF,nxLR)
其中:y 表示带有噪声的原图像,xy 的清晰版本,n 代表噪声, x L R x_{LR} xLR 代表低分辨率图像, x H F x_{HF} xHF 代表高频分量。因为分离高频分量和噪声很困难,所以作者采取的方法为直接丢弃

为了重建图像,作者使用了一个从高斯分布中采样的样本 z H F z_{HF} zHF 来替代,这样因为丢弃而损失的细节又被嵌入到了隐变量 z H F z_{HF} zHF

image-20220912132939746

【上面这个图展示了网络结构,但是感觉还是有点不理解,首先看不出可逆结构的样子,其次是通道的划分似乎不是对称的?因为经过哈尔小波变换应该是产生四个通道,但是为什么前三个通道进去了最后一个通道单独拉出33呢?】

5.4 网络结构

使用了全监督来指导网络分离高频信息和低分辨率的清晰图像。使用公式来表达,经过了一系列变换 g,图像 y 被分离为低分辨率图像 LR 以及高频向量 z(公式表示为: g ( y ) = [ g ( y L R ; z ) ] g(\textbf y)=[g(\textbf y_{LR};\textbf z)] g(y)=[g(yLR;z)] )使用如下损失来进行监督
L forw  ( y , x L R ) = 1 M ∑ i = 1 M ∥ g ( y ) L R − x L R ∥ m \mathcal{L}_{\text {forw }}\left(\mathbf{y}, \mathbf{x}_{\mathrm{LR}}\right)=\frac{1}{M} \sum_{i=1}^M\left\|g(\mathbf{y})_{\mathrm{LR}}-\mathbf{x}_{\mathrm{LR}}\right\|_m Lforw (y,xLR)=M1i=1Mg(y)LRxLRm
其中 g ( y ) g(\textbf y) g(y) 代表着网络学习分解的低频分量,对应输出表示的前三个通道。M 代表的是像素个数,m 代表使用几范数(可以是 1 范数也可以是 2 范数)

为了得到清晰图像的低分辨率版本,作者使用了双三次变换来得到低分辨率的图像

为了恢复图像,只需要将输出反向输入网络即可,也就是使用逆变换 g − 1 ( [ g ( y ) L R ; z H F ] ) g^{-1}([g(\textbf y)_{LR};\textbf z_{HF}]) g1([g(y)LR;zHF]) 来进行恢复,其中 z 是通过从一个正态分布中随机采样得到的,反向传播的监督为:
L back  ( g ( y ) L R , x ) = 1 N ∑ i = 1 N ∥ g − 1 ( [ g ( y ) L R ; z H F ] ) − x ∥ m , \mathcal{L}_{\text {back }}\left(g(\mathbf{y})_{\mathrm{LR}}, \mathbf{x}\right)=\frac{1}{N} \sum_{i=1}^N\left\|g^{-1}\left(\left[g(\mathbf{y})_{\mathrm{LR}} ; \mathbf{z}_{\mathrm{HF}}\right]\right)-\mathbf{x}\right\|_m, Lback (g(y)LR,x)=N1i=1N g1([g(y)LR;zHF])x m,
N 代表像素数目,x代表的是清晰图像,可逆变换 g 同时使用两个优目标进行更新

变换 g 是一个多尺度的架构,有许多的下采样块,每一个下采样块都包含一个小波变换以及许多的可逆块,再放一张网络结构图把(我好像已经放了三次了)

image-20220912132939746

可逆小波变换:因为在前向传播中,我们想要学习低分辨率的干净图像,作者使用 Haar DWT 进行分解,一次性做到了下采样和增加特征通道数的功能。原图大小为(H,W,C),经过变换将会得到(H/2,W/2,4C)大小的图像。哈尔小波变换会把图像分解成四个部分,其中一个低频表示三个高频表示(分别为垂直,水平和对角高频信息)

一般来说,小波变换后图像会生成低频信息和高频信息,低频信息对应于求均值,高频信息对应于求插值

均值是局部的平均值,属于低频信息,存储图片的轮廓信息近似信息

插值是局部的波动值,属于高频信息,存储图片的细节信息局部信息,当然也会含有噪音

当然使用其他的 DWT 方法也可以做到,比如 Daubechies,Coiflet 小波变换

可逆块:每个降采样层的开头都有一个小波变换模块,他把输入表示分解为高低频信号,这些信号接下来会被一系列的可逆块处理

这些可逆块采用的是和先前工作一样的耦合层(real NVP)【感觉上面的图并没有把可逆模块的构造画的很好,所以接下来的讲解要仔细看了】

image-20220912142956620

【看这样子,确实不是平均分配。先前的工作大部分是按照通道平均分配输入,但是这里一个为三通道,一个为单通道,然后进入网络进行耦合,好像也可以但是就是怪怪的会吗?】

发现其实和通常的 INN 结构类似啊,那上面的那个图怎么画的这么的奇奇怪怪,等下我回去给他重画一下

作者表示,由于跳跃连接在深度神经网络中很重要,所以他选择简化 R2 为:
u a i + 1 = u a i + ϕ 2 ( u b i ) u^{i+1}_a =u^i_a+\phi_2(u^i_b) uai+1=uai+ϕ2(ubi)
【还可以这样的?】

通过跳跃连接,低频信息就可以直接输入到后面的层中

作者说对于函数 ϕ \phi ϕ ,采用的是残差块

【我突然想到了一个问题,应该算是一个无关联想吧,感觉想的有点远了,上次在跑 HiNet 的代码的时候,我发现其实 batch size 开到 8 的时候显存占用就大概能达到 15 G 了,是不是因为使用 pytorch 的自动求导工具不能很好的利用 INN 的优势之一,也就是不需要存储中间的激活呢?如果手动实现这一功能能不能让显存的占用率更低从而实现送入更大的 batch size 呢】

6. 实验部分(原文第四章)

6.1 数据集

使用 SIDD,DND,RNI 数据集

6.2 训练细节

使用了两个下采样块,每一个块包含有八个可逆块 ,使用 Adam 优化器,batch size 设置为 14,初始学习率设置为 2e-4,学习率每 50k 个 iter 衰减一半,使用随机水平和垂直反转图片来增强数据

6.3 消融实验

Squeeze vs Wavelet Transform

使用这两种不同的方法来进行下采样,可以看出使用哈尔小波变换会比传统的 Squeeze 操作速度更快,且更稳定

image-20220912150227629

Residual Block vs Dense Block

可以看出使用残差连接的效果会更好

image-20220912150850075

并且使用残差连接可以进一步减少参数的数量

不同数量的下采样层和残差块的组合

image-20220912150952634

每个下采样块中的可逆块的数量增加可以提升效果,并且使用两个下采样块的效果最佳

损失

使用不同损失的结果,作者采用了不同损失的组合来训练模型,发现使用 L1 范数来计算高分辨率图像,L2 范数来计算地分辨率图像的损失表现最好

image-20220912151435738

蒙特卡洛自集成

好高端的名字,在我看来就是多次采样 z ,得到一系列的去噪图像,最后进行平均?这里采取的是 16 次采样

对于 z 分布的分析
使用了 500 个 z 和 z H F z_{HF} zHF 来进行对比,可以看出他们服从于不同的分布

他还可以做数据增广,只需要对 z 添加一个微小的扰动就可以产生新的噪声图像

作者使用了 DANet 提出的一种平均 KL 散度(AKLD)来验证模型效果,他可以用来估计原图像和生成图像噪声的相似度,可以看出该模型的效果最好

image-20220912153238235

7. 总结、预告

7.1 总结

感觉这篇文章算得上是有点脑洞,感觉我有点读不明白,但是我看出了几个和以往的不同之处

  1. 使用小波变换来替代原先的 Squeeze :可以使用小波变换来增加通道数,并进行下采样。我在想,网络的正反方向结合起来看还有点 U-Net 的感觉,就是差了级联而已(但是可逆网络不可做级联哈哈哈哈,级联之后就不可逆了)
  2. 在可逆网络中的 ϕ \phi ϕ 引入跳跃连接:上面说使用了一个跳跃连接取代了 R2,但是我有一个想法,能不能使用跳跃连接来连接可逆块(似乎不行哦,因为这个可不是可逆运算,但是在如果有存储中间激活的情况下能不能实现?好像要自己想一下了有点绕iai)【经过了五分钟的思考,我给出的结论是,不可以!!!加跳跃连接请加到可以随便更改的函数 ϕ \phi ϕ 中谢谢哈哈哈哈】
  3. 感觉更像是图片分解和合成,是一个比较骚的对于 INN 用法

7.2 预告

感觉看完这个论文我人有点迷糊了,感觉绕的有点晕,接下来继续关注一下 INN 的相关内容吧!