paper link : https://arxiv.org/pdf/1703.10593.pdf
image to image translation은 paired training examples를 이용하여 input image에서 output image로, 하나의 domain에 속하는 이미지를 다른 domain의 이미지로 매핑합니다.
이 모델은 다음과 같은 문제점을 가지고 있습니다.
CycleGAN의 목적은 GAN 모델의 목적과 동일하게 그럴듯한 이미지를 만드는 것이며, 추가적으로 서로 다른 domain 간의 mapping을 할 수 있는 함수를 학습하는 것입니다.
따라서 (a)에서와 같이 Generator와 Discriminator의 적대적 학습을 통해 사실적인 이미지 생성을 할 수 있도록 합니다.
(b)와 (c)는 주기적 일관성을 유지할 수 있도록 손실함수를 추가한 것을 도식화한 것입니다.
(b)는 domain x의 데이터를 받아 G가 생성한 데이터를 다시 F를 통해 를 생성하는 것을 의미하며 (c)는 반대의 과정을 의미합니다.
데이터 생성이 끝난 후 실제 데이터 x와 생성된 데이터 F(G(x)) (c에서는 y와 G(F(y)))의 L1 loss를 구하여 실제 데이터와 생성 데이터의 데이터 분포를 유사하도록 학습합니다.
[Cycle consistent loss]
학습 과정 중 과정과 를 동시에 학습하며 주기적 일관성을 가지도록 하는 것의 의미는 서로 다른 domain간의 underlying relationship을 학습하는 것과 동일한 의미를 가집니다.
이 학습을 통해 첫번째 문제점을 해결할 수 있습니다. 서로 다른 domain의 데이터셋의 relationship을 학습함으로써 명시적으로 pairing된 데이터셋의 필요성이 줄어들게 됩니다.
또한 논문의 저자는 L1 loss는 실제 데이터와 생성 데이터를 유사하도록 만드는 강력한 동력을 제공한다고 언급하였습니다. 따라서 두 번째 문제점인 mode-collapse 문제는 output data가 다시 input data로 변환될 수 있는, 적정 임계점을 L1 Loss를 통해 지정함으로써 해결할 수 있다고 언급하였습니다.
위와 같은 encoder - decoder 구조는 원본 데이터는 품질 저하나 detail부분에서의 손실이 있을 수 있습니다.
CycleGAN에서는 입력 이미지의 화질 보존과 Detail 보존을 위해 ResNet 구조를 사용합니다.
위와 같이 skip connection을 사용함으로써 encoding과정을 거치지 않은 데이터를 이용하여 화질과 detail을 보존할 수 있습니다.
self.loss_recon_a = self.L1loss(x_a_recon, x_a)
self.loss_recon_b = self.L1loss(x_b_recon, x_b)
self.loss_cycle_a = self.L1loss(x_a_cycle, x_a)
self.loss_cycle_b = self.L1loss(x_b_cycle, x_b)
self.loss_adver_a = self.GAN_loss(realism_a_modif, True).mean()
self.loss_adver_b = self.GAN_loss(realism_b_modif, True).mean()
self.loss_gen = self.config['w']['recon']*self.loss_recon_a + self.config['w']['class']*self.loss_class_a + \
self.config['w']['cycle']*self.loss_cycle_a + self.config['w']['adver']*self.loss_adver_a + \
self.config['w']['recon']*self.loss_recon_b + self.config['w']['class']*self.loss_class_b + \
self.config['w']['cycle']*self.loss_cycle_b + self.config['w']['adver']*self.loss_adver_b\
cycle gan[pytorch] 코드는 다음에서 확인할 수 있습니다.
https://github.com/eriklindernoren/PyTorch-GAN/tree/master/implementations/cyclegan