原文和源代码: GitHub - manumathewthomas/ImageDenoisingGAN: Image Denoising with Generative Adversarial Network
这不是一篇严格的用GAN进行图像去噪的文章,代码有一些小小的bug需要纠正。
另外,自己生成的数据集,用这个代码跑,会发现图像出现严重变色。
本博主的代码更改:GitHub - iteapoy/GANDenoising
关于博主代码说明:这个是数字图像处理的课程项目,本人才疏学浅,该代码中的WGAN部分还存在一些问题,希望有人可以改正。另外,对图像去噪有了解的人会发现G部分基本和DCNN一样。该代码可以改进之处:GAN的训练方式、G的模型、D的模型、损失函数loss function
更新:关于博主代码的问题,近来收到一些邮件来信,欢迎大家移步【该链接】,交流讨论。
以下是对ImageDenoisingGAN原文(不是博主的代码)的读书笔记。
目录
计算机视觉中的生成模型。
由于生成模型已经是深度学习研究的指导原则,因此还有大量图像合成工作使用了深度模型。尽管图像合成(“无中生有”)不包括在计算机视觉中,但是能够进行图像合成的模型通常用于图像恢复,即修复图像中的缺陷或从图像中移除对象这样的计算机视觉任务。
——《深度学习》
1 介绍
文章提出了一个方法,使用一小部分的每像素样本(samples per pixel)进行渲染,并且在网络中传递噪声图片,这会生成高质量的真实照片效果的图片。
这篇文章提出的网络基于ResNet(残差神经网络)。
工作的关键是定义了损失函数和非常深的GAN。定义了一个精细的感性损失函数,可以保留颜色、纹理和场景的属性(像是运动模糊、景深效果)
2 相关工作
[4] Burger, H.C., Schuler, C.J. and Harmeling, S., 2012, June. Image denoising: Can plain neural networks compete with BM3D?. In Computer Vision and Pattern Recognition (CVPR), 2012 IEEE Conference on (pp. 2392-2399). IEEE.
通过学习一个多层的感知神经网络(MLP)来去噪,把去噪问题作为回归问题。一对对噪声块和干净块被用来估计神经网络的参数,用来最小化噪声块和干净块之间的差异。每一层对块应用的权重会被传递到下一层。输出经过一些全连接层后,与真值进行比较。为了更新网络的参数,使用反向传递来减少均方误差。
这个自我学习的MLP神经网络将图像分成重叠的块,作为连续的输入向量,以此来去噪。每一个块去噪后,重叠的块计算平均值后生成去噪后的图像。
[5] Kalantari, N.K., Bako, S. and Sen, P., 2015. A machine learning approach for filtering Monte Carlo noise. ACM Trans. Graph., 34(4), p. 122.
MLP也能用来过滤图片中的蒙特卡罗噪声。
[6] Jain, V. and Seung, S., 2009. Natural image denoising with convolutional networks. In Advances in Neural Information Processing Systems (pp. 769-776).
[2] Dong, C., Loy, C.C., He, K. and Tang, X., 2016. Image super-resolution using deep convolutional networks. IEEE transactions on pattern analysis and machine intelligence, 38(2), pp.295-307.
输入的图像被分成重复的块。使用两个卷积操作,计算概念上高分辨率的块,然后聚合这些块,组成一个高分辨率的输出图像。
[7] Ledig, C., Theis, L., Huszár, F., Caballero, J., Cunningham, A., Acosta, A., Aitken, A., Tejani, A., Totz, J., Wang, Z. and Shi, W., 2016. Photo-realistic single image super-resolution using a generative adversarial network. arXiv preprint arXiv:1609.04802.
GAN用于实现图像超分辨率重建。
3 方法
基于残差网络结构建立了GAN网络模型,用于去噪。让生成网络生成无噪点图像,并让辨别网络参照真实无噪点图像来分辨生成图像与真实图像,提高生成图像的质量,进行去噪。残差网络是最新的用于非常深的卷积神经网络。残余块的概念,以及跳跃式连接、块的正则化的使用可以保证训练出非常好的结果。因为训练时间有限,我们只用了三个残余块。拥有大量的参与块可以大大增加训练的精确度,但是将以训练时间作为代价。
(图源来自Image Denoising via CNNs: An Adversarial Approach)
3.1 生成网络
K:卷积核大小 N:输出的通道数 S:步长
单图像去噪的目的是生成真实的高质量图像。生成器应该生成去噪图像。
采用对称结构,和传统的CNN框架非常类似,可以直接从输入的图像和它相应的真实图像中学习到一个端到端的映射。
三个卷积层、批量正则化、Lrelu线性激活函数被压缩在卷积模块中。
然后,是三个残余块,每个残余块包含了两个卷积层、两个批量正则化、和两个Lrelu激活函数来增加神经网络的深度。我们在子网络中包含了对称结构的跳跃式连接,这样使得网络在训练的时候高效并且有更好的收敛性。那些跳跃式连接将输入给更深层,因此每个残余层可以根据输入调整输出,并且保持空间信息。
其后,是三个子像素卷积层,每个子像素卷积层对应于网络前面的卷积层。每个子像素卷积层由调整大小的图像块和卷积层组成。 图像的大小从64X64调整到128X128,最终图像输出大小为256X256。我们使用子像素卷积层而不是反卷积层,是为了避免图像中的棋盘效应。 由于子像素卷积类似于反卷积,因此本文将这些层称为反卷积层。
最前面的两个反卷积层有Lrelu线性激活函数,最后的反卷积层有一个sigmoid激活函数,输出最终结果。对所有的层,步长为1,整个生成网络如下:
CBL(K) 是一个K通道的卷积层,跟着批正则化层和Lrelu激活函数。
DBL(K) 是一个K通道的反卷积层,跟着批正则化层和Relu(?Lrelu)激活函数
跳跃式连接在每两个跳跃之间
3.2 辨别网络
图形去噪的目标,一是为了让去噪结果在视觉上和真实图像一样吸引人,并且在数量上去噪图像可比拟真实图像,同样也是为了和照片一样高质量。因此我们加入了一个自我学习的辨别子网络,去分辨一个图像是真的还是伪造的。在整个辨别网络中,我们用了五个带批正则化和线性激活函数的卷积层。
一旦我们从一系列的Conv-BN-Lrelu(卷积层-批正则化-Lrelu激活函数)中计算学习特征,一个sigmoid函数被压缩在最后,将结果映射到一个正则化在[0,1]之间的可能性分数。
辨别子网络的结构如下:
CB(K2)是一个K2通道的卷积层,跟着一个批正则化层
C(1)是一个1通道的卷积层
3.3 精制的损失函数
为了保证结果有一个好的视觉和定量的成绩,并且在辨别网络有一个好的表现,我们提出了一个新的损失函数。我们合并了像素到像素的欧式损失(Euclidean loss/Pixel Loss)、特征损失(feature loss)、平滑损失(smooth loss)和对抗损失(adversarial loss)以及合适的权重。
- 对抗损失(adversarial loss)
是给生成器去生成更好效果的输出,来欺骗判别器。
- 像素到像素的欧式损失(Euclidean loss/Pixel Loss)
通过比较去噪图像和原图的每个像素点差异(欧式距离)来用正确的颜色填充噪点
- 特征损失(feature loss)
正确地抽取特征,和Pixel Loss计算方法相同,但是是比较从VGG16的Conv2层中抽取的图片数据
- 平滑损失(Smooth Loss)
在已有的损失函数上,本论文又加了一个平滑损失。来预防相邻像素点之间的最大差异,这些最大差异可能会引起图片中的棋盘效应。为了计算平滑损失,我们将生成的图像的副本向左滑动一个单位,向下滑动一个单位,然后在移位的图像之间取一个欧几里德距离。
新的损失函数定义如下:
𝐿 = 𝜆𝑎𝐿𝑎 + 𝜆𝑝𝐿𝑝 + 𝜆𝑓𝐿𝑓 + 𝜆𝑠𝐿𝑠
𝐿𝑎代表 对抗损失(adversarial loss) - 判别器D的损失
𝐿𝑝代表 欧式损失(Euclidean loss/Pixel Loss)- 生成图像和原图的像素欧式距离
𝐿𝑓代表 特征损失(feature loss)- 生成图像和原图来自VGG16的Conv2层的像素欧式距离
𝐿𝑠代表 平滑损失(Smooth Loss)
𝜆𝑎,𝜆𝑝,𝜆𝑓,𝜆𝑠是预定义的权重值。
4 实验与结果
4.1 数据集和训练
因为缺少大数据集来训练和评估单张图的去噪效果,我们在实验中自造了一套新的训练和测试样本,我们下载了40张Pixar电影的图片并且加上了高斯噪声来自建数据集。可以保证在生成训练和测试集的时候使用了不同标准差的高斯噪声,训练集一共有1000张图片,测试集有40张图片。所有的测试集合训练集限定在256*144,
4.2 模型细节和参数
Batch size=7
Iteration = 10k
λa = 0.5, λp = 1.0, λf = 1.0, λs = 0.0001
K =32 and K2 = 48
G: 第一个卷积层和反卷积层大小是内核9,步长为1.剩下的内核是3*3,步长为1
D:前三层所有的卷积层和反卷积层的内核为4*4,步长为2,并且加0,最后两层的内核为4*4,步长为1,并且加零
5 结论
这个网络可以在几秒钟内对图像去噪
训练模型用了高斯噪声,但是基于数据集的不同,可以拓展到解决其他类型的噪声,
有趣的是,我们发现我们的网络,用40张特定领域的噪声图像,只训练了10K代,就能够处理该领域之外的噪声。在未来,我们打算去除蒙特卡罗渲染的噪声。
最后,如果大家需要用到数据集的话,可以戳数字图像处理/计算机视觉常用数据集资源(预览+下载)