Pix2Pix paper review (CVRP2017)
Summary
Problem
application마다 똑같은 구조를 사용하는데 여러 가지 loss를 사용하는 게 맘에 안 든다. loss를 디자인하기 위해서는 전문적인 지식도 필요하다. loss도 한번 배워보자.
Inspiration
adversarial network가 잘되니깐 이리저리 적용해본거 같음. 어차피 어떤 application이던 image to image니깐 필요한 정보만 준다면 같은 구조로도 잘 되지 않을까?
Solution
conditional GAN을 사용한다. Generator는 UNet base로 만들고, discriminator는 patchGAN으로 만든다. GAN loss는 vanila GAN loss + L1 norm을 사용한다.
UNet은 skipconnection을 사용해서 bottleneck을 통과하지 못하는 정보들을 output단으로 전달해 준다.
L1 norm은 blurry한 output을 만드는 경향이 있는데 그 말을 바꿔서 생각하면 L1을 사용하면 low frequency 정보를 전달할 수 있다고 해석할 수 있다. 그러면 high frequency information은 patchGAN의 discriminator구조를 사용하면 잡아낼 수 있다고 생각함. patchGAN은 11X11 같은 patch마다 real, fake를 구분하기 때문에 좀 더 디테일한 정보들을 보기 때문에 high frequency 정보를 복원할 수 있다고 생각함.
즉 정리하면 low frequency 정보는 L1 loss로 학습하고, high frequency 정보는 PatchGAN discriminator로 학습한다.
Main contribution
- cGAN을 여러 application에 실험해서 결과가 잘 나오는지 확인해 본다.
- Application specific loss design이 필요 없는 simple frame work
Architecture
- Generator
- Unet based generator, AE (Auto Encoder) 구조 2개를 실험해 봤다. 결과는 Unet base 승
- 'Decoder stack'이라고 표현한 거는 U-Net논문 읽으면 알 수 있을 듯. 좀 더 자세한 설명은 논문 6.Appendix에 있음.
- Discriminator
- Discriminator는 patch 사이즈를 바꿔가면서 실험을 해봤고 너무 작은 patch에서는 uncertainty region이 많았다. 실험에서는 70X70이 가장 적절해 보이는 결과가 나왔다.
Loss function
그냥 conditional GAN loss + L1 distance을 사용했다. 말이 conditional GAN이지 vanilla GAN loss랑 똑같다.
Insteresting point of paper
- conditional GAN이라는 이미 존재하는걸 자기들이 나름 의미를 붙여서 해석했다. loss function design이 필요 없는 archtecture라고 약을 팔았다. 결국 더 좋은 결과를 얻기 위해서는 application specific 혹은 task specific한 loss design이 필요해 보임.
Strength
- 다양한 application에 적용해 봤고 많이 실험해 봤다. GAN의 활용성을 보여준 논문.
Weakness
- naive한 loss를 사용하니깐 성능이 그렇게 좋지는 않았다.
- label → image
- blurry하다.
- 차를 만들 때 전체적인 틀은 잘 따라가는데 후미등이라든지 하는 detail한 부분은 잘 못 만든다.
- output 이미지 deformation이 심하다.
- inpainting
- 형태는 물론이고 color가 많이 다르다.
- failure case
- input 이미지가 sparse하거나 unusual한 input은 잘 못했다. 근데 unusual한 input에 잘 동작하지 못하는 건 딥러닝의 고질적인 문제이므로 pix2pix만의 문제는 아닌 것으로 보인다.
Appendix
- structured loss
- output이 어떤 구조를 이룰 수 있도록 만들어주는 loss, 예를 들어서 문장 번역을 할 때 car boar 보다는 car door가 더 나올 확률이 높다. 이런 structure를 고려해서 예측하는 걸 structured prediction이라고 한다. cGAN은 input이라는 추가적인 정보를 discriminator에 넣어줘서 output이 input까지 고려해서 나올 수 있도록 guide를 잡아주는 것이다.
- 좀 더 쉽게 말하면 그냥 input → output만 하는 게 아니라 input + additional infomation → structured output이 나올 수 있도록 만듦.