본문 바로가기
Deep Learning

GAN, Pix2Pix

by 꿈꾸는 띵땅근 2021. 11. 15.

Latent Vector


이미지의 한 픽셀 한 픽셀이 하나의 차원이 된다. 그 각각의 차원은 0~255 값을 가질 수 있다. 위 이미지는 784차원으로 표현가능하다. 

 

- 위 이미지처럼 pixel space에서 784차원의 이미지를 설명할 때, 좀 더 효율적인 방법으로 설명할 수 있는게 latent vector를 만드는것이다. 

- Manifold learning : 데이터가 manifold 안에서 잘 나누어져 있을 때 

 

 

 

 

GAN


- latent vector가 어떻게 압축되는건지, z가 노이즈를 만든다는데, 그걸로 어떻게 generate 한다는건지 모르겠다. 

 

 

 

 

 

 

 

C GAN


 

 

 

 

 

 

 

 

DC GAN

 


- 여기서는 conv layer를 사용하여 이미지 만드는 부분에서 좋은 성능을 냄. 

사이 간격을 넓혀서 역으로 conv 연산을 수행하면 output은 커진다. 
벡터 연산이 가능하다!!

 

 

 

 

 

 

 

 

 

 

Pix2Pix


- input : { image(pixel data), 실제 정답 이미지 } 

- output : 실제 정답 이미지와 비슷한 이미지

- Loss func : cGAN 에서 쓰인 loss function + L1 Loss(단순 절댓값. not euclidian)

- L1 loss + U-Net 구조를 썼을 때 최상의 결과가 나온다(디테일이 살아남)

 

- Generator 가 생성한 이미지와 실제 정답 이미지 

- encoder-decoder 구조 안쓰는 이유 : low level feature들이 누락된다. (층을 거칠수록 high level feature들이 추출된다)

출처 : 라온피플

- U-Net 기반한다. i번째 layer와 n-i번째 layer를 skip connection으로 이어준다 --> low level feature 가 뒤로 잘 전달된다. 

- NxN patch를 사용한다 : 

- averaging이 되어 색도 흐려지고, 이미지도 blurry해지는 경향이 있다. 

 

 

 

 

 

CycleGAN(image to image translation. 


- Style 위주의 정보가 바뀐다(e.g. 말 -> 얼룩말 / 계절 바꾸기 / 사진을 다양한 화풍의 그림으로 변경 가능)

- Pix2Pix의 문제는 입력데이터가 pair로 존재해야 한다는 점이었다. 정답 데이터 없이 그냥 아래와 같이 학습하게 되면(GAN Loss만 사용할 경우), X 도메인의 한 이미지를 넣으면, Y도메인의 임의의 이미지를 내놓는다는 단점이 있다. 

그래서, 2개의 translator를 사용한다. 

- 원본 이미지가 변환되었다가, 다시 원본으로 돌아올 수 있을 정도로만 학습하자. GAN을 2개 만들어서 동시에 학습시키자. 

- 한 쌍으로 묶이지 않은 데이터를 학습하기 위해 cycle loss를 이용한다. 

x가 G안에 들어가서 생성되는 이미지가 Y도메인의 그럴싸한 이미지로 만들어 질 수 있도록 G를 학습시킨다. 그래서, G는 그럴싸한 이미지가 나오게끔 학습 진행.

- GAN Loss : target domain에 있을법한 이미지를 생성하게 해줌. 

- Cycle consistency Loss : x 이미지가 다시 원본으로 돌아올 수 있게끔 하는 loss

--> 여기서는 두개의 다른 도메인의 이미지들만 제시된 상황이기 때문에,  c GAN처럼 label을 주어줄 수도 없는 상황인데, 이걸 똑똑하게 해결한게, 한번 translation했다가, F라는 역함수(?)를 동시에 학습시켜서 G로 갈때도, Y도메인의 분포를 따르면서, x와 최대한 비슷한 이미지가 생성되게끔 만들어준다. 

- content에 대한 정보를 유지되게 학습이 이루어 져야한다. 그래야 다시 돌아올 수 있다. 

cycle consistency loss를 줄이는게 목표이다. 

- MSE 기반의 Loss를 사용한다. 실제 이미지 분포와 더욱 가까운 이미지를 생성할 수 있고, 학습이 안정화된다. 

- 학습의 안정성을 위해 replay buffer를 사용. 판별자가 update할때 당장 생성자가 만든 이미지를 봐서 학습하는게 아니라, 이전에 제작한것도 참고한다. 

- cycleGAN을 구성하는 손실함수 중 어떤게 가장 좋나? ablation study--> 모든 loss 사용했을 때 결과가 가장 좋았다. 

cycle consistency loss + GAN loss 모두 사용하면 좋음. forward + GAN은 mode collapse 문제가 발생한다. 

- 색상 구성을 보존해야 할 때는 identity loss를 추가적으로 사용할 수 있다. 

 

- 한계 : content 정보까지 변화해야 하는 상황에서는 잘 안됨. (데이터셋을 잘 구성하면 해결될 수 있는 문제이긴 함) 

 

 

 

PGGAN 


- 학습 과정에서 layer 추가해나감 --> 한번에 전체 layer 구상한 후 학습 하는것이 아닌, 학습 진행 과정에서 해상도 증가시키는 방법. 

- 안정적으로 고해상도 이미지를 만들 수 있었음. 

- 단점) 이미지 특징 제어 잘 못함 (안경씌우거나, 머리를 바꾼다거나)

------> styleGAN이 해결가능. 

PG GAN을 따르면 점진적으로 layer를 늘려가면서 고해상도 이미지를 만들 수 있게 된다. 

 

WGAN-GP

수렴의 안정성을 도와준다. WGAN-GP Loss

1-Lipshichtz 조건을 만족하도록 하여 안정적인 학습 유도. 

stylegan 에서도 사용된다. 

 

 

 

StyleGAN


1. PGGAN 베이스라인 아키텍쳐 성능을 향상시킴

2. Disentanglement 특성을 향상시켰다. (e.g. 남자에게 안경을 씌운다. 즉, 특징들이 적절히 분리되어 있으므로, 추가/제거가 쉽다. 즉, semantic feature들을 컨트롤하기 쉽다)

3. 고해상도 얼굴 데이터셋 공개

----> 원하는 style을 골라서, 바꾸거나, 적용할 수 있다(disentangle되어있기 때문)

 

핵심 아이디어 : 매핑 네트워크

- 512차원의 z 도메인에서 w 도메인으로 매핑을 수행한다. 

- 입력인 z 는 gaussian/uniform distribution에서 sampling하기 때문에 gaussian/uniform 분포를 따라, 여러 특성이 entangle되기 마련이다. 이것을 여러 FC layer를 거쳐 새로운 latent vector인 w로 만들어 줌으로써, w space에서 각 factor들은 linear 한 특성을 가질 수 있게됨(한마디로, 특성들을 좀 더 잘 담게끔 구분지음) 

feature의 statistics를 바꾼다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글