자세히보기

빅데이타 & 머신러닝/생성형 AI (ChatGPT etc)

VAE를 통해서 본 이미지 생성 모델의 원리

Terry Cho 2023. 11. 3. 15:02

VAE를 통해서 본 이미지 생성 모델의 원리

조대협 (http://bcho.tistory.com)

 

요즘 Mid Journey 모델이나 DALLE-3 모델과 같은 이미지 생성 모델이 많이 소개되어, 어떤 원리로 이미지를 생성하는지 궁금하였다. GAN,Transformer등 여러가지 모델이 있지만 VAE (Variant Auto Encoder)모델을 이용하여 이미지를 변경하는 방법이 상대적으로 이해하기 쉬워서 VAE기반의 이미지 편집 원리를 정리하였다. 

 

오토 인코더와 VAE에 대한 개념 설명 : (이 글을 읽기전에 AutoEncoder와 VAE에 대한 개념/원리는 아래 글을 참고하기를 권장한다.)

 오토 인코더는 기본적으로 뉴럴 네트워크를 나비 모양으로 양쪽에 대칭으로 붙인 모양의 모델을 말한다. 이 모델의 특징은 학습이 된 데이터가 입력으로 들어오면 그 입력을 그대로 재생할 수 있는 특징을 가지고 있다. 

<그림 출처 : https://deeplearning4j.org/deepautoencoder >

 

좌측 레이어에서 들어온 입력값에 대한 특징을 작은수의 뉴럴네트워크에 저장하는데,이 계층을 Encoder라고 한다. 그리고 이렇게 특징이 저장된 값을 Compressed Vector 또는 Latent Space Representation이라고 한다. 이 특징 값을 가지고 원래 입력값을 재생하는 오른쪽 네트워크를 Decoder라고 한다. 

 

즉 아래 그림과 같이

4라는 숫자 이미지를 인코딩을 해서 그 특징을 저장한 후, 이 특징을 디코더 레이어를 통해서 오른쪽 그림과 같이 “4”라는 숫자 이미지를 다시 생성한다. 

 

이를 이미지 데이터를 가지고 학습을 하게 되면, 이미지의 특징이 Latent Space로 압축하여 저장이 되고, 다시 원본 이미지를 생성하게 되는것이다.

아래 그림은 실제로 왼쪽 그림으로 학습을 한후에, 왼쪽 그림을 입력으로 넣었을때 오른쪽 이미지는 출력되는 이미지이다.

<이미지 출처 : https://www.kaggle.com/bwcho75/vae-face-regeneration-smiling/edit>

 

그러면 이 모델을 이용해서 이미지 변경을 어떻게 할까?

얼굴이미지에 웃는 표정을 추가한다던지, 나이를 변경한다던지, 안경을 씌운다던지의 변형을 할 수 있는데, 얼굴을 웃는 이미지로 변경하는 과정을 생각해보자.

핵심은 Latent Space에 있는데, 앞에서도 설명하였듯이, Latent Space는 입력 이미지의 특징을 가지고 있다. 즉 기존의 입력 이미지로 생성된 Latent Space값에 웃는 얼굴의 Latent Space 값을 추가하면 기존 얼굴 이미지에 웃는 특성을 추가할 수 있는 원리가 된다.

 

Latent space의 값을 z라고 했을때, VAE학습 과정에서 웃는 얼굴의 학습과정에서 생성된 Latent space의 값들만을 모아서 평균을 낸 값을 feature_vector라고 하자.

<이미지 출처 : https://www.kaggle.com/bwcho75/vae-face-regeneration-smiling/edit >

 

그리고 VAE의 Latent space에 z값을 다음과 같이 변형 시킨다. (실제 알고리즘은 아니고 개념적으로 이렇다는 이야기이다. )

 

z_new = z + strength * feature _vector

 

이렇게 하면 기존 z 특성에 웃는 특성인 feature_vector를 strength 의 강도만큼 적용해서 디코더로 보내 이미지를 생성하도록 한다. strength가 1에 가까우면 많이 웃는 모습이 될것이고 -1쪽으로 갈수록 찡그린 얼굴이 될것이다.

 

이 개념을 적용하여 생성된 이미지를 보면 아래와 같다. 왼쪽이 원본이미지이고, 오른쪽이 웃는 얼굴의 Feature vector를 적용하여 생성된 이미지이다. 

 

<이미지 출처 : https://www.kaggle.com/bwcho75/vae-face-regeneration-smiling/edit >

 

이 글에서 설명한 VAE를 이용한 이미지 재생성 모델의 파이 토치 코드는 https://www.kaggle.com/code/averkij/variational-autoencoder-and-faces-generation를 참고하기 바란다.


이 글은 https://www.kaggle.com/code/averkij/variational-autoencoder-and-faces-generation 을 참고하여 작성하였습니다.

그리드형