이번에 정리해볼 논문은 pix2pix 모델을 설명하고 있는 Image-to-mage Translation with Conditional Adversarial Networks 논문이다. 사실 Cycle GAN 논문을 정리하다보니, 이 pix2pix 논문을 한번 읽고 넘어가면 훨씬 이해가 잘 될것 같아서 읽게 되었다.
(두 논문은 같은 Berkeley AI Research(BAIR) 랩실에서 발표된 논문이기도 하다!)
등장 배경 : Image-to-image Translation
일단 pix2pix 모델은 위의 사진에서 볼 수 있듯이 image-to-image translation 모델이다.
지금까지의 이미지를 이미지로 변환하는 이 image-to-image translation 모델들은 predict pixels from pixels라는 동일한 setting에도 불구하고 경계선만 있는 이미지 복원, 흑백 이미지를 색이 있는 이미지로 변경, semantic label map을 이미지로 복원 등 다양한 문제들에 있어서 각각 따로 연구되어왔다.
따라서 이 논문에서 추구하고자 하는 목표는 바로 이러한 변환 문제들을 위한 어떤 일반적인 framework를 개발하는 것이다.
이러한 방향에 있어서는 이미 Convolutional neural nets 즉 CNN이라는 좋은 모델이 있다.
즉, paired images(짝을 이루는 이미지들 : 흑백/색, 윤곽/실제이미지)들이 충분히 존재한다면, 그것들을 이용해 신경망을 학습시키면 되는 것이다.
이때, 대부분의 CNN은 결과의 quality를 알려주는 loss function을 최소화하는 방향으로 학습된다. (L1 혹은 L2 loss를 최소화시키는 방식)
이러한 학습과정 자체는 자동이지만, 결과를 잘 나오게 하기 위해서는 여전히 수많은 manual effort가 필요하다.
즉, 우리는 여전히 CNN에게 우리가 무엇을 최소화하고 싶은지를 알려주어야한다.
이때 논문에서 표현하기를 우리는 '디오니소스에게 모든 것을 황금으로 바꾸는 손을 달라고 말했던 마이더스 왕'처럼 우리가 바라는 것에 대해 말할때 조심해야할 필요가 있다고 말하고 있다(ㅋㅋ)
왜 그런 것일까?
1) 우리는 CNN이 우리의 예측값과 실제값 사이의 Euclidean 거리를 줄여주길 원해!
먼저 우리의 첫번째 요구가 위와 같다고 생각해보자.
단순히 일반적인 CNN 모델처럼 우리가 예측한, 우리가 만들어낸 이미지와 실제 이미지 사이의 유클라디안 거리를 줄여주기를 바라는 것이다.
그럼 방금 말한 것을 바탕으로 Loss function을 식으로 써보면 다음과 같다.
그러면 이 Loss만 가지고 학습을 진행한 결과를 살펴보자.
왼쪽이 우리가 넣어준 진짜 사진에 대해 픽셀 별로 창문, 문, 벽 같은 것들을 사람이 라벨링한 데이터이고, 우리는 generator의 neural net을 통해 이 이미지를 가장 오른쪽의 실제 이미지와 유사한 데이터를 생성해내고 싶다.
하지만 실제 output은 가운데 사진과 같이 뿌옇게(blurring) 나오게된다.
왜그런 것일까? 이건 분명 우리의 요구가 잘못된 것이다.
generator가 새로운 이미지를 생성할 때 input인 라벨만 보았을 때 벽이 나무로 되어있는지, 흰색 벽돌로 되어있는지 등을 알 수 없다. 따라서 이런 상황에 부딪힌 generator는 어느 것을 택해도 loss가 너무 커지지 않도록 중간의 어떤 애매한 것을 택하는 경향을 보이게 된다. 즉 Average를 학습하려고 하는 것이기 때문에 low frequency한 부분에는 효과적이지만 high frequency를 살리지 못하게 된다!
이러한 방식으로 생성된 이미지는 사람인 우리가 봐도 뭔가 애매하고 진짜 같지 않은 이미지가 된다.그럼 이제 우리의 두번째 요구가 어느정도 정해진 것 같다.
2) 우리는 생성된 이미지가 조금 더 실제 같기를 원해!
자, 이게 바로 우리의 두번째 요구이다.
하지만 이 요구에 부합하는 모델이 이미 존재한다!
바로 GAN이다. (GAN에 대한 설명은 여기)
GAN은 실제와 가짜를 구분하지 못하도록 Discriminator와 Generator가 서로 경쟁하며 학습을 진행하기 때문에 이미지가 뿌옇게 나오는 현상을 없앨 수 있다. (뿌연 이미지는 실제 사진처럼 보일리 없으니까!)
자, 그럼 우리는 이미 존재하는 GAN의 Loss function을 가져오기만 하면되는 것 아닐까?
그런데 이때, 그냥 일반적인 GAN을 이용하는 것은 아니다.
바로 cGAN이라는 Conditional Generative Adversarial Nets라는 GAN의 변형모델을 이용하게 된다.
cGAN이 그럼 GAN과 어떻게 다른지를 살펴보며, 왜 GAN이 아닌 cGAN을 이용하는지 살펴보자.
cGAN
cGAN은 앞서 말했듯이 GAN의 변형모델이다. 따라서 GAN과 학습 방법 자체는 별로 다를 것이 없다.
이때 cGAN의 구조는 다음과 같다.
Conditional GAN은 출력물에 처음으로 조건을 주어 통제하려는 시도에서 만들어졌다.
예를들어 MNIST 손글씨 숫자 데이터셋을 출력하는 GAN을 훈련시켰다고 했을 때, 그 결과물은 random noise vector z의 값에 따라서 무작위 손글씨이겠지만, 어떤 특정 숫자를 출력할 수는 없었다. 따라서 이러한 GAN에 어떤 특정한 조건(condition)을 부여하게 된 것이다.
위의 도식화된 그림을 보면, 기존 GAN의 모델에서 어떤 추가정보 y라는 조건이 새로 등장한다.
이 y를 통해서 우리는 조건부 생성모델을 만들게 되는데, y는 어떤 보조정보라도 될 수 있다.
예를 들어 class label이나 다른 modality(양식)의 데이터 등이다. 우리는 이 y를 G와 D의 input layer에 추가로 같이 집어넣게 된다.
G에서는 input noise인 z와 y가 합쳐진 형태가 들어가게 되고, D에서는 x와 y가 input으로 들어가게 된다.
이때 학습 과정은 GAN과 거의 동일하기 때문에 cGAN의 loss function은 다음과 같은 수식으로 표현할 수 있다.
즉, GAN의 손실함수에서 D와 G에 들어가는 input이 단지 조건부로 바뀐 것인데, 이것은 y가 조건으로 주어진 상황에서의 결과값을 사용한다고 이해하면 된다. (실제 들어가는 형태는 합쳐진 형태)
그렇다면 pix2pix논문에서는 처음으로 이미지 변환문제에 바로 이 cGAN을 사용하게 되는데 GAN이 아닌 왜 conditional GAN을 사용한 것일까?
우리는 지금 image-to-image translation문제에 대해 고민하고있다.
따라서 어떤 이미지가 주어졌을 때 그 이미지를 우리가 원하는 방향으로 변환하고싶다.
앞에서 계속 언급했듯이 흑백을 컬러로 변환한다던지, 윤곽만 있는 그림을 원래 그림으로 만들고 싶다던지 하는 문제들이 바로 다양한 변환의 예시가 될 수 있다.
이때, GAN은 어떤 데이터 분포를 입력받아 실제에 가깝게 데이터를 생성하는 모델이기 때문에 주어진 이미지와 구분하기 힘든 그저 진짜 같은 새로운 이미지를 생성하게 된다.
하지만, CGAN은 만약 우리가 조건으로 input image를 넣어준다면 입력이미지가 조건이 되는 것이기 때문에 입력이미지와 '연관된'이미지를 생성할 수 있게 되는 것이다!!
(한마디로 정리해보면!!
random noise vector : z, output : y, input : x 일때,
GAN : 랜덤 노이즈 벡터 z에서 출력 이미지 y로 mapping을 학습, G : z -> y
CGAN : 관찰된 이미지 x와 랜덤 노이즈 벡터 z를 y로 학습, G : x,z -> y)
또한 이미지 변환문제는 per-pixel 분류 또는 회귀문제로 다뤄져왔는데, 이러한 공식화는 output space가 'unstructured'이며 각 pixel과 인접한 pixel간에는 서로 영향을 끼치지 않고 독립적이라는 올바르지 않은 가정이 들어가 있다. 하지만 cGAN은 pixel과 pixel간의 연관관계 (joint configuration)까지 고려한 'structured loss'개념이 자동으로 적용이 되기 때문에 더욱 적합하다고 말할 수 있다.
2가지 요구사항을 모두 수렴한 최종 loss function!
이제 우리는 마이더스의 손이 되는 것을 잘 피해가며(ㅎ) 두가지의 요구사항들을 생각해보았다.
이제 이 두가지를 이용해서 pix2pix의 최종 loss function을 수식으로 정리해보자.
먼저 두가지 loss function을 다시 복기해보자.
첫번째로, 만들어낸 이미지와 실제 이미지간의 격차를 줄여주는 loss function인 L1 loss function이다.
우리는 cGAN을 사용하기 때문에 generator에 인자로 x,z가 들어가게된다.
(논문에서는 L2보다 L1을 사용하는 것이 덜 흐린 이미지를 생성하는데 도움이 되었다고 언급한다.)
두번째로, cGAN의 loss function이다.
따라서 우리가 구하고자하는 최종 Loss function은 이 두가지를 결합한
이러한 수식으로 나타낼 수 있다!
(이때 람다는 두개의 loss를 몇대몇의 비율로 합칠거냐!)
그런데 이때 한가지 의문이 들 수 있다. 바로 cGAN Loss 면 충분해보이는데 왜 구지 L1 loss를 합쳤는가?이다.
이유는 바로 아무리 cGAN이 input x를 참고한다 하더라고 generator G의 궁극적인 관심사는 오직 D를 속이는 것이기 때문에 x가 상대적으로 덜 반영될 수 있기 때문이다. 따라서 만들어진 이미지 G(x,z)와 대응되는 y이미지를 직접 비교하는 L1 Loss를 추가할 필요가 있다.
네트워크 구조(Network Architectures)
이제 논문에서 말하고 있는 모델 구조를 살펴보자.
먼저 우리는 DCGAN을 G와 D의 기본 모델로 하였고 둘다 convolution-Batchnorm-ReLU 구조를 따른다.
Generator
Generator의 기본 구조는 U-Net이다.
이미지 변환 문제에서 어려운 점은 고해상도 input grid를 고해상도 output grid로 mapping하는 것이다.
심지어 표면의 외관은 다른데 각각 같은 근본적인 구조를 가진다는 것이다.
이때 U-Net은 Encoder-Decoder 구조에 그림과 같이 대칭되는 skip-connection을 추가한 형태이다.
이와 같이 skip-connection을 추가하면, decoder가 학습이 잘 되지 않는 문제를 해결할 수 있다.
pix2pix는 입력이미지와 목표로 하는 이미지가 상당히 유사하기 때문에, 이와 같은 구조를 기본으로 선택한 것으로 보인다.
Discriminator
L1 Loss를 사용하는 것은 위에서 설명했듯 참고 이미지와 비슷한 이미지를 만드는 것을 돕는다. 이것은 low-frequency에서 너무 다른 이미지가 생기는 것을 막아준다. 즉, Discriminator는 high-frequency에서 구분하는 것에 주 목적을 둔다.
Discriminator의 기본구조는 Patch-GAN이다.
이미지를 N X N 크기의 Patch로 나누고, 그 각각의 Patch에 대해서 참/거짓을 판별한 뒤, 참이 많으면 참으로, 거짓이 많으면 거짓으로 분류하는 방법이다.
더 지역적인 특징이 반영되므로, high-frequency에서 구분하는 데 적절하다.
N이 작을수록, 전체 매개변수의 수가 작아지므로, 학습 속도가 빨라진다.
Experiments
위 논문에는 다양한 실험들이 많이 등장하고 있다.(원논문을 살펴보면 흥미로운 것들이 많다.)
그 중 이 실험은 Loss를 변경해가면서 실험한 결과이다.
이미지를 통해 확인할 수 있듯이 cGAN과 L1 loss를 모두 사용한 경우가 가장 훌륭한 결과가 나온 것을 알 수 있다!
위 실험은 encoder-decoder구조와 U-Net을 비교한 실험이다.
U-Net의 성능이 더 좋은 것을 확인할 수 있다.
위 실험은 Patch GAN에서 patch의 개수를 다양하게 하는 실험이다.
Patch의 개수가 늘어날 수록 선명도가 상승하는 것을 확인할 수 있다.
이외에도 본 논문에는 다양한 실험들이 많으니 궁금하다면 본 논문을 확인해보는 것을 추천한다!
링크 : Pix2pix
결과적으로 이 논문은 Image-to-Image translation 문제에 대해서 Conditional adversarial network가 괜찮은 접근법이라는 것을 보여줌과 동시에 이 네트워크가 넓은 범위의 경우에 대해 적합하다는 것 또한 보여주고 있다.
<참고자료>
greeksharifa.github.io/generative%20model/2019/04/07/Pix2Pix/
'논문' 카테고리의 다른 글
[LSGAN] Least Squares Generative Adversarial Netorks 논문 정리 (0) | 2021.04.21 |
---|---|
[CycleGAN] Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 논문 리뷰 (2) | 2021.04.15 |
[GAN] Generative Adversarial Network 논문 정리 (2) | 2021.04.04 |
[VAE] Auto-Encoding Variational Bayes 논문 정리(2) (0) | 2021.04.03 |
[VAE] Auto-Encoding Variational Bayes 논문 정리(1) (3) | 2021.04.01 |