目录
CycleGAN的原理(转)
CycleGAN与DCGAN的对比(转)
CycleGAN与pix2pix模型的对比(转)
在TensorFlow中实验CycleGAN(实战过程)
环境:tensorflow-gpu(此代码在cpu版本训练时间太长,最好用gpu版本)
python 3.6.8
Data preparing
Training
Export model
Inference
参考
CycleGAN是在2017年3月底放在arxiv(地址:[1703.10593] Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks)的一篇文章,同一时期还有两篇非常类似的DualGAN和DiscoGAN,简单来说,它们的功能就是:自动将某一类图片转换成另外一类图片。
这篇文章主要分成三个部分:
我们之前已经说过,CycleGAN的原理可以概述为:将一类图片转换成另一类图片。也就是说,现在有两个样本空间,X和Y,我们希望把X空间中的样本转换成Y空间中的样本。
因此,实际的目标就是学习从X到Y的映射。我们设这个映射为F。它就对应着GAN中的生成器,F可以将X中的图片x转换为Y中的图片F(x)。对于生成的图片,我们还需要GAN中的判别器来判别它是否为真实图片,由此构成对抗生成网络。设这个判别器为 。这样的话,根据这里的生成器和判别器,我们就可以构造一个GAN损失,表达式为:
参考:GAN学习指南:从原理入门到制作生成Demo。
但单纯的使用这一个损失是无法进行训练的。原因在于,映射F完全可以将所有x都映射为Y空间中的同一张图片,使损失无效化。对此,作者又提出了所谓的“循环一致性损失”(cycle consistency loss)。
我们再假设一个映射G,它可以将Y空间中的图片y转换为X中的图片G(y)。CycleGAN同时学习F和G两个映射,并要求 ,以及 。也就是说,将X的图片转换到Y空间后,应该还可以转换回来。这样就杜绝模型把所有X的图片都转换为Y空间中的同一张图片了。根据 和 ,循环一致性损失就定义为:
同时,我们为G也引入一个判别器 ,由此可以同样定义一个GAN的损失 ,最终的损失就由三部分组成:
为了进一步搞清楚CycleGAN的原理,我们可以拿它和其他几个GAN模型,如DCGAN、pix2pix模型进行对比。
先来看下DCGAN,它的整体框架和最原始的那篇GAN是一模一样的,在这个框架下,输入是一个噪声z,输出是一张图片(如下图),因此,我们实际只能随机生成图片,没有办法控制输出图片的样子,更不用说像CycleGAN一样做图片变换了。
pix2pix也可以做图像变换,它和CycleGAN的区别在于,pix2pix模型必须要求成对数据(paired data),而CycleGAN利用非成对数据也能进行训练(unpaired data)。
比如,我们希望训练一个将白天的照片转换为夜晚的模型。如果使用pix2pix模型,那么我们必须在搜集大量地点在白天和夜晚的两张对应图片,而使用CycleGAN只需同时搜集白天的图片和夜晚的图片,不必满足对应关系。因此CycleGAN的用途要比pix2pix更广泛,利用CycleGAN就可以做出更多有趣的应用。
代码参考vanhuyz/CycleGAN-TensorFlow。
Original paper: https://arxiv.org/abs/1703.10593
test data 数据下载地址https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/apple2orange.zip
trainA:apple
trainB:orange
build_data.py
生成两tfrecords文件
黄色划线部分可以不插入文件路径,各参数没有改变。
训练过程较长,可通过tensoboard实现查看。开始训练后,会产生以时间为名的文件夹,如:D:\zj\CGAN\checkpoints\20190104-1948
anaconda环境名为tensorflow(个人习惯)
调用tensorboard方式为,进入环境,activate tensorflow
tensorboard --logdir=D:\zj\CGAN\checkpoints\20190104-1948
如图,复制网址到谷歌或火狐浏览器,便可观察训练情况。
参考代码地址上,作者大概训练了60万step的数据,占内存比较大,故我只训练到10万就停了,用时13小时,产生数据占内存58G。
tensorboard上的效果,怎么说呢,很迷。
export_graph.py
checkpoint文件地址插入,XtoY _model输出格式为pb.
inference.py
这个文件只能一张一张的转换,并且程序运行一次就会提醒defined twice
consoles→restart kernel
不然就需要重启spyder才能再次运行此程序。
下图是几张例子。(效果真的很迷,不知道是不是训练时间短了。)
以上,第一次训练数据,其实遇见了许多问题,一个个查找解决方法的过程也是一种学习,所以想记录下来这个过程,望能给予你一些帮助。
多有不足,请多包涵。
望努力。
https://blog.csdn.net/qq_41185868/article/details/82988675
https://github.com/vanhuyz/CycleGAN-TensorFlow(代码部分)
https://zhuanlan.zhihu.com/p/28342644
https://blog.csdn.net/omnispace/article/details/78519805