[논문 리뷰] Pix2Pix: Image-to-Image Translation with CGAN

2022. 5. 22. 21:39논문리뷰/GAN

이번 논문 리뷰는 GAN 논문 중에서도 많은 인용 수를 자랑하는 Pix2Pix이다. Conditional Generative Adversarial Network(CGAN)을 사용하여 한 이미지를 다른 domain(style)의 이미지로 변환하는 방법을 제안하였고 기존의 방식들은 특정 task마다 loss나 architecture를 specific하게 design해주었던 것과 달리 하나의 structure를 사용하여 모든 tasks에 적용할 수 있도록 base model을 제공했다는 점이 큰 contribution이라고 할 수 있다. 


1. Problems of Tranditional methods

 

Computer vision에는 무수한 task들이 존재하는데, 많은 문제들을 input image를 어떠한 다른 양상의 output image로 "translating"하는 것이라고 생각해볼 수 있다. 위 그림을 예로 들면, 흑백 이미지를 컬러 이미지로 바꾸는 Colorization이나 edge 이미지를 semantic 이미지로 바꾸는 task가 있다. 

 

Traditional methods들은 이런 여러 tasks들을 별 개의 문제들이라 생각하고 해당 문제에 맞추어 model structure나 loss를 design해주었는데.... 굳이 그래야 하나? 라는 것이 저자들의 의견이다. 왜냐면 결국 그 task들이 하고자 하는 것은 pixel들로 부터 pixel들을 예측하는 문제로써 공통적인 목표를 가진다고 생각할 수 있기 때문이다. 저자들은 위 예와 같이 어떤 한 이미지를 다른 양상의 이미지로 바꾸는 task를 "image-to-image translation"이라고 정의하고, 같은 문제로써 바라보면서 공통으로 사용할 수 있는 framework를 제안한다.

 

두번째로 "image-to-image translation" task들에 대해서 Convolutional Neural Network(CNN)을 사용한 방법들이 많이 연구되었는데 loss를 effective하게 잘 design하지 않으면 결과가 제대로 나오지 않는 문제가 있었다. 예를 들어, 만약 CNN에게 그냥 predicted pixels와 ground truth간의 Euclidean distance(L2)를 학습하게 만들면 outputs을 평균화하는 방향으로 minimize되기 때문에 output이 blurry해진다.

 

 

이에 대한 대책으로 논문에서는 GAN을 제안한다. Generative Adversarial Network는 단순히 이미지 간의 매핑을 하는 것이 아니라 분포를 비슷하게 만들도록 학습을 하기 때문에 현실에 있을 법한 이미지를 만드는데 특화되어 있어서 위와 같이 blurry 결과가 나오지 않도록 도와준다. 

 

2. Method

2.1 Objective

논문이 CGAN을 base로 하기 때문에 이를 먼저 알아둘 필요가 있다. 여기서는 자세한 설명은 생략하고 최대한 직관적이게 쓰도록 하겠다. 

 

먼저 GAN의 Objective loss는 다음과 같다.

$$L_{GAN}(G,D) = \mathbb{E}_y[logD(y)] + \mathbb{E}_{x,z}[log(1-D(G(z))]$$

일반적인 GAN은 Generator G에 대해서는 minimize를 하고, Discriminator D에 대해서는 maximize를 하면서 minmax 게임을 통해  서로 대칭적인 학습을 한다. 간단히 말해서 G는 D가 진짜와 잘 구별할 수 없을 정도로 진짜같은 가짜 이미지를 만드려고 하고, D는 G가 만든 가짜 이미지를 진짜와 잘 구별하도록 노력할 것이다. 

 

Conditional GAN은 기존 GAN loss에서 condition x만 추가된 것이다. 

$$ L_{cGAN}(G,D) = \mathbb{E}_y[logD(x, y)] + \mathbb{E}_{x,z}[log(1-D(G(x, z))]$$

원래 GAN은 생성하는 output이 어떤 종류가 나올 지 제어하는 것이 불가능하였는데 위와 같이 원하는 class의 정보를 Discriminator와 Gerator의 input과 같이 넣어 줌으로써 제어가 가능하게 만든 것이 Conditional GAN의 전부이다.

 

pix2pix 논문에서는 위 conditional information x가 이미지 자체이고 추가적으로 이전 연구에서 tranditional loss와 GAN loss를 같이 사용하는 것이 효과적이었기 때문에 L1 loss를 같이 사용해준다. 즉, Generator가 Discriminator를 속이는 것 뿐만 아니라 ground truth 이미지와 비슷해지도록 학습이 될 것이다. 

**L2보다 L1이 blurry output이 만들어질 확률이 낮기 때문에 L1을 사용.

 

또 재밌는 점으로 random noise z를 일반적으로 사용하지 않는데, 이는 Generator가 이를 무시하도록 학습이 되기 때문이라고 한다. 즉, 넣어도 별 소용이 없거나 안 좋은 방향으로 영향을 준다는 것이다. 이 z가 없기 때문에 mapping 과정에서 stochastic한 결과를 내지 못하고 deterministic한 결과를 내보내는 문제가 있지만 논문에서는 pix2pix가 다양한 결과를 내기 보다는 있을 법한 결과를 만들어내는 것에 더 의의가 있다고 보고 이를 future work로써 남겨두었다. 대신 조금의 stochasitic가 생기도록 layer에 dropout을 적용하였다.

$$L_{pix2pix}(G, D) = \mathbb{E}_y[logD(x, y)] + \mathbb{E}_{x}[log(1-D(G(x))] + \lambda L_{L1}(G)$$

**Dropout이 기존과 다르게 test에서도 남아있는 채로 prediction을 한다.

 

2.2 Network Architectures

Skip Connections

Image-to-Image translation 문제들을 살펴보면 structure는 그대로 유지하면서 surface apperance만 바뀌게 된다. 즉, input의 structure가 거의 그대로 output에 사용된다는 것이다. 이를 기반으로 논문에서는 Encoder-decoder network에 residual connection을 사용하여 input의 information을 공유하고 단순 concatenation을 통해서 이를 decoder의 features와 aggregate한다.

PatchGAN

 

필자도 PatchGAN을 읽어보지 않았지만 여기서 응용한 방법은 간단하므로 걱정할 필요없다. 

 

L2 loss와 L1 loss는 high frequency 정보는 잘 살려내지 못해서 blurry image가 나오지만 low frequncy 정보는 잘 잡아낸다. 따라서 저자들은 GAN discriminator는 high-frequency structure를 모델링하도록 제한하고 L1 term이 low frequency 정보를 잡아내도록 역할 분담을 한다. 

 

high frequency 정보를 잘 만들어내려고 할 때, 이미지 전체를 보는 것보다 지역적으로 보는 것이 더 효율 적일 것이다. 그리고 여기서 patchGAN이 등장한다. 방법은 간단하다. 그냥 Discriminator가 진짜 이미지와 가짜 이미지를 구별할 때 전체 이미지를 보는 것이 아니라 NxN patch 단위로 prediction 하는 것이다. 이때 patch size N은 전체 이미지 크기보다 훨씬 작기 때문에 더 작은 parameters와 빠른 running time을 가진다.

 

Pix2Pix에서는 256x256 크기의 ground truth와 generated fake image를 concat한 후에 위 그림처럼 convolution layer를 거쳐 최종 feature map이 30x30x1 크기를 가지게 된다. output feature map의 픽셀 1개의 receptive field는 입력 이미지의 70x70에 해당한다.

 

Optimization and Inference

train과 test 과정에서 몇 가지 특이한 점을 가지고 있다. 

 

먼저 Generator G를 학습할 때 $log(1-D(x, G(x, z))$를 minimize하기 보다는 $log(D(x, G(x, z))$를 maximize하도록 바꾸었다. 두번째로는 Discriminator D를 학습할 때 objective를 2로 나누어서 Generator G보다 더 천천히 학습이 되도록 만들었다. 이는 학습 초기에 Generator가 가짜 이미지를 너무 못 만들기 때문에 상대적으로 Discriminator D의 task가 쉬워서 학습이 진행되지 않는 문제를 해결하기 위함이라고 생각한다.

 

그리고 Test time에서 특이한 점으로는 Dropout을 그대로 사용한다는 점과 batch normalization 또한 train batch의 statistics를 사용하지 않고 test batch의 statistics을 사용한다는 점이다. dropout은 stochatic을 더해주기 위함이라고 볼 수 있는데 batch normalization은 왜 저렇게 바꾸었는 지 잘 모르겠다 ㅎㅎ..

 

3. Experiments

먼저 segmantic images를 실제 사진과 같이 translate하는 task에 대해서 pix2pix를 loss를 달리해가며 실험한 결과이다. L1 loss와 cGAN loss를 같이 썼을 때 가장 높은 성능을 보이며 qualitative 측면에서도 좋은 것을 확인할 수 있다. CGAN loss만을 사용했을 때 더 sharp한 결과를 보여주지만 visual artifacts가 생기는 문제가 있다고 한다.

 

 

두 번째로 Encoder-decoder와 U-Net 구조를 비교하였는데, detail 측면에서 차이가 꽤 심한 것을 볼 수 있다. 

 

다음으로는 Patch GAN의 patch size를 변경해가면서 성능을 살펴본 실험이다. 1x1의 경우 매우 blurry한 것을 볼 수 있고 16x16은 충분히 sharp하지만 artifacts가 다수 생겨났고 70x70 일 때 그러한 artifacts가 사라진 것을 볼 수 있다. 마지막으로 full image인 286x286에 대해서는 quality 측면에서 큰 변화가 없고 오히려 FCN-score가 낮은 결과가 나왔다. 저자들의 추측으로는 full image GAN이 70x70 PatchGAN보다 훨씬 많은 파라메터 수와 더 큰 depth를 가지고 있기 때문에 학습이 더 어려워 나타난 결과라고 한다.

 

이외에도 다양한 task들을 실험하였는데, 주목할 만한 부분은 photo로부터 Segmentation labels를 생성하는 task에서는 단순 L1 Regression이 cGAN보다 더 높은 성능을 보여준다는 것이다. 저자들은 처음으로 GAN을 사용하여 성공적으로 labels을 generating 했다는 부분을 언급하고 cGAN이 objective function 관점에서 L1 loss보다 더 ambiguous하여서 상대적으로 discrete한 labels를 생성하는 능력이 떨어졌다라고 설명한다.