0


对抗生成网络GAN系列——CycleGAN简介及图片春冬变换案例

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题

🍊往期回顾:对抗生成网络GAN系列——GAN原理及手写数字生成小案例    对抗生成网络GAN系列——DCGAN简介及人脸图像生成案例

🍊近期目标:写好专栏的每一篇文章

🍊支持小苏:点赞👍🏼、收藏⭐、留言📩

文章目录

对抗生成网络GAN系列——CycleGAN简介及风景照春冬变换案例

写在前面

​   在前面我们已经介绍过了最原始的GAN网络和DCGAN,这篇文章我将来为大家介绍CycleGAN,并且基于CycleGAN实现一个小demo——将一张图片进行季节转换,即从冬天变换到夏天和从夏天变换到冬天。🍹🍹🍹

​  大家已经看到了CycleGAN,应该对GAN已经有了一定的了解,因此我不会对GAN的原理进行详细的讲解,只会叙述CycleGAN的独到之处。如若你还对GAN的原理不够清楚,下列两篇文章获取能帮到您:

  • 对抗生成网络GAN系列——GAN原理及手写数字生成小案例 🍁🍁🍁
  • 对抗生成网络GAN系列——DCGAN简介及人脸图像生成案例 🍁🍁🍁

​  在正式讲解之前,我给大家先展示一下CycleGAN可以做哪些事:

horse2zebra

普通马变斑马

2222

各种风格转换

准备好了嘛,下面就正式发车了。🚖🚖🚖

CycleGAN核心思想

  这一部分我会来介绍CycleGAN的核心思想,相信你了解后会和我有一样的感觉,那就是这个设计太巧妙了!!!🌼🌼🌼

  首先我们还是来介绍一下这篇论文的全称—— **

Unpaired Image-to-Image Translationusing Cycle-Consistent Adversarial Networks

,即非成对图像转换循环一致性对抗网络。**我们一点点的来解释,首先什么是非对称图像呢?其实啊,这里的非对称图像指的是我们的训练样本是不相关的。在之前的一些GAN转换实验中,往往都需要成对的图片数据,例如pix2pix,而成对的图片数据是很难获取的,于是CycleGAN对数据的要求就大大降低,不需要成对图像,即非对称图像,这样就让CycleGAN的应用场景就变得非常丰富。下图展示了对称数据和非对称数据的区别:

image-20220724214429247

  接下来再来讲讲什么是循环一致性对抗网络?这个就是本文的核心思想,听懂这个那么这篇论文你就搞懂了,这就为大家慢慢道来!!!🌼🌼🌼

​  我们先来明确一下这篇文章的目标,即有两个域的图像,分别为域X和域Y,例如域X表示夏季图片、域Y表示冬季图片,现期望将这两个域的图片互相转换,即输入域X的夏季图片生成器输出域Y的冬季图片或输入域Y的冬季图片生成器输出域X的夏季图片。我们来考虑考虑传统的GAN网络能否完成这项任务,示意图如下:

​  域X的图片经生成器G不断生成图片G(x),而

     D
    
    
     Y
    
   
  
  
   D_Y
  
 
DY​ 鉴别生成的图片和域Y中的图片,这样就构成了一个GAN网络,这样看似乎也可以完成任务,会将域X中的图片不断像域Y转换,但是呢,大家能否看出这里似乎还是存在着一些漏洞,如下图所示:

image-20220725114813626
​  上图我们的确是将域X中图片转换成了域Y中冬季图片风格,但是你会发现转换后的图片和原始图片没有任何关系,即GAN网络只学到了把一张夏季图片传化为冬季图片,但至于转换后的冬季图片和原始夏季图片有没有关系没有学习到,这样的话这个网络肯定是不符合实际要求的。那么CycleGAN就提出了循环一致性网络,如下图所示:

image-20220725131900754

​   现对上图做相关解释,首先我们先对相关字母做一定了解,如下表所示:

       x
      
     
     
      x
     
    
   x域X中的图像数据
   
    
     
      
       
        Y
       
       
        ^
       
      
     
     
      {\rm{\hat Y}}
     
    
   Y^**
    
     
      
       
        x
       
      
      
       x
      
     
    x经生成器
    
     
      
       
        G
       
      
      
       G
      
     
    G生成的图片域**
   
    
     
      
       
        x
       
       
        ^
       
      
     
     
      {\rm{\hat x}}
     
    
   x^**
    
     
      
       
        
         Y
        
        
         ^
        
       
      
      
       {\rm{\hat Y}}
      
     
    Y^ 中图片经生成器
    
     
      
       
        F
       
      
      
       F
      
     
    F生成的数据**
   
    
     
      
       G
      
     
     
      G
     
    
   G**生成器,用于将图片从域
    
     
      
       
        X
       
      
      
       X
      
     
    X到域
    
     
      
       
        Y
       
      
      
       Y
      
     
    Y生成**
   
    
     
      
       F
      
     
     
      F
     
    
   F**生成器,用于将图片从域
    
     
      
       
        Y
       
      
      
       Y
      
     
    Y到域
    
     
      
       
        X
       
      
      
       X
      
     
    X生成**
   
    
     
      
       
        D
       
       
        Y
       
      
     
     
      D_Y
     
    
   DY​**判别器,用于判别图片是来自域
    
     
      
       
        Y
       
      
      
       Y
      
     
    Y还是
    
     
      
       
        G
       
       
        (
       
       
        x
       
       
        )
       
      
      
       G(x)
      
     
    G(x)**

​  说明了这些字母后,我们来看上图:首先域

    X
   
  
  
   X
  
 
X中的数据

 
  
   
    x
   
  
  
   x
  
 
x经过生成器

 
  
   
    G
   
  
  
   G
  
 
G会变成 

 
  
   
    
     Y
    
    
     ^
    
   
  
  
   {\rm{\hat Y}}
  
 
Y^ 中的图片

 
  
   
    
     y
    
    
     ^
    
   
  
  
   {\rm{\hat y}}
  
 
y^​ ,即现在夏季的图片已经转换成冬季的图片,不过此时夏冬两季图片的相关性我们是不知的,可能很差,而我们期望夏冬两季的图片相关性强,即区别只会体现在季节的差异上。于是我们会将

 
  
   
    
     Y
    
    
     ^
    
   
  
  
   {\rm{\hat Y}}
  
 
Y^ 中的图片

 
  
   
    
     y
    
    
     ^
    
   
  
  
   {\rm{\hat y}}
  
 
y^​ 再经过生成器

 
  
   
    F
   
  
  
   F
  
 
F变换回来,即将冬季图片再转换成夏季图片,结果记为

 
  
   
    
     x
    
    
     ^
    
   
  
  
   {\rm{\hat x}}
  
 
x^ 。然后我们就设置损失让

 
  
   
    x
   
  
  
   x
  
 
x和

 
  
   
    
     x
    
    
     ^
    
   
  
  
   {\rm{\hat x}}
  
 
x^ 尽可能一样,这样就能控制生成器G生成的冬季图片和原始夏季图片相关性很强了。上述循环一致性大致过程为:**
  
   
    
     
      x
     
     
      →
     
     
      G
     
     
      (
     
     
      x
     
     
      )
     
     
      →
     
     
      F
     
     
      (
     
     
      G
     
     
      (
     
     
      x
     
     
      )
     
     
      )
     
     
      ≈
     
     
      
       x
      
      
       ^
      
     
    
    
     x \to G(x) \to F(G(x)) \approx \hat x
    
   
  x→G(x)→F(G(x))≈x^**,即让

 
  
   
    x
   
  
  
   x
  
 
x和

 
  
   
    
     x
    
    
     ^
    
   
  
  
   {\rm{\hat x}}
  
 
x^尽可能相似。

​  上文介绍完了从域

    X
   
  
  
   X
  
 
X转域

 
  
   
    Y
   
  
  
   Y
  
 
Y的过程,那从域

 
  
   
    X
   
  
  
   X
  
 
X转域

 
  
   
    Y
   
  
  
   Y
  
 
Y是一样的,即尽可能让 

 
  
   
    y
   
  
  
   y
  
 
y 和 

 
  
   
    
     y
    
    
     ^
    
   
  
  
   {\rm{\hat y}}
  
 
y^​ 相似**【
  
   
    
     
      y
     
     
      →
     
     
      F
     
     
      (
     
     
      y
     
     
      )
     
     
      →
     
     
      G
     
     
      (
     
     
      F
     
     
      (
     
     
      y
     
     
      )
     
     
      )
     
     
      ≈
     
     
      
       y
      
      
       ^
      
     
    
    
     y \to F(y) \to G(F(y)) \approx \hat y
    
   
  y→F(y)→G(F(y))≈y^​】**,过程如下:

image-20220725141506141

​  其实这样就把CycleGAN的核心思想都介绍完了,这里再贴上论文中关于这部分的一张完整的图供大家参考:

image-20220725141827484

CycleGAN损失函数

  其实介绍完理论部分,那么损失函数就很简单了,一共有三部分组成,如下表所示:【呜呜呜,这里编辑的markdown表格在网页中显示总是乱码,大家将就看一下图片吧🎃】
image.png#pic_center
  而总的损失为上述三部分之和,公式如下:

     L
    
    
     (
    
    
     G
    
    
     ,
    
    
     F
    
    
     ,
    
    
     
      D
     
     
      X
     
    
    
     ,
    
    
     
      D
     
     
      Y
     
    
    
     )
    
    
     =
    
    
     
      L
     
     
      
       G
      
      
       A
      
      
       N
      
     
    
    
     (
    
    
     G
    
    
     ,
    
    
     
      D
     
     
      Y
     
    
    
     ,
    
    
     X
    
    
     ,
    
    
     Y
    
    
     )
    
    
     +
    
    
     
      L
     
     
      
       G
      
      
       A
      
      
       N
      
     
    
    
     (
    
    
     G
    
    
     ,
    
    
     
      D
     
     
      X
     
    
    
     ,
    
    
     Y
    
    
     ,
    
    
     X
    
    
     )
    
    
     +
    
    
     λ
    
    
     
      L
     
     
      
       c
      
      
       y
      
      
       c
      
     
    
    
     (
    
    
     G
    
    
     ,
    
    
     F
    
    
     )
    
   
   
    L(G,F,{D_X},{D_Y}) = {L_{GAN}}(G,{D_Y},X,Y) + {L_{GAN}}(G,{D_X},Y,X) + \lambda {L_{cyc}}(G,F)
   
  
 L(G,F,DX​,DY​)=LGAN​(G,DY​,X,Y)+LGAN​(G,DX​,Y,X)+λLcyc​(G,F)

  其中

    λ
   
  
  
   \lambda
  
 
λ 表示循环一致损失所占比重,论文中设置

 
  
   
    λ
   
   
    =
   
   
    10
   
  
  
   \lambda = 10
  
 
λ=10。

CycleGAN图像夏冬转换案例

​  实验论文中也给除了Github地址,连接如下:CycleGAN 🍁🍁🍁

​  这里我就不带大家一点点的解读代码了,相信你阅读了我之前的文章看这个代码应该能大致了解,我之前几期做过一些代码的解读,但是我自己觉得描述并不算很清晰,有的想要表达的点也没有表述清楚,所以我觉得代码部分大家还是看视频讲解比较高效,但是不论怎样,阅读代码你一定要自己亲自调试调试,这样你会有很大的收获!!!

  这里我就放一张我运行的结果图片,从夏季转换到冬季,如下:

Snipaste_2022-07-24_23-28-59

  可以看出,变换的效果还是不错的。【注意:我只再Googleclab上训练了15个epoch就得动了这样的效果,大家可以增大epoch进行训练。】

论文下载

CycleGAN论文下载 🍁🍁🍁

参考连接

精读CycleGAN论文

生成式對抗網路 (Generative Adversarial Network, GAN) (四) – Cycle GAN

如若文章对你有所帮助,那就🛴🛴🛴

在这里插入图片描述


本文转载自: https://blog.csdn.net/qq_47233366/article/details/127395413
版权归原作者 秃头小苏 所有, 如有侵权,请联系我们删除。

“对抗生成网络GAN系列——CycleGAN简介及图片春冬变换案例”的评论:

还没有评论