프로젝트

[Kaggle Projects] I’m Something of a Painter Myself (1): CycleGAN 논문

gomduribo 2023. 8. 28. 17:14

https://www.kaggle.com/competitions/gan-getting-started/overview

 

I’m Something of a Painter Myself | Kaggle

 

www.kaggle.com

GAN 개념에 대해서 공부하고 GAN을 활용한 간단한 프로젝트를 해보면 좋을거같아서, 캐글에서 이미지를 Monet 스타일로 바꿔주는 문제를 풀어보기로 했다.

 

찾아보니 StyleGAN, CycleGAN등 여러방법이 있는거같았는데, GAN에 익숙하지 않고, 캐글 문제 설명에서 제시해준 CycleGAN을 이용해서 풀어보기로 했다.

 

논문을 먼저 읽어보고 이해하고, 완벽하게는 아니더라도 직접 구현해서, 공식 github과 비교해보기로 했다. 

 

* 논문정리가 익숙하지 않아서 길고 장확하고, 번역투가 많습니다. 또한 틀리게 해석한 부분이 다수 존재합니다. 

 

CycleGAN paper: https://arxiv.org/pdf/1703.10593.pdf

 

Abstract

기존의 image-to-image translation에서는 한쌍의 input image와 output image간의 mapping을 학습했지만, 많은 task에서는 이렇게 짝지어진 training data가 부족합니다. 따라서 논문에서는 짝지어진 이미지 없이 source domain X에서 target domain Y로 이미지를 변환하기 위한 접근법을 제시합니다.

 

Introduction

과거의 image-to-image translation 연구(ex. grayscale을 color로, edge-map을 사진으로 변환하는 등..)에서는 translation을 supervised learning형태로 이뤄냈습니다. 즉, 어떤 한쌍의 x,y(x= 변환하고자 하는 대상 이미지, y= 반영하고자 하는 특성을 가진 이미지)를 가지고 translation을 진행했지만, 이렇게 한쌍의 짝지어진(paired) 이미지 세트를 구하는것에는 어려움이 존재합니다. 따라서, 논문에서는 어떤 특성을 가진 이미지의 모음에서 특징을 추출하여 그 특성으로 다른 이미지의 모음을 변환하는 방법을 제시합니다. 다만, 기존과는 다르게 짝지어진(paired) 학습 데이터을 사용하지 않고 그 방법을 제시합니다. 

 

Generator(G)는 x(변환하고자 하는 대상 이미지)로부터 y^=G(x)를 만들어 낼것이고, Discriminator는 y(반영하고자 하는 특성을 가진 이미지)와 y^을 구분하도록 학습될 것입니다. 그리고 결국 G가 만들어낸 Y^의 분포가 Y와 동일한 분포가 되도록 학습이 되는것을 목표로 합니다. 

하지만, 이러한 G만으로 '의미있는' x와y 짝을 만들어 낼 수 없었습니다. G가 x로부터 만들어내는 y^의 분포가 y와 매핑되는 방식은 정말 많기 때문인데요(원본 이미지를 어떤 스타일에 따라서 변환했을때, 원본이미지의 구성은 유지하되 색,질감,패턴 이런것들만 변화해야하는데, 원본이미지의 구성이 완전 달라져버리는 문제가 발생한다...는 것으로 이해), 따라서 논문에서는 단순 G 하나만을 사용하지 않고, G가 하는 연산의 반대를 진행하는 F를 추가합니다. 즉, translation이 'cycle consistent'가 되게 해주었습니다. 즉, G(x)=y^가 F연산을 거친다면 x와 같아지도록 구현을 한것입니다.  

 

그림1. G와 그 역함수가 되는 F (출처: https://arxiv.org/pdf/1703.10593.pdf)

 

Formulation

위의 사진과 introduction에서 말했듯이, CycleGAN은 G와 F 두개의 mapping을 가집니다. 또한 Dx, Dy 두개의 discriminator를 가지는데, Dx는 x(변환하고자 하는 대상 이미지)와 y(반영하고자 하는 특성을 가진 이미지)로부터 변환된 이미지인 F(y)를 구별하고, Dy는 y(반영하고자 하는 특성을 가진 이미지)와 x(변환하고자 하는 대상 이미지)로부터 변환된 이미지인 G(x)를 구별합니다. 

또한 목적함수는 adversarial loss와 cycle consistency loss를 가집니다. adversarial loss는 생성된 이미지(F(y)와 G(x))를 각각 x와 y의 분포와 matching하는 역할을 하고, cycle consistency loss는 G,F가 서로 모순되는것을 방지하는 역할을 합니다. 

 

Adversarial loss

G와 Dy에 대한 adversarial loss는 다음과 같습니다. 

 

G와 Dy에 대한 adversarial loss (출처:https://arxiv.org/pdf/1703.10593.pdf)

 

F와 Dx에 대한 adversarial loss도 항을 바꿔어 동일하게 쓸수 있을것입니다.

 

Cycle consistency loss

mapping function인 F와 G는 똑같은 이미지를 입력받았을떄, 변환하고자하는 domain에 랜덤한 이미지로 변환할 수 있습니다(똑같은 입력, 다른 출력값). 따라서, adversarial loss만으로는 mapping function인 F와 G가 변환하고자 하는 대상 이미지인 x를 원하는 결과값인 y로 mapping할 수 없을 것입니다. 

따라서 target domain에서 mapping될 수 있는 범위를 줄여주기 위해서는 그림1과같이 cycle-consistent한 loss가 추가되어야합니다. 

cycle consistency loss (출처:https://arxiv.org/pdf/1703.10593.pdf)

위의 수식과 같이  x->G(x)->F(G(x))으로 되었을때 x와 F(G(x))의, y->F(y)->G(F(y))으로 되었을때 y와 F(G(x))의 cycle consistency loss를 구합니다. 

 

Full Objective

위의 loss함수를 모두 반영한다면, 전체 목적함수는 다음과 같을 것입니다.

 

full objective (출처: https://arxiv.org/pdf/1703.10593.pdf)

 

여기서 cycle consistency loss앞에 붙은 람다는 두 목적함수의 상대적 중요성을 반영하기 위해서 사용됩니다. 

 

Implementation

- Network Architecture

CycleGAN논문에서는 이 논문(Perceptual Losses for Real-Time Style Transfer and Super-Resolution,Justin Johnson, Alexandre Alahi, Li Fei-Fei, https://arxiv.org/pdf/1603.08155.pdf)을 참고해서 아키텍처를 구성했다고 합니다.

해당 모델은 3개의 Conv layer, 7개의 residual block, 1/2 stride을 가지는 두개의  fractionally-strided convolution, 그리고 한개의 Conv layer가 feature를 RGB에 매핑시킵니다.

또한 instance normalization을 사용하였고, discriminator로 70x70의 PatchGAN을 사용했는데, 이 PatchGAN은 이미지상의 70x70 크기의 겹치는 patch가 진짜인지 가짜인지 판별합니다.

 

- Training details

논문은 모델의 학습을 안정화시키기 위해서 두가지 기법을 사용했다고 합니다.

첫번째로 adversarial loss에서 least-squares loss로 음이 될수있는 log 목적함수를 제거했습니다.

두번째로 버퍼를 만들어 50개의 생성된 이미지를 저장해두고, discriminator를 업데이트함으로써 model oscillation을 줄였다고 합니다. 

* model oscillation이란 GAN의 학습 시 나타나는 문제점의 하나로, generator와 discriminator가 번갈아가면서 학습될때, 서로 속고 속이며 제자리를 맴돌아 수렴할 수 없는 상황을 말합니다.(출처: http://dl-ai.blogspot.com/2017/08/gan-problems.html)

 

 

Result 이후 부분까지 정리하려면 시간이 너무 오래 걸릴거같아, 논문에 실린 결과사진을 첨부하고 여기까지만 정리하겠습니다. 

 

Output of CycleGAN (출처: https://arxiv.org/pdf/1703.10593.pdf)