继用GAN进行图像去噪【ImageDenoisingGAN】Image Denoising Using a Generative Adversarial一文发表后,近来收到不少邮件,在此刊登,供大家答疑解惑,也欢迎大家交流。因为本人才疏学浅,所以回答有误的地方也欢迎大家指正。
注意:由于内容较老,tensorflow更新迭代较多,本文已不再更新,也不再继续进行邮件讨论,感谢大家的支持和理解。
邮件一
博主,
你好,我是XX大学的一名研究生,最近在搞关于GAN的研究,我看到了你发的帖子还有你的代码。
然后这边有些疑问,这个程序训练的时间是不是很长,感觉我这边以已经训练好久了,是不是用到GPU加速的方式,我这边还没有复现出你的结果,
谢谢。
您好!
这个需要用GPU加速。用CPU的话,我之前运行了8小时,只运行了大概10个epoch。至少需要训练几百个epoch训练结果才收敛。
我后来用了学校的服务器,是GTX 1080Ti训练,每10个epoch需要约15分钟。
博主,
你好,收到你的回信很开心。我尝试配置cuda和cudnn来进行程序加速,可是电脑GPU较差,所以我打算用cpu先进行尝试,使用cpu可以进行跑通你的代码,但速度较慢。所以我想简化一下网络,我仔细研读了你的代码,有几个问题想请教一下你。
第一 关于超参数,我删减了训练图片数量从1000张,降为100张,epoch也下降为10,此外一次处理图片的数量增加为20张,但是训练速度并没有加快,相反1个epoch都运行不出结果,我想请问一下,这些超参数是不是不能随便调整?
第二 关于CRITIC_NUM,日常设为5,但你的源代码当step<25或者为500的整数倍时,CRITIC_NUM变为25,这个step及CRITIC_NUM的常数设置是不是与N_iteration有关系,当我的数据量减小时,我适当缩小了上述参数,但速度并没有加快。
第三 关于生成器的网络结构,你使用的WGAN,生成器我看代码是使用了17层网络结构,除了首层为conv+relu,最后一层为conv,中间15层为conv+relu+conv+bn, 中间的15层中的output = output2+output,这是使用了残差网络结构吗?我如果要加快运行速度,可是通过减少15层网络的数目来实现吗?wgan辨别器最后一层激活函数一般不是不使用sigmoid吗(如果单纯针对WGAN的定义来说)?
最后 我还看了那篇论文的源码,在modle.py的22行,有一句deconv2 = deconv2 + conv1,我想了好久不能理解,结构上并没有这个,这个属于残差网络结构吗?(我是小白)论文源码的CKPT文件
数据集链接已经失效,你这边还有其他可提供的链接吗,我想两个代码对照着来看,你的代码中的Checkpoints下载地址为交大链接https://jbox.sjtu.edu.cn/l/onFbdH,我进不去,你那边还有其他的链接地址吗?
十分感谢,期待你的回信。
你好,
调参是可以的,你可以通过调参去理解各个参数的含义,当然,在调参过程中,也容易有bug。
我先解释一下我这个代码的历程:
- 我最先看到的是别人的代码,也就是github上面acknowledge中的链接:https://github.com/manumathewthomas/ImageDenoisingGAN
- 我先修复了其中的bug,因为该代码无法运行。
- 修改了其中的损失函数的定义。
- 修改了G和D的模型:将G调整成了DCNN的模型结构,是残差网络的结构,可以尝试减少层次,我没有试过效果如何。
- 试图将GAN修改成WGAN(其实没有完全修改过来,有一些问题,比如你提到的D的sigmod函数,以及train.py里的训练过程其实都不算是真正的WGAN),建议你按照自己的对WGAN的认识去修改代码。
最新的Checkpoints文件链接(我不太记得当时的Checkpoints的版本了,如果这个运行结果有误可以再联系我):链接: https://pan.baidu.com/s/16cz8IZw8GRtW9C4JBItLBA 提取码: xttv
博主,
你好,很感谢你的耐心回复。我成功的复现了你的代码,并且可以用test.py进行测试去噪,但还有一些问题希望你能帮忙指导一下。
1 在dataset里的validation文件夹你是使用了八张图片,但训练过程中去噪后的Images图片文件夹为什么只显示了第二张去噪效果?这个validation里的八张图片是都参与到训练里了吗?
2 我使用cpu跑代码的时候,电脑很容易死机,我想问,如果使用cuda来加速,代码需要进行修改吗?
十分感谢,期待回信。
你好,
很高兴你可以复现这一段代码。
- validation是验证集,不会参与训练,只是输出第二张图片(你也可以改成别的图片,似乎是修改下图中红色框选出的部分)让你看它的去噪效果。建议你可以搜索一下机器学习中的 训练集、测试集、验证集之间的关系。
- CUDA加速不需要修改代码,但是要注意CUDA版本和GPU版本的兼容性,以及tensorflow版本的兼容性。
邮件二
博主你好,我看过您的一篇关于GAN去噪的博客,挺感兴趣的,然后进入你发的那个github连接,有几个问题就是:
1、这个可以搞成灰度图像(RGB换单通道)吗
2、训练集是只有噪声图像还是噪声和原始图像,我看github上数据集是噪声和原始合并在一起的,所以问一下
3、这个是不是先对VGG进行训练,然后再运行train那个py文件吗,emmm没看懂话,能否简单叙述一下这些文件流程吗,比如先搞什么,然后再训练什么,最后再测试。
您好,
- 这个可以换成灰度图像。具体需要修改:model.py中三通道改为单通道,utils.py中SSIM和PSNR的计算方式,以及损失函数loss function重定义。
- 训练集中是噪声图像和原始图像拼在一起的,通过utils.py中的split()等相关函数将其拆分的,你可以重新修改函数,把噪声图片和原始图片分开。(这个回复有误,请在下文查看)
- 我博客中的文章是阅读了https://github.com/manumathewthomas/ImageDenoisingGAN,然后写成的,需要用到VGG,是已经训练好的VGG。我github中的是我个人的代码,没有用到VGG,具体的文件流程可以看我的github中的readme.md。有什么后续的问题可以再问我。
博主你好,我看你的训练集是50张图片然后加不同标准差的高斯噪声,来形成1000数据集,就是想问一下这样做有什么好处,还有可不可以直接用一种标准差构造1000张不同图像作为训练集
你好,
如果我没有记错的话,我是拿50张图片加了相同标准差的高斯噪声后,生成了1000张图片,训练一个模型。然后用了这50张图片加了另一个相同标准差的高斯噪声后,又生成了1000张图片,训练了另一个模型。
总共用了三种不同的标准差,生成了3000张图片,训练了3个模型。
那这样数据集不是重复了吗,这样没有影响吗,还有就是我看utils程序博主能否帮忙讲解一下split函数那个,因为我认为博主你用split函数只是将1000张图片分成5张图片为一批次,没有看见将噪声与原图分开的那种。博主能否讲解一下,拜托拜托。
你好,
不存在数据重复的问题,不同的数据集训练出的模型不同,只能对应去噪【加了具有相同标准差的高斯噪声的图像】。比如你拿【标准差为25的高斯噪声图片】训练得到的模型去去噪【标准差为50的高斯噪声图片】,结果会很差(你可以试一下)
split函数确实是分割batch,真正分割【噪声|原图】的语句就在train.py中:
training_batch, groundtruth_batch = np.split(input_batch, 2, axis=2)
有问题欢迎再来信咨询。
博主你好,gan网络那个loss函数不是很理解,这样设定有什么特殊的意义吗?
博主,我尝试运行下你的代码报错显示运行内存不足,我用的是RTX2080,可以修改哪些地方,有什么好的建议吗?
你好,
loss function是自己设定的,目的是要减小loss function,让模型训练结果变好。因为最终评判图像去噪效果的指标是SSIM和PSNR,所以我直接把它们的线性和设置成了loss function(实际上可能不太专业?毕竟我也是入门瞎写的),你可以修改loss function优化模型。
关于内存和GPU,这个你可以尝试降低BatchSize,把每次批处理的batch=5降低。如果有条件的话,建议你采用更好的GPU服务器。
博主你好,我把batchsize设成1,修改了一部分代码,可以跑了,但在过程中两个loss值一直是负值,请问这个有没有什么影响?
负值没关系的,只要在减小就可以了。
邮件三
看到你的博客关于去噪的GAN网络,我看了github上的project,但是没有训练图像,所以跑不通,但是看你也有重新写,所以能不能发一下您的github链接?
https://github.com/iteapoy/GANDenoising/tree/master/dataset ,这里面有训练图像:training、training_25、training_50,
这些就是训练图像。
您好,请问上次问您的那个github码源,里面的图片文件太大了,所以问问有没有网盘文件什么的?
链接: https://pan.baidu.com/s/1MHkHIoEWDltVpkoSBzP88A 提取码: a93u
邮件四
博主您好,看了您CSDN上的博客《用生成对抗神经网络进行图像去噪【ImageDenoisingGAN】Image Denoising Using a Generative Adversarial》,博客链接:https://blog.csdn.net/iteapoy/article/details/90574803#commentBox.有两个小问题想请教一下您:(1)我看了您GitHub上的代码,您是生成三种不同标准差(15、25、50)的训练集,然后分别训练了3个模型,每个模型对应一种噪声标准差的图像去噪。正如您所说,我尝试了拿【标准差为25的高斯噪声图片】训练得到的模型去去噪【标准差为50的高斯噪声图片】,结果并不好。因此,我的第一个问题是:可否把这3种具有不同标准差的训练集合并到一起成为一个训练集,然后进行训练?这样训练出来得到一个模型,这个模型是否就可以对含有这3种标准差的噪声图片都能很好的去噪?(2)我的第二个问题是:博客中提到的ImageDenoisingGAN原文请问是否有原文或者下载链接可否发我一下?您博客里面引用的表格来自《Image Denoising via CNNs: An Adversarial Approach》,但是博客下面图中的网络结构和这篇文章不相同。期待您的回复,万分感谢!
您好,
- 这些合并到一起训练,训练效果更不好,甚至可能造成模型无法收敛的问题(可能是我模型的问题,你可以自己调参调整模型结构尝试一下)
- 博客内的文章来自github:原文和源代码: https://github.com/manumathewthomas/ImageDenoisingGAN
您好,
很高兴收到您得回信,非常感谢。我会尝试一下合并到一起训练看一下性能如何。
另外,请问您回信里说到的模型无法收敛是什么意思,应该怎么去判断模型收敛呀?
谢谢!
你好,
运行代码,会输出loss function,你可能会发现loss function是NAN,或者一会儿变大一会儿变小,始终没有趋于一个稳定的值。
Github issue
默认图模型超过2G
如题,请问这个问题怎么解决啊,训练的时候总是要停下来,你解决了么
没有解决,停下来就再提交一下命令,我是用了定时批处理命令。
shell/SSH服务器实现批处理文件每隔一段时间运行一次_iteapoy的博客-CSDN博客
你看看能否使用?
邮件五
请问一下台式机1050ti的显卡能跑GAN去噪的那个程序吗,慢点也可以
可以,你可以减小batch_size。
还有个问题,环境配置必须是python3.5,tensoflow1.1.0吗,我的是python3.6,tensorflow-gpu=1.6.0
python3.6可以,tensorflow-gpu=1.6.0只要不报错就可以
您好,有个问题没有想明白。就是生成网络去噪的原理是什么呀,是通过那个残差网络结构实现的吗
不是,和残差网络没关系。残差网络只是让训练效果更好或者更快一点。其实这张图里的噪点是高斯加性白噪声。什么是高斯加性白噪声?就是随机生成0-255之间的数字,加到原来的图像上。那么这个生成网络去噪的原理其实就是分析出这种噪声到底是怎么分布的,然后在噪声图像上减掉这个噪声,也就是加噪声的反向操作。而真实世界里的噪声图像没有这么简单,所以会更加复杂一些。
谢谢。主要是我现在想不明白这个网络怎么学习噪声也就是提取到噪声特征
是神经网络,这也涉及到神经网络的可解释性问题,在研究上是一个比较复杂的问题。而实际上,训练模型就是获取w和b。这个你需要学习一下神经网络。
那训练集里面将加噪声的图像和原图像拼在一起的意思就是既学习噪声也学习原图吗?神经网络学习了的,不同卷积核最后学习到的东西不同,意思是专门有提取噪声的卷积核么
拼在一起只是为了区分加了噪声的图像的原图是哪一张,为了最后比较去噪的图像和原图的差别,并不学习原图。具体的建议你运行一下代码,仔细看一下代码逻辑。
邮件六
博主:
您好!我是XX大学的一名研究生,最近在搞关于GAN去噪的研究,我看到了你的博客还有你的代码。
我现在在复现您的代码,训练集是64*64的RGB图片。我在用实验室的电脑上跑这个代码时发现代码能跑起来,但是1个step需要10多分钟,总共10000个step,而且是用GTX1080ti跑的。我在原来的代码读取数据集上做一些改动。请教博主,是读取数据集的原因还是其他的原因?
因为博主的训练集照片是噪声图和真实图拼在一起的,而我的训练集是噪声图放一个文件夹,真实图片放在另外一个文件夹。
所以batch1是噪声图的一个batch,batch2是真实图片的一个batch。在后面的train.py中改成
training_batch,groundtruth_batch = load_next_training_batch()
我把training_batch, groundtruth_batch = np.split(input_batch, 2, axis=2) 这行代码删除了。
你好,
不知道你之前做过CV方面的实验,我不清楚这个问题的规模算不算很大,我个人认为这个训练速度是比较正常的。和数据集没有太大关系。另外, 我这边的输出好像是每10个step输出一次?应该是每10多分钟10个step吧?这里表面上写了10000个step,实际上,2000多个step就趋于稳定了,可以结束训练,不需要真的运行10000个step的。
因为我之前没有接触过CV,目前也没有在做CV,所以具体step的含义可能有些忘记了。也许和1000张图片有关系?你可以试试减小图片数量,改成100张图片……或者减小batch_size。
如果还是有问题,欢迎再次来信。
博主:
您好!首先感谢楼主提的建议。听取了您的建议,我把训练集的图片减小到100张,batch_size改为1,训练的时候,每隔10个step(1个step相当于在一个batch上训练一次),打印一次损失,psnr,ssim.一开始的时候,在控制台上的结果出来很快,后来越来越慢。请教博主,这是怎么回事?是不是计算图的节点越来越多导致的?有什么好的解决方法?另外,博主用的是WGAN去噪,除了WGAN,还有其他的GAN可以推荐的吗?
越来越慢是正常的,和计算图的节点有关系。你看看训练结果怎么样?我只能说深度学习,尤其是图像处理,确实很耗算力,最好可以更新GPU。其他的GAN,我最近没有什么了解,你可以去查阅一下近年顶会论文,其实在CSDN上搜索GAN的变体,也能找到很多相关的代码,比如我这里随便找了一个,仅供参考。wgan-gp 代码使用_夏颜汐的博客-CSDN博客
邮件七
同学你好!
在CSDN中看到了你的博文,十分感谢你的复现,但看了代码以后有2个小问题,一个是为什么生成网络的输出是input-output,是意味着output在你的网络中意味着噪音么,这样的设计是否对你们的结果有所提升?还有一个小问题是,你们改动网络结构是否有大致的指导思想?十分感谢!祝双旦愉快!
祝好!
input-output确实是表示output是噪声,这个我是根据之前神经网络DnCNN改的。
关于调参,我也没有什么好的建议,看看吴恩达的调参指南,更好的方法是你对数学推导有了解,可以自己推导看看什么loss function,什么样的网络结构更好。
有问题欢迎后续来问
邮件八
博主:
您好!我是XX大学的一名研究生,最近也在做GAN的研究,看到了发的帖子还有你的代码。
然后我有个疑问,就是我在运行代码的时候,运行几十个epoch后,代码运行就会自动停止,再次开始运行的时候并不是从上次停止的epoch开始运行,这是什么原因造成的呢?
你清空checkpoint文件夹,重新训练仍然不行吗?不是从上一次结束的开始训练的吗?只要checkpoint文件夹里的序号是连上之前的序号,就是接着训练,唯一的问题是这两个序号之间可能断开比较多(但是没有影响)。
不知道你解决了没有,欢迎再次来信,也可以在我的blog下留言,提醒我收一下邮件,谢谢!
博主:
您好!很高兴收到您的回信。我会尝试一下您说的方法,此外我还有以下几个问题:
(1)我看到您在“默认图像大于2GB”的邮件下恢复的博客内容,是基于linux系统的回答,所以想请问博主您是在linux系统下运行的代码吗?
我是在windows系统下运行的代码,在运行几个周期后同样出现了“默认图像大于2GB”的错误,想请教一下有没有什么可能的解决方案呢?
(2)我看到您代码中test.py的程序,想请问以下这个test.py是否在测试训练完成的模型?如果是测试的话,为何程序中直接使用的generator函数,而不是加载所保存的训练好的模型呢?
(3)在训练和使用所训练模型的过程中,训练集、测试集、验证集及需要进行去噪的图像尺寸是否必须一致呢?
1.我是在GPU服务器上,你可以看看windows的cmd是否可以运行批处理命令:shell/SSH服务器实现批处理文件每隔一段时间运行一次_iteapoy的博客-CSDN博客。
2.test.py是测试模型,加载保存的模型,这里保存的是generator和discriminator的参数。
3.尺寸必须一致
邮件九
您好,在博客上看到您修改的GAN代码,想问您一个问题:如果我想训练灰度图可以吗,需要修改哪部分,现在是刚入手python,所以想请教一下您,谢谢!
首先,区分彩色图像与灰度图像:彩色图像是三通道(RGB),灰度图像是单通道。
然后,我提供一些修改的地方(可能不全面):
- model.py 中的3改为1.
- 将train.py中的SSIM_three(real_in, Gz)改成SSIM_one(real_in, Gz)
- 另外,用scipy读入图片的函数中的mode='RGB'可能要改成灰度图片的mode,具体请搜索函数scipy.misc.imread()的用法:
image = scipy.misc.imread(IMG_DIR + 'val_%d.png' % (step + 1), mode='RGB').astype('float32')
- 调用measure库的函数,也要改成相应的单通道(比如multichannel=False):
psnr = measure.compare_psnr(metrics_image, image, data_range=255)
ssim = measure.compare_ssim(metrics_image, image, multichannel=True, data_range=255, win_size=11)
以上仅提供一些思路,我没有试过能不能运行,可能会漏掉修改一些地方导致的bug,你可以读懂代码后再修改。
邮件十
同学你好,我最近在github上看到你的项目是关于gan图像去噪的,我比较感兴趣遂下载下来,但我在运行时候发现如下错误(如附件所示),遂我下载原项目denosing with gan也发现了同样的问题,我的版本和要求版本均一致,我在网上用了各种资料均没法解决,您知道是哪方面的问题嘛,不好意思,打扰了你的工作和学习时间,万分感谢!
我没有遇到过这个问题,其他给我发邮件的人也没有遇到这个问题。是不是你的scipy库版本太新了?或者安装不完全?你试试卸载重装scipy库或者降低一下scipy库的版本?
感谢回复和帮助,我将scipy的版本回退,现在能跑起已有的模型的,还有一个问题我想问你,我在之前在博主百度云盘下载的checkpoints里面只有噪声为15和25的模型,请问你还训练过50标准差的高斯噪声模型吗,如果有的话能否发我一份 感谢!
训练过,但是被我不小心删掉了。你可以先看看前面两个的效果,自己训练一下。