Text2Image Synthesis Paper Review

Text2Image Synthesis  Paper Review

오늘은 텍스트에서 이미지를 합성하는 태스크에 대해서 다뤄볼 예정이다. 2016년부터 2020년까지 중요한 논문 4개를 다룬다.

Text-to-Image Synthesis

GAN-INT-CLS : Generative Adersarial Text to Image Synthesis(16.05)
StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks(16.12)
AttnGAN: Fine-Grained Text to Image Generation with Attentional Generative Adversarial Networks(17.11)

GAN-INT-CLS

이 논문이 Text를 통해 Image를 생성하는 이 Text2Image 태스크의 시초가 된 논문이다. 2016년에 나온 모델인 만큼 GAN 자체의 성능이 많이 발전되지 않았기 떄문에 2015년에 나온 DCGAN을 기반으로 한다.

Model

설명 텍스트를 인코딩하여 latent vector z에 합쳐서 generate하고 discriminator에서도 합쳐서 discriminate한다. 다만 이렇게만 하면 디테일을 살리기가 굉장히 어려워진다.

그래서 training할 때 새로운 테크닉을 도입한다.

GAN-CLS : 기존 Discriminator에서는 real image + right text는 true, generate image + right text는 false가 나오도록 한다. 그러나 여기에서는 real image + right text는 true, real image + wrong text & generate image + right text 모두 false가 되도록 한다.

GAN-INT : 두번째 테크닉은 텍스트를 인코딩한 값을 2개를 만들고 이 2개의 값을 interpolation하면 그 값은 텍스트를 인코딩한 값일 것이라고 가정한다. 그 사이 값으로 이미지를 생성하였을 때 discriminator를 속일 수 있게 generator가 training한다. interpolation할 때는 중점으로 하는 것이 제일 잘된다고 한다.

위 2가지 테크닉을 모두 사용하였을 때 훨씬 더 좋은 품질의 이미지를 생성한다.

StackGAN

이 StackGAN은 기존의 Text-to-Image Synthesis model이 저화질에 대해서만 가능하다는 단점을 해결하기 위해 만들어진 모델이다. 이 문제를 해결하기 위해 64*64 이미지를 먼저 생성하고 이 이미지를 통해 다시 256*256이미지를 생성한다. 2단계로 고화질 이미지를 생성하여 StackGAN이라 부른다.

Model

기본적인 아이디어는 T2I Vanilla GAN과 비슷하다. Generator와 Discriminator 모두 텍스트 임베딩된 값을 같이 모델에 넣는다. 여기서 핵심은 스텝이 2단계로 이루어지는 것, 그리고 conditioning augmentation이다.

먼저 conditioning augmentation을 보자. pre-train된 모델로 텍스트를 임베딩하고 그 임베딩한 벡터들과 real image 사이의 Kullback-Leibler divergence를 계산한다. 이 loss 값을 generator가 최소화하는 방향으로 training한다. 그러면 real image의 범위와 embedding vector의 범위를 매칭시키게 되면서 embedding vector로 image를 생성할 때 real image와 비슷하게 생성이 된다.

GAN-INT-CLS에서는 embedding vector의 중점 벡터를 통해 Discriminator를 training시켰지만 StackGAN에서는 embedding vector들을 통해 샘플링된 vector를 선택한다. 이 방법이 conditioning augmentation이다. 조금 더 넓은 범위를 다루고 다양성이 생김으로서 Discriminator를 더 잘 training시킬 수 있다.

Stage-1 GAN에서 64*64 이미지를 생성하고 이 이미지를 통해 첫번째 GAN discriminator를 속인다. 그 다음 이 이미지를 다운샘플링하고 text embedding vector를 augmentation한 벡터와 합쳐 업샘플링한다. 이 때 256 이미지가 생성되며 이 이미지를 통해 Stage-2 Discriminator를 속인다. 이렇게 training시키면 GAN-INT-CLS보다 훨씬 나은 퀄리티의 이미지를 생성할 수 있게 된다.

맨 윗줄과 맨 아랫줄을 비교하면 확실한 퀄리티 차이가 남을 볼 수 있다.

AttnGAN

2017년 전까지는 NLP를 다루는 기술이 많이 발달되지 않아서 sentence를 embedding할 때 LSTM 같은 sequence모델을 통해서 하나의 값만을 구하였다. 그러나 2017년에 Attention이라는 개념이 핫해지면서 sentence를 단어의 조합으로 보고 이 단어가 이미지에서 attention을 갖게 되는 부분에 영향을 많이 미칠 수 있도록 하였다. 이 개념이 Text-To-Image Synthesis 태스크에 도입되면서 많은 발전이 이뤄졌다.

Model

Model /

먼저 대략적인 구조를 먼저 설명하겠다. sentence를 encoder를 통해 word feature와 sentence feature를 개별적으로 구한다. sentence feature들이 generator의 latent vector로 쓰여진다. 이 모델에서 generator는 화질에 따라 여러개가 사용되어질 수 있다. word feature와 upsampling한 sentence feature 값 사이에 attention를 계산한다. 즉 단어들간의 뜻과 image를 encoding한 채널별 이미지 간의 상관관계를 구하는 것이다. 구하고 나면 한쪽으로는 이 attention 값으로 저화질 이미지를 생성하고 한쪽으로는 다음 화질의 이미지를 생성한다. 생성한 이미지들은 전부 해당되는 Discrimiator로 가서 training되며 최종적으로는 256*256 image를 생성한다. 이후에는 이 최종 이미지를 인코딩하여 image features를 구하고 기존에 text를 encoding한 값인 word feature를 비교하는 방식이다.

Encoding

이제 조금씩만 더 세세하게 들어가보자. Text Encoding할 때는 bi-directional LSTM을 사용한다. 각 셀마다의 output의 size를 $D$, text token을 $T$개라고 하자. 그러면 셀마다의 output을 전부 합친 것을 word feature($e$:$DxT$), 마지막 셀에서 생성된 hidden value를 sentence feature($\bar{e}$:$D$)로 한다. 그 후 sentence feature는 기존 논문에서 나온 방법인 conditional augmentation을 통해 새로운 $e$를 생성하고 latent vector와 concat한다.

Image는 유명한 모델인 Inception-v3를 사용하였으며 ImageNet으로 pretrain된 모델을 사용하였다.

Attention

Attentional Generative Network에서 우리는 총 3장의 이미지를 생성한다. size가 64, 128, 256일 때 이렇게 총 3번 생성하게 되는데 첫번째 이미지를 생성할 때와 나머지로 나눌 수 있다.

첫번째 이미지를 생성할 때에는 latent vector + $e'$가 들어오고 이것을 FC layer를 통해 reshape하여 upsampling하기 좋게 변경해준다. 그 뒤로 4번의 upsampling을 거쳐 image feature($h_0$:$\hat{D}xN$)를 생성한다. ($\hat{D}$는 image feature 하나의 크기이고 $N$은 image feature의 총 개수이다) 그리고 이 feature를 통해 generator $G_0$에서 이미지를 생성한다.

그 다음부터는 전 단계에서 만든 image feature($h_i$:$\hat{D}xN$)와 word feature($e$:$DxT$) 간의 attention을 구한다. 그러면 N개의 image feature 하나 당 T개의 word feature의 attn vector를 구하고 가중치를 전부 고려하여 최종적으로 $\hat{D}$의 벡터를 만든다. 총 N개 있으므로 $h_i$는 $\hat{D}xN$으로 유지가 된다. 이 값을 통해 다음 모델인 $F_i$에 들어간다. 여기서는 residual network와 upsampling 한번으로 다음 image feature를 계산한다. 그러면 이 피처로 다시 generate를 하고 아까와 같은 과정을 거쳐 다음 $F$로 들어간다. 그러면 마지막으로는 $G_2$에서 256*256 이미지를 생성할 수 있게 된다.

Training

generator 당 discriminator도 하나씩 있어야 하므로 우리에겐 총 3개의 gen, disc가 있다. 3개의 gen 모두 각각의 disc를 속여야 하며 text cond이 있을 땐 이 텍스트를 고려하여 disc를 속이고 없을 땐 이미지 자체의 퀄리티로 속여야 한다. 마찬가지로 disc는 이미지 자체의 품질과 text cond이 반영이 되었는지의 여부를 모두 고려하여 training한다.

여기서 기존의 논문과 다른 점은 generator를 training할 때에는 DAMSM이라는 loss가 추가된다. 바로 word feature와 맨 마지막에 생성된 256*256 이미지를 인코딩한 image feature와 비교한 값이다. 이 값이 많이 다르다면 loss는 그만큼 커지고 이 값이 작아지면 작아질수록 cond이 반영된다고 볼 수 있다.

result

모델 자체의 복잡도가 많이 올라가고 더 다양한 테크닉이 들어간만큼 기존에는 전혀 기대할 수 없었던 256 사이즈가 이쁘게 잘 생성되었음을 볼 수 있다. 또한 텍스트도 잘 반영이 되었다. 아래에 있는 그림이 지금 어떤 단어에 대해서 어디를 보고 있는지에 대한 어텐션 그림이다. yellow나 black처럼 지금 내가 봐야하는 부분을 잘 보고 있음을 확인할 수 있다.

Reference

https://arxiv.org/pdf/1605.05396.pdf
https://arxiv.org/pdf/1612.03242v2.pdf
https://arxiv.org/pdf/1711.10485v1.pdf