用生成对抗神经网络进行图像去噪【ImageDenoisingGAN】Image Denoising Using a Generative Adversarial

本文围绕使用GAN进行图像去噪展开。基于残差网络构建GAN网络模型,包含生成网络和辨别网络,并提出精制的损失函数。实验自建数据集,限定图片尺寸,设置了模型参数。该网络能快速去噪,还可拓展解决其他噪声问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文和源代码: GitHub - manumathewthomas/ImageDenoisingGAN: Image Denoising with Generative Adversarial Network

这不是一篇严格的用GAN进行图像去噪的文章,代码有一些小小的bug需要纠正。

另外,自己生成的数据集,用这个代码跑,会发现图像出现严重变色。

本博主的代码更改:GitHub - iteapoy/GANDenoising

关于博主代码说明:这个是数字图像处理的课程项目,本人才疏学浅,该代码中的WGAN部分还存在一些问题,希望有人可以改正。另外,对图像去噪有了解的人会发现G部分基本和DCNN一样。该代码可以改进之处:GAN的训练方式、G的模型、D的模型、损失函数loss function

更新:关于博主代码的问题,近来收到一些邮件来信,欢迎大家移步【该链接】,交流讨论。 

以下是对ImageDenoisingGAN原文(不是博主的代码)的读书笔记。

目录

1 介绍

2 相关工作

3 方法

3.1 生成网络

3.2 辨别网络

3.3 精制的损失函数

4 实验与结果

4.1 数据集和训练

4.2 模型细节和参数

5 结论


计算机视觉中的生成模型。

由于生成模型已经是深度学习研究的指导原则,因此还有大量图像合成工作使用了深度模型。尽管图像合成(“无中生有”)不包括在计算机视觉中,但是能够进行图像合成的模型通常用于图像恢复,即修复图像中的缺陷或从图像中移除对象这样的计算机视觉任务。

——《深度学习》

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- 生成图像和原图来自VGG16Conv2层的像素欧式距离

𝐿𝑠代表 平滑损失(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代,就能够处理该领域之外的噪声。在未来,我们打算去除蒙特卡罗渲染的噪声。

最后,如果大家需要用到数据集的话,可以戳数字图像处理/计算机视觉常用数据集资源(预览+下载)

### 使用生成对抗网络进行图像去噪的方法和实现 #### 1. 方法概述 生成对抗网络(GAN)由两个主要部分组成:生成器(Generator)和判别器(Discriminator)。在图像去噪的应用中,生成器负责将带噪声的输入图像转换为干净的输出图像;而判别器则用于区分真实无噪声图像是来自训练集还是由生成器产生的合成图像。这种相互竞争的过程有助于提高生成器的学习能力,从而更好地去除图像中的噪声[^1]。 #### 2. 架构设计 对于图像去噪任务而言,通常会选用类似于U-Net结构作为生成模型的基础框架。该种编码解码式的神经网络能够有效地捕捉到局部特征并保持空间分辨率不变,在重建高质量图片方面表现出色。与此同时,为了增强系统的鲁棒性和泛化性能,还可以引入条件机制来指导生成过程,即所谓的cGANs(Conditional GAN),使得模型可以根据特定条件下执行更加精准的任务操作[^3]。 #### 3. 实现流程 以下是基于PyTorch框架的一个简单实例代码片段展示如何搭建这样一个用于图像去噪工作的GAN系统: ```python import torch from torch import nn, optim from torchvision.utils import save_image class Generator(nn.Module): def __init__(self): super(Generator, self).__init__() # 定义生成器的具体层... def forward(self, x): return output class Discriminator(nn.Module): def __init__(self): super(Discriminator, self).__init__() # 定义判别器的具体层... def forward(self, x): return prediction def train(g_model, d_model, dataloader, epochs=50): criterion = nn.BCELoss() optimizer_g = optim.Adam(g_model.parameters(), lr=0.0002) optimizer_d = optim.Adam(d_model.parameters(), lr=0.0002) for epoch in range(epochs): for i, data in enumerate(dataloader): noisy_images, clean_images = data real_labels = torch.ones((clean_images.size(0),)) fake_labels = torch.zeros((noisy_images.size(0),)) # 更新D网络参数 outputs = d_model(clean_images).squeeze() loss_real = criterion(outputs, real_labels) generated_imgs = g_model(noisy_images) outputs = d_model(generated_imgs.detach()).squeeze() loss_fake = criterion(outputs, fake_labels) total_loss = (loss_real + loss_fake)/2. optimizer_d.zero_grad() total_loss.backward() optimizer_d.step() # 更新G网络参数 gen_output = d_model(generated_imgs).squeeze() generator_loss = criterion(gen_output, real_labels) optimizer_g.zero_grad() generator_loss.backward() optimizer_g.step() if i % 100 == 0: print(f'Epoch [{epoch}/{epochs}], Step[{i}/total_steps], ' f'D Loss: {total_loss.item():.4f}, G Loss:{generator_loss.item():.4f}') train(generator_instance, discriminator_instance, dataset_loader) ``` 此段伪代码展示了基本的训练循环逻辑以及损失函数的选择方式。实际应用时还需要考虑更多细节配置如批次大小调整、正则项加入等优化措施以获得更好的效果[^2]。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iteapoy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值