Submit : Isola, Phillip, et al. CVPR (2017)
Paper : arxiv.org/pdf/1611.07004.pdf
Code : github.com/phillipi/pix2pix
0. Abstract
cGAN을 이용하여 한 유형의 이미지를 다른 유형의 이미지를 변환할 수 있는 framework를 제시했습니다. GAN을 사용하기 때문에 L1, L2 loss를 사용할 때보다 더 선명한 이미지를 얻을 수 있습니다. 또한, L1 loss를 사용했기 때문에 pixel 간의 관계를 고려한 scturcted loss 개념도 적용되었습니다.
이미지의 빈 영역을 그럴싸하게 채우러면 대상 영상의 semantic을 정확하게 이해해야 합니다. 그러나, L1/L2 loss를 이용하는 것만으로는 복원 영상이 불선명해지는 현상을 피할 수 없습니다. 이 문제를 해결하기 위해 Adversarial Loss를 사용합니다.
1. Method
1.1. Objective
Pix2Pix는 이미지가 진짜 이미지인지를 나타내는 Adversarial Loss, 생성된 이미지가 gt와 유사한 정도를 나타내는 Reconstruction Loss가 있습니다.
Adversarial Loss는 cGAN의 loss와 매우 유사합니다. Generator는 입력 이미지 x를 넣으면 출력 이미지 y가 생성됩니다. 기존 GAN과 달리 noise z를 넣지는 않습니다. Discriminator에는 입력 영상 x와, 생성된 영상 G(x) or 원래 영상 y가 같이 들어가서, 이미지가 진짜인지 가짜인지 판별하게 됩니다.
Reconstruction Loss는 L1 loss인데, 생성된 이미지와 ground truth와의 유사한 정도를 나타냅니다. Discriminator가 가짜 이미지를 판별하는 역할은 그대로 둔 채로, Generator가 실제와 더 유사한 이미지를 생성할 수 있도록 하기 위해 사용합니다. Context Encoder와 달리 L1 loss만 사용했는데, L2 loss를 사용했을 때보다 이미지가 덜 흐릿했기 때문입니다.
pix2pix의 최종 loss function은 두 loss를 합친 값입니다.
1.2. Network Architecture
Generator, Discriminator 둘 다 DCGAN의 구조를 기본으로 조금 변형해서 사용합니다.. Generator, discriminator 둘 다 convolution-BatchNorm-ReLu 형태의 모듈을 사용합니다.
(1) Generator에 skip 구조 사용
Generator의 encoder, decoder를 합치면 bottleneck 구조의 모델로 볼 수 있습니다. Pix2Pix는 고해상도 이미지를 고해상도 이미지로 변환하는 만큼, input 이미지에 있던 이미지의 색상이나, edge의 위치 등의 low-level 정보는 보존될 필요가 있습니다. 따라서 같은 level을 가진 encoder의 layer와 decoder의 layer간에 skip conenction을 추가합니다. 즉, layer가 n개 있으면, i번째 layer의 n-i번째 layer 간에 skip connection이 존재합니다.
(2) Markovian discriminator (PatchGAN)
L1, L2 loss를 사용하면 이미지가 흐릿해진다는 현상이 보고되어 왔습니다. 이 문제를 해결하기 위해 GAN의 Discriminator는 high-frequency structure만을 모델링하도록 제한하고, low-frequency correctness는 L1 loss에서 담당합니다.
2. Experiments
L1 loss만을 사용했을 때에도 타당한 결과를 출력하긴 했지만 매우 흐릿한 이미지가 생성되었습니다. cGAN loss만 사용하면 이미지가 선명하긴 하지만, gt에 없던 구조물들이 추가로 생성되는 문제점이 있습니다. lambda 값을 100으로 주어 두 loss를 둘 다 사용했을 때, gt에 없던 구조물들이 추가 생성되는 것을 감소시킬 수 있습니다.
cGAN은 선명한 이미지를 만들려고 하는 효과가 있기 때문에, input label map에도 없는 것들을 만들어내기도 합니다. 한편, L1은 불명확한 점이 있으면 흐릿해지는 경향이 있어서, 색상들이 평균으로 수렴하기 때문에 회색에 가까운 색상이 많이 나옵니다. 즉 색상의 분포가 줄어들기 때문에 회색에 가까운 색상을 띄게 됩니다. 하지만 cGAN을 쓰면 색상의 분포가 gt에 가깝도록 조정되어, 색상이 더 다양해집니다.
U-Net 구조는 low-level 정도를 network 간에 전달하는 shortcut입니다. L1 loss만 사용했을 땐 shortcut을 넣어 준다고 해서 이미지가 크게 좋아지진 않았습니다. 하지만 cGAN까지 같이 쓸 경우, shortcut을 넣어 주면 생성되는 이미지의 품질이 크게 좋아지는 것을 확인했습니다.
patch size를 1x1로 한 PixelGAN은 이미지의 색상에 기여하는 것 빼곤 효과가 없었습니다. 16x16 PatchGAN은 이미지는 선명했지만 불필요한 구조물들이 생기는 문제점이 있습니다. 70x70 PatchGAN의 성능이 제일 좋았습니다, 286x286 ImageGAN은 70x70 PatchGAN과 비슷한 성능을 보였으나, 파라미터 수가 더 많이 필요해서 학습이 조금 더 어렵습니다.
지도와 위성 이미지 간을 변환하는 실험을 진행했습니다. 실제 이미지와 생성된 이미지를 둘 다 제시한 뒤, 실험자가 생각하는 실제 이미지를 고르는 실험입니다. 생성된 이미지를 실제 이미지라고 선택하는 비율이 높을수록, 생성된 이미지가 실제 같다고 볼 수 있습니다.
단순히 L1 loss를 썼을 때보다, cGAN까지 같이 사용했을 때, Turker(Amazon Mechanical Tulk service 작업자)들이 실제 이미지라고 태깅하는 비율이 더 높았습니다. 또한, 이미지 채색 Task에서도 타 model에 비해 생성된 이미지가 실제 이미지라고 태깅된 비율이 더 높았습니다.
실제 이미지에서 label을 추출하는 Sementic segmentation 실험도 진행했습니다. label은 discrete한 분포를 보이는 만큼 L1 loss만 사용했을 때 성능이 가장 좋았습니다. 논문 저자들은, GAN은 continuous-valued variation을 가짐에도 불구하고 discrete한 label을 어느 정도 생성해 내는 것에 흥미로워했습니다.
pix2pix의 첫 발표 이후 community에서 다양한 모델이 나왔습니다. 스케치를 고양이로 바꾸거나, 배경을 지우거나, 스케치를 초상화 등으로 바꾸는 등 다양한 응용들이 있었습니다. 이 중에는 원래 논문에서 의도하지 않았던 부분까지 있었습니다. 즉, pix2pix는 단순히 label과 image 간을 상호 변환하는 모델이 아니라, 일반적인 image-to-image translation 문제를 해결할 때 사용할 수 있다는 가능성을 보여주었습니다.