# CycleGAN論文閱讀 CycleGAN 論文:[(Paper)](https://arxiv.org/pdf/1703.10593.pdf) CycleGAN Github:[(Github)](https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix) ## Introduction CycleGAN 是一種將GAN應用於影像風格轉換(Image translation)的非監督式學習演算法。與Pix2Pix不同,CycleGAN的輸入資料不是pair-to-pair的資料,即只要提供兩個不同domain的影像資料,因此CycleGAN演算法可以解決不同domain的成對資料獲取困難的問題。 ![](https://i.imgur.com/2Rxx1K0.jpg) ## Method CycleGAN演算法是由兩個GAN (即兩個Generator與兩個Discriminator)所組成,如下圖(a)所示,${G}$, ${F}$為Generator;而${Dx}$, ${Dy}$為Discriminator。${G}$的輸入為x domain影像,經過模型後會生成y domain的影像;${F}$的輸入則是y domain影像,經模型後會生成x domain影像;${Dy}$ 為判別經${G}$轉換後的影像${G(x)}$是否屬於y domain;${Dx}$ 則判斷經${F}$轉換後的影像${F(x)}$是否屬於X domain。 ![](https://i.imgur.com/xIjPViq.jpg =170x150) ### Objective Function CycleGAN 的目標函數由Adversarial loss, cycle consistency loss, identity loss(可不用) 所組成: ![](https://i.imgur.com/l7ZScW4.jpg) #### Adversarial Loss GAN的優化函數 ![](https://i.imgur.com/o2zqj0J.jpg) #### Cycle consistency loss 計算某個domain影像經過G, F兩生成器轉換後回到原始domain時與原始影像的L1 loss ![](https://i.imgur.com/9uNKD76.jpg) #### Identity loss 計算影像經G,F轉換後影像與原始影像的L1 loss,目的是為了保持轉換後影像的顏色組成 ![](https://i.imgur.com/ofeggBb.jpg) ### 訓練流程 ![](https://i.imgur.com/h9ixShP.jpg) #### Generator 1. x domain 影像由${G}$經過轉換後得到$\hat{Y}$;y domain 影像由${F}$經過轉換後得到$\hat{X}$ 2. $\hat{Y}$及$\hat{X}$再分別經過${F}$及${G}$後得到$\hat{x}$及$\hat{y}$ 4. 藉由minimize $maxL_{GAN}$及$L_{cyc}$優化${G}$及${F}$ ![](https://i.imgur.com/DM5KZhd.jpg) #### Discriminator 1. 輸入x domain影像及$\hat{X}$並以${Dx}$辨別兩者使二者差距越大越好;輸入y domain影像及$\hat{Y}$並以${Dy}$辨別兩者使二者差距越大越好 2. 藉由maximize $L_{GAN}$優化${Dx}$與${Dy}$ ### 模型架構 #### Generator Generator提供兩種不同架構:(1) 包含6層residual blocks (2) 包含9層residual blocks (1) 架構如下:$c7s1-64$, $d128$, $d256$, $R256$, $R256$, $R256$, $R256$, $R256$, $R256$, $u128$, $u64$, $c7s1-3$ (2) 架構如下:$c7s1-64$, $d128$, $d256$, $R256$, $R256$, $R256$, $R256$, $R256$, $R256$, $R256$, $R256$, $R256$, $u128$, $u64$, $c7s1-3$ * $c7s1-k$ 代表一kernel size=$7x7$; stride=$1$; filter=$k$的 Convolution-InstanceNorm-ReLU層 * $dk$ 代表一kernel size=$3x3$; stride=$2$; filter=$k$的 Convolution-InstanceNorm-ReLU層 * $Rk$ 代表一kernel size=$3x3$; filter=$k$的residual blcok * $u3$ 代表一kernel size=$3x3$; stride=$0.5$; filter=$k$的fractional-strided-ConvolutionInstanceNorm-ReLU層 * leaky ReLU的斜率均為$0.2$ #### Discriminator 引用70x70的[PatchGAN](https://arxiv.org/pdf/1611.07004.pdf) discriminator架構:C64-C128-C256-C512,Ck為由一kernel size=4x4; stride=2 的 convolution-InstanceNorm-LeakyReLU層所組成,僅有C64例外為convolution-LeakyReLU組成 * leaky ReLU的斜率均為0.2 ### Implementation Detail * Learning rate: $0.0002$; starting linearly decay the rate to zero at $100$ epoch * Epoch: $200$ * Batch size: $1$ * λ: $10$ (Eq. 3)