cycleGAN学习

cycleGAN代码

先炮筒cycleGAN代码,看一下训练测试效果,之后看文章不懂的地方再结合代码看和理解

环境配置

conda create -n cycleGAN python
conda activate cycleGAN
conda install pytorch torchvision -c pytorch
conda install visdom dominate -c conda-forge
conda install pyyaml
安裝完毕,基本就可以跑cycleGAN的代码

程序运行

代码见:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
git clone https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix.git
下载数据:
bash ./datasets/download_cyclegan_dataset.sh maps
bash ./datasets/download_cyclegan_dataset.sh horse2zebra
在cycleGAN虚拟环境中运行程序
python train.py --dataroot ./datasets/maps --name maps_cyclegan --model cycle_gan
python train.py --dataroot ./datasets/horse2zebr --name horse_cyclegan --model cycle_gan
便开始地图和马的转换训练。静待结果

文章阅读

阅读之前的疑问

  1. 程序运行时显示的loss如下:
    (epoch: 1, iters: 600, time: 0.585, data: 0.001) D_A: 0.227 G_A: 0.405 cycle_A: 1.467 idt_A: 0.332 D_B: 0.210 G_B: 0.303 cycle_B: 0.681 idt_B: 0.621
    前几个loss好理解,但idit_A是什么意思?
  2. 训练时数据模式选择的是unaligned,同时,训练数据确实只是两类图像,各自放在A和B的文件夹。cycleGAN是如何解决非配对问题的。

文章翻译

  1. 图1:任意给两类无序的图像集X和Y,我们的算法能自动将一类图像转换为另一类(反之亦然):(左边)莫奈风格的画和Flickr上下载的图片;(中间)imagenet上的斑马和马;(右边)Flickr上夏天和冬天约塞米蒂国家公园照片;(应用示例)使用一系列著名的画家的化作,我们的方法能够将自然照片转换成他们的画作风格。
  2. 摘要:图像转换一大类视觉和图像问题,其目的是通过一系列对应的图像对训练数据学习的到输入图像和输出图像之间的映射。然而对于许多任务而言,成对的训练数据是很难得到的。本文提出了一种方法,不需要成对的训练数据便可以学习将图像从某一分布X映射到另一个分布Y。我们的目标是学习一种映射关系G:X → \rightarrow Y,这样生成图像G(X)的分布和真实图像Y的分布使用对抗损失进行区分。由于这种映射关系是高度约束的,因此我们能够用另一个相反的映射F:Y → \rightarrow X与之串联,并且引入了循环一致性损失使得F(G(X)) ≈ \approx X。在许多成对训练数据缺失的情况下我们的算法都能取得较好的结果,包括风格转换。目标变形,季节变换,图像质量提升等。与之前其他方法的定性比较也说明了我们算法的优越性。
  3. 图2 成对的训练数据(左)包含训练样本x i _i i,y i _i i(见文献[21])。与此不同,我们考虑使用非成对的训练数据(右),没有额外信息去配对训练数据x i _i i和y i _i i
  4. 图3(a)图表示我们的模型包含两个映射函数G:X → \rightarrow Y和F:Y → \rightarrow X以及他们对应的判别器D Y _Y Y和D X _X X。D Y _Y Y促进G将输入X转化得到的输出与目标分布Y无法区分,D X _X X和F则相反。为了进一步约束这种映射,我们引入了两个循环一致性损失函数,使得我们能够将一个分布转换到另一个分布的同时,我们能够转换回我们的原始分布。(b)图表示前向的循环一致性损失x → \rightarrow G(x) → \rightarrow F(G(x)) ≈ \approx x而(c)图则表示反向的循环一致性损失y → \rightarrow F(y) → \rightarrow G(F(x)) ≈ \approx y。
  5. 损失函数:损失函数由两部分构成
    对抗损失函数LGAN:LGAN(G,D Y _Y Y,X,Y) = Ey~pdata(y)[logD Y _Y Y(y)] + Ex~pdata(x)[log(1-D Y _Y Y(x))]
    循环一致性损失函数Lcycle(G,F) = Ex~pdata(x)[||F(G(x))-x|| 1 _1 1] + Ey~pdata(y)[||G(F(y))-y|| 1 _1 1]
    作者这里提到,他们尝试过对重构图像添加对抗损失,但是没有发现明显提升。
    注意到我们的模型可以看成两个自编码器:一个自编码器F&G:X → \rightarrow X,另一个自编码器G&F:Y → \rightarrow X。但是,每个自编码器内部又有其自己的结构,他们将图像转换为自己的同时,中间有一步将其转换为其他分布图像的操作。这个过程也可以看成对抗自编码[32]的一种特殊情况,即它是使用对抗损失去训练自编码的瓶颈层,使其与任意的目标分布相匹配。在本文中,对于X → \rightarrow X这个自编码器的目标分布便是Y。
    在5.1.4节,我们做了对比实验,只使用LGAN或者Lcyc,结果显示两个损失函数都扮演了重要角色,我们也城市只用一个方向的循环损失函数,结果也不太好。
  6. 网络结构:生成器和判别器patchGAN都是通用结构。
  7. 训练细节
  • LGAN损失函数去掉了log,稍微变了一下
  • 判别器处使用image pooling,储存50张图像
  • learning rate = 0.0002(前100epochs)递减至0(后100epochs)
  1. 结果如何评判
  • Amazon Mechanical Turk (AMT)感知学习方法(人去图片判断真假)
  • fully-convolutional network(FCN)方法 ,利用现有的语义分割网络对生成和真值图像进行判断,对得到的label图进行比较。
  1. 图4 :不同实验中的生成图像G(x)和重构图像F(G(x)),从上到下依次为:照片转换为塞尚风格,马转换为斑马,冬天和夏天风景转换,航空图和地图转换。
  2. 图5:不同方法在Cityscapes图像上训练得到的标签到图像的转换结果,从左到右依次为:输入,BiGAN结果,CoGAN结果,特征损失函数+GAN结果,SimGAN结果,cycleGAN结果,pix2pix结果,真值
  3. 图6:Google地图转换结果,从左到右依次为:输入,BiGAN结果,CoGAN结果,特征损失函数+GAN结果,SimGAN结果,cyclGAN结果,pix2pix结果,真值
  4. 图12:在图像风格转换实验中加入了Lidentity,即生成图像G(x)和输出图像x之间的L1范数,实验证明这个损失函数保证了图像转换后颜色不会有较大改变。
  5. 局限和讨论: 虽然我们的方法在许多例子中都能取得较好的结果,但结果并不一定都很好。图17展示了一些典型的失败的例子,在转换任务中,如果涉及到颜色和纹理的改变,则本文方法经常可以成功。我们也探索了一些需要结合结构改变的例子,则很少成功。例如,在狗和猫的转换任务中,学习到的生成器退化到对输入图像做出最小的改变(输入为狗的图片输出没变)。这个结果的原因可能是因为我们选择的生成器结构是为更好的外貌改变的表现而定制的。在一些不同和极端的转换任务中,特别是几何结构改变的例子,是未来重点要解决的问题。虽然我们的方法在许多例子中都能取得较好的结果,但结果并不一定都很好。图17展示了一些典型的失败的例子,在转换任务中,如果涉及到颜色和纹理的改变,则本文方法经常可以成功。我们也探索了一些需要结合结构改变的例子,则很少成功。例如,在狗和猫的转换任务中,学习到的生成器退化到对输入图像做出最小的改变(输入为狗的图片输出没变)。这个结果的原因可能是因为我们选择的生成器结构是为更好的外貌改变的表现而定制的。在一些不同和极端的转换任务中,特别是几何结构改变的例子,是未来重点要解决的问题。
    还有一些失败的例子是由训练数据集的分布特点造成的。比如马到斑马的转换任务中(图17)由于我们的模型是在Imagenet马和斑马图像集上训练得到,图像集中不包含人骑着马的图像,所以图17右侧图像中人的颜色也被改变了。
    我们也观察到成对数据训练得到的结果和我们非成对数据训练得到的结果之间还是有挥之不去的差距。在一些例子中,这种差距非常大,甚至不可能进行转换。例如,我们的方法在图像到标签转换任务中有时候会改变输出图像中的树和建筑物的标签,可能需要一些弱监督形式的约束来解决这个问题。综合弱监督或者半监督的数据可能会大幅度提高转换结果,而且只花了全监督系统的标注工作的一小部分工作量。
    尽管如此,在许多情况下,非成对数据可以大量获得并大量使用的。这篇文章推进了这种非监督设置的可能性边界。

解答总结

  1. 看代码得知,idt_A = netG_A(real_B),而loss_idt_A=||idt_A - real_B||1,和fake_B = netG_A(real_A)是不一样的,idetity loss是 这篇文章提出的,即将生成器输出作为它的输入,再与自身作比较,在画风转换任务中为了保证输入输出图像颜色一致,上述第12条图12已经说明。
  2. 文章只用了cycle的结构和损失函数,训练时从两类图像集中提取图像进行训练,并没有其他特殊操作。
  3. 总的看来,本文只是提出了cycle的结构这样的创新,但是根据实验来看,这种结构的创新确实对于非配对数据效果有提升。但是对于颜色纹理可以有较好效果,对于结构变化的非配对图像还是无法很好解决。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值