본문 바로가기

딥러닝/신규 모델&기술 설명

[논문 리뷰] GAN에서 한 발짝 앞서서, PGAN(Progressive-GAN) 기술 분석

320x100

이번 시간에는 개인적으로 많은 호기심을 갖고 있었던 GAN에 대해서 심층적으로 알아보고, 이를 얼굴 인식 분야에서 전문적으로 활용한 PGAN에 대해서 분석해보겠습니다.

펴본 논문은 NVIDIA 연구팀에서 ICLR 2018 컨퍼런스를 통해서 발표한 "Progressive Growing of GANs for Improved Quality, Stability, and Variation" 페이퍼 입니다.

 
 
지금으로부터 6년전에 발표된 논문이지만 computer vision과 생성 부분에서 높은 정확성을 갖고 있고, 안정성도 탄탄한 모델이어서 살펴보았습니다.
 

들어가기에 앞서서

 
필자가 생각하는 이미지 생성의 어려움은 물론 모델과 기계 성능에도 있지만 인간의 '시각적 평가'가 무서울 정도로 까다롭기 때문이라 생각합니다. 사실 생각해보면 동물 중에서도 인간처럼 입체적으로, 다량의 색깔을 포함해서, 뛰어난 시야를 갖고 사물을 받아들이는 동물은 그리 많지 않습니다. 강아지들만 하더라도, 원추세포를 사람의 20%만 갖고 있어 적녹 색맹에 가까운 시야를 갖고 있고, 새도 상당히 넓은 시야각(180도 ~ 360도로 다양)을 갖고 있지만 심도에 대한 인지력이 낮아서 전방은 잘 인지를 못합니다. 영장류에 와서야 3색형 색각과 입체적 시야를 가진다고 하는데요. 단일 포유류 중에서도 인간은 1만 7천가지가 넘는 색을 구분하고, 1km 밖의 빛도 감지할 수 있습니다. 다만, 이보다도 이미지 인식 분야에서 더 중요한 문제가 있습니다.
 

 
 
인간이 사물을 자리잡은 그대로 인식하는 방식은 생각보다 복합적입니다. 3D 게임이 처음 출시되었을 때를 보겠습니다. Tomb raider 1(1996)이 처음 출시되었을 때 캐릭터들의 이미지는 폴리곤 덩어리들이지만, 아무튼 그것이 사람으로 받아들여집니다. DOOM 1(1993)에서 주인공이나 적들이 잘 뭉쳐진 픽셀 덩어리로 돌아다니긴 하지만, 일단 원활하게 형태를 구분하는데 어려움은 없습니다.
 

DOOM 1(1993)과 Tomb raider 1(1996)의 이미지. 출처 : steam

 
사물을 인식하기 위해서 우리는 사물 그 자체만 필요로 하지 않습니다. 사물은 물론 눈에 비치는 화면의 화질과 선명도, 그리고 전체적인 조화가 사물을 인식하는데 많은 역할을 하고 있는 것이지요. 바로 인간의 "전역적인 추론" 능력입니다. 이는 전역적으로 세상을 보는 능력, 즉 일부분에만 집중하는 것이 아니라 세상이라는 전체적인 화면을 보는 능력을 말합니다. 사물이 몇가지 필수적인 특징을 잘 지키고 있다면 그것이 어떤 화질을 갖고 있든, 폴리곤으로 이루어져 있든 픽셀 덩어리이든, 사람으로 인식해주는 관대한 능력입니다. 둠의 세계에서는 둠의 생명체들이 그다지 이상하지 않고, 툼레이더의 세계에서는 툼레이더의 생명체들이 그다지 어색하지 않습니다.
 

이미지 출처 : https://blog.delcampe.net

 
하지만 이런 전역적인 추론을 크게 어기는 사물들은 우리가 상당히 어색하게 느끼게 됩니다. 화질이 낮은 툼레이더 1의 인물이 그래픽이 매우 발전한 툼레이더 2018 시리즈에서 그대로 돌아다닌다고 생각해볼까요. 마인크래프트 세상에서 툼레이더의 주인공이 돌아다니는 것처럼 말입니다.
 
아마 상당히 어울리지 않을 것입니다. 마찬가지로 툼레이더 게임안의 인물들이 현실에서 (물론 고화질의 버전이지만) 돌아다닌다면 이 또한 매우 이상할 것입니다. 우리의 인지능력은 특정한 부분에 대해서는 엄격하고, 다른 부분에서는 꽤나 관대합니다.
 
 
인지의 문제는 하나 더 있습니다. 인간의 시각으로 들어온 정보는 추상화하는 능력을 통해 그것이 어디에 속하는지, 어디부터 어디까지 그것으로 이루어져 있는지 경계를 나누어 인식하기도 합니다. 예컨대 사과를 보면 과일에 속한다고 생각하고, 고양이를 보면 포유류에 속한다는 개념화 능력도 있습니다. 인간의 얼굴을 보아도 눈 두개가 눈이 있어야 할 위치에 있고, 귀 두개는 귀가 있어야 할 위치에 있고, 코, 입, 머리카락 등 각각 그곳에 위치해야할 곳에 위치하면 별 이상한 점을 느끼지 못합니다. 하지만 눈 두개가 5cm라도 옆으로 벗어난 위치에 있고, 귀 두개가 보통 달린 위치보다 늘어뜨려져 달려 있거나, 코는 푹 눌려져 있거나, 턱의 각도가 보통의 턱보다 5cm 정도만 내려 앉아 있어도 어딘가 이상하다고 느낍니다. 이를테면 딥러닝 모델이 만들어낸 "인공 얼굴"들 말입니다. 
 

 
즉 GAN을 비롯하여 추후에 다룰 LSTM 모델과 같이, 생성을 다루는 신경망의 맹점은 그 평가가 "주관적"이라는 점입니다. 생성의 문제는 Image detection이나 classification, inference 처럼 정확도(Accuracy)의 문제가 아닙니다. 정확도가 90%, 95%가 넘는다고 해서 반드시 현실적으로 모방&생성이 잘된것이 아닙니다. GAN 모델의 학습도는 수치적인 문제가 아닌 어딘가 다른 영역이라고 불러야 할 것입니다. 그것은 주관성의 영역입니다. 이때문에 인간이 느끼기에 어색하지 않은 이미지 생성의 영역은, 우리가 무엇을 자연스럽다고 느끼고, 무엇을 부자연스럽다고 느끼는지 개념화하는 인간 능력을 함께 연구해야 가능해질 것입니다. 필자는 이를 컴퓨터 비전의 한계이기도 하지만, 우리의 인지능력에 대한 추론을 통해 이 또한 모방할 수 있다고 생각합니다.
 

리뷰 - 서론

 
연구진들은 GAN(적대적 생성 모델)을 위한 새로운 기법들을 소개해 왔습니다. 이번 설명의 핵심적인 요소는 Generator(생성자)와 Discriminator(판별자)를 점진적으로 발전시키는 것입니다. resolution를 낮추는 것부터 시작해서, 모델의 fine detail을 학습 과정에서 높이고자 새로운 layer를 추가하기도 했습니다. 두 방식은 학습의 속도도 높이고, 안정성도 높혔으며, 이전에 보지못한 높은 성능을 보여주기도 했습니다. 여기서는 CelebA(CelebA Dataset (cuhk.edu.hk)) 데이터셋을 모델 학습에 적용했습니다. 이미지 생성의 variation을 높이는 방법도 있었고, 탐지되지 않은 CIFAR 10 데이터셋에서 초기 점수가 8.80 을 보여주기도 했습니다. 추가적으로 생성자와 판별자 사이의 unhealthy competition을 낮추는 것에 중점을 둔 implementation details에 대해서 나타내려 합니다. 결정적으로, 이미지의 변화량과 quality를 높이는 metric을 가져왔습니다. 즉, Celeb A 데이터셋의 더 높은 버전을 설계할 것입니다.
 
 

Progressive growing of GAN(점진적으로 진보한 GAN)

 
NVIDIA 연구진들의 초기 GAN의 학습 기법은 Low-resolution의 이미지로부터 시작합니다. 점진적으로 화질을 늘림으로서 (레이어 추가)신경망을 구성하는 것을 볼 수 있습니다.
 

G = 생성자. D = 판별자

이 incremental nature은 먼저 이미지 분포의 대규모 구조를 발견한 다음, 모든 규모를 동시에 학습해야 하는 대신 점점 더 미세한 규모의 세부 정보에 순차적으로 집중할 수 있도록 합니다. 
 
서로 대칭인 생성자와 판별자 network를 사용하며, 두 가지는 항상 synchrony 하게 성장합니다. 두 네트워크의 모든 기존 레이어는 학습 과정 전과정에서 학습 가능한 상태로 유지됩니다. 네트워크에 새로운 레이어가 추가될 때, 그것들은 부드럽게 Fade-in됩니다.  아래처럼 16x16 이미지를 32x32 이미지로 표현되는 과정을 통해 보겠습니다.
 

(a) : 16 x 16의 이미지를 transition(전이)함. (b) : 전이 과정. (c) : 32 x 32 이미지가 됨

이렇게 함으로서 이미 잘 학습된 작은 해상도의 레이어에 sudden shock가 전달되는걸 막아줄 수 있습니다. (갑작스러운 화질 차이를 중간에서 막아주는 완충 과정이라 보시면 됩니다)
 
GAN의 실험 과정에서 이러한 점진적인 방식이 여러가지 장점이 있다는 점을 알아냈습니다. 초기에는 작은 이미지를 생성하는 것이 더 안정적입니다. 이는 class information과 mode의 수가 적기 때문입니다. 점진적으로 해상도를 높이면서, 연구진들은 1024x1024 크기의 이미지와 같은 최종 목표에 비해 훨씬 간단한 질문을 계속 던지게 됩니다. 이 방법론은 최근 Chen & Koltun (2017)의 연구와 개념적으로 유사합니다.
 

Chen & Koltun의 CRN 신경망

Chen & Koltun (2017)의 연구. 출처 : https://www.slideshare.net/DeepLearningJP2016/photographic-image-synthesis-with-cascaded-refinement-networks

CRN은 요컨대 semantic layout을 이용해서 사진과 같은 이미지에 수정이나 생성을 가할 수 있는 기법입니다.
 
실제로 이 방식은, WGAN-GP 손실LSGAN 손실을 사용하여 신뢰성 있게 megapixel-scale의 이미지를 합성할 수 있을 만큼 학습을 안정화시킵니다.


▼ WGAN-GP 손실이란? 

 

 
WGAN-GP는 WGAN 모델에서 발생하는 Cliping 값 c에 대해서 c가 조금만 높아지면 기울기가 폭발하고, 또 조금만 줄어들면 기울기가 소실되는 문제를 해결하기 위해 제시한 논문입니다. 라이트하게 요약하자면, 샘플에 대한 기울기에 norm penalty를 부여해서 Wasserstein loss를 보완하고 Lipschitz continuity를 달성하고자 한 것입니다. 
 

▼ Mao의 LSGAN 손실

 

LSGAN에서 제시한 loss function 수식

2016년 홍콩공립대의 연구진들에 의해 제시된 LSGAN의 손실 함수입니다. 이 모델 자체가 GAN 에서 sigmoid cross entropy 손실함수를 수정하는데 집중한 모델로, 손실함수를 Least Squares(최소 제곱) 함수로 사용합니다. 이는 결정경계로부터 멀리 떨어진 샘플들에게 페널티를 부여하여, 실제 데이터에서 멀리 떨어져 있는 sample의 기울기가 소멸되는 문제를 해소합니다.


 
또 다른 장점은 학습 시간의 단축입니다. Progressively growing GANs(이하 PGAN)을 사용하면 대부분의 Iteration이 낮은 해상도에서 수행되며, 최종 출력 해상도에 따라 2배에서 최대 6배 빠른 속도로 비교 가능한 result quality를  얻는 경우가 많습니다. 
 
점진적으로 생성자와 판별자를 성장시키는 아이디어는 Wang et al (2017)의 연구와 관련 있습니다. 이 작업은 다른 spatial의 해상도에서 작용하는 여러개의 판별자를 사용합니다. 
 


Wang의 conditional GAN - <Multi-scaled Discriminator>

해당 논문에서 직접 제시되지 않은, 참조를 위한 이미지입니다.

 
고해상도 이미지를 더 정확하게 합성하기 위한 기법으로, 고해상도의 실제 이미지와 합성 이미지를 구분하기 위해 판별자가 large receptive field를 가져야 합니다. 이 모델에서는 판별자가 서로 다른 차원의 해상도를 각자 학습하고, 생성자를 잡아내기 위해서 3개의 판별자를 사용합니다. (그 외에도 다양한 기법이 사용)


 
계층적 GAN은 이미지 pyramid의 각 레벨에 대해 생성자와 판별자를 정의합니다. 이러한 방법들은 PGAN의 작업과 동일한 접근입니다. 다만, 여러개의 GAN 계층 구조가 아닌 하나의 GAN만 사용한다는 점에서 차이가 있습니다. PGAN의 방법론은 탐욕적 성장을 하는 신경망과 다르게, 미리 구성된 레이어의 introduction을 뒤로 미루는 것입니다. 기존의 모델처럼 탐욕적으로 신경망을 성장시키는 방법은 사용하지 않고, 레이어를 순차적으로 추가하는 것입니다.
 

기법 - Minibatch 표준 편차를 사용한 variation 증가

 
GAN은 학습 데이터에 포함된 분산 중 일부분만을 포착하는 경향이 있습니다. 이러한 문제를 해결하기 위해 "minibatch discrimination"을 제안합니다. 이는 개별 이미지 뿐만 아니라 미니배치 전체에서 feature statistics를 계산하여 생성된 이미지와 학습된 데이터의 미니배치가 유사한 특성을 보이도록 하는 것 입니다. 이는 판별자의 끝 부분에 미니배치 레이어를 추가함으로서 구현할 수 있습니다. 이 레이어는 input activation을 통계적인 배열로 project하는 커다란 텐서를 학습합니다.
 
미니배치의 각 예시에 대해서 별도의 통계셋이 생성되며, 이는 레이어의 출력과 연결되어 판별자가 내부적으로 통계를 사용할 수 있습니다. 이 접근 방식을 단순화하면서도 분산을 개선해서 PGAN에 적용합니다.
 
여기서 PGAN의 해결책은 학습 데이터의 분산을 늘리는 것이지만, 이를 위한 새로운 hyper parameter나 학습 가능한 파라미터를 도입하지 않습니다. 먼저, 미니배치의 각 공간 위치에서 각 피쳐들의 표중편차를 계산합니다. 그런 다음, 이러한 추정치들을 모든 피쳐와 공간 위치에서 평균을 내서 단일 값으로 도출합니다. 이 값을 복사하고, 공간 위치와 미니배치에서 모두 이 값을 concatenate하여 추가적인 피쳐 map을 생성합니다. 이 레이어는 판별자 어디에나 삽입될 수 있지만, 연구상 끝 부분에 삽입하는 것이 가장 좋다고 결론지었습니다. 유사한 연구(Lin et al. (2017))에서는 다중 이미지를 판별자에 제시하는 이점에 대해서 이론적인 통찰력을 제공합니다. (아래)
 


Lin의 Softmax GAN모델

 
독특하게도 이 소프트맥스 GAN 모델은 classification 손실을 소프트맥스 크로스엔트로피 손실로 교체해서, 한개의 싱글 배치에 넣어서 작용시킵니다. 
 


이러한 분산문제에 대한 또다른 해결책으로는 판별자 unrolling을 통해 update를 regularize하거나, "repelling regularizer"를 사용하여 생성자에 새로운 loss term을 추가하여 미니배치 내의 feature vector를 직교화하도록 하는 방법도 있습니다. (이 리뷰에서는 다루지 않습니다.) MAD-GAN(2017)의 다중 생성자 모델도 같은 문제를 다루고 있습니다. 
 

생성자와 판별자의 Normalization

 
GAN은 두 개의 신경망 간의 unhealthy한 경쟁으로 인해 signal magnitude가 증폭될 가능성이 있습니다. 이러한 문제점을 해결하기 위해 기존의 해결책 대부분은, 생성자 뿐만 아니라 판별자에서도 batch normalization의 변형을 사용하여 막는 것이었습니다. 이러한 normalization의 방법은 covariate shift(공변량 변화)를 제거하기 위해서 도입되었습니다. 하지만 GAN에서는 이것이 문제가 되는 것을 관찰하진 못했기 때문에, 실제로 GAN에서 필요한 것은 signal magnitude와 경쟁을 제한하는 것이라고 믿습니다. 이를 해결하기 위해 PGAN에서는 학습 가능한 매개변수를 포함하지 않는 두가지 구성 요소로 이루어진 다른 방식을 사용합니다.
 
1) 동등화된 학습률 (Equalized learning rate)
 


이 방법은 네트워크의 레이어에 따라 다른 학습률을 적용하는 대신, 모든 레이어에서 동일한 학습률을 적용하면서, 가중치 초기화를 조절합니다.
이를 통해 모든 레이어가 골고루 학습되도록 하며, 생성자와 판별자간의 불균형한 경쟁을 방지할 수 있습니다.

 
연구진은 현재의 careful weight initialization의 추세에서 벗어나, 대신 \( N(0,1) \) 초기화를 사용하고, 실행 시간에 가중치를 명시적으로 스케일링 합니다. 다시 말하자면, \( w_i = wi/c \)로 설정하여, "DCGAN" 의 초기화 함수에서 나온 레이어별 정규화 상수인 \( c \)로 가중치를 나눕니다. 이것을 초기화 시간이 아닌 실행시간에 하는 것이 좋은데, 이는 RMSprop이나 Adam 알고리즘과 같은 일반적으로 사용되는 SGD와 관련이 있습니다. 이러한 방법은 경사도 업데이트를 추정된 표준편차로 normalize해서 매개변수의 스케일과 관계 없이 업데이트를 진행합니다. 결과적으로, 일부 매개변수의 동적 범위가 다른 매개변수보다 크면 조정하는데 더 많은 시간이 걸립니다. 이는 modern 초기화 기법이 유발하는 scenario이며, 학습율이 동시에 너무 커지거나 반대로 작아질 수 있습니다. PGAN은 여기서 모든 가중치에 대해, 동일한 학습 속도가 되도록 동적 범위를 보장합니다.
 
 
2) 생성자에서의 Pixelwise feature vector normalization
 


직역하자면 픽셀별 특징 벡터 정규화라고 할 수 있습니다. 생성자 신경망에서 이미지를 생성할 때, 각 픽셀 위치에서 해당 위치의 특징 벡터를 정규화하는 것을 의미합니다. 이 방식은 픽셀별로 수행되며, 각 위치의 피쳐 벡터가 독립적으로 정규화 됩니다. 이는 GAN에서 생성자와 판별자 사이의 불균형한 경쟁으로 인한 피쳐 벡터의 큰 동적 범위를 방지하고, 더 안정적인 학습을 이끌어내는데 도움을 줍니다.

 
생성자와 판별자 사이의 경쟁으로 인해, 생성자와 판별자의 magnitude가 급격하게 커지는 상황을 방지하기 위해, 생성자에서 각 합성곱 레이어 이후의 각 픽셀의 피쳐 벡터를 unit length로 정규화 합니다. 이를 위해 "local response normalization"의 변형을 사용합니다. 아래 수식을 참고해주세요.
 
$$  b_{x,y} = a_{x,y}/\sqrt{\tfrac{1}{N}\sum_{j=0}^{N-1} (a_{x,y}^{j})^2+\epsilon }     $$
이때의 \( \epsilon = 10^{-8}  \) 입니다.
 
 
여기서 N은 픽셀 (x,y)에서의 원래 피쳐 벡터 \( a_{x,y} \) 와 정규화된 피쳐 벡터 \( b_{x,y} \) 의 크기를 정규화하는 데 사용되는 피쳐 맵의 수 입니다. PGAN은 이러한 강력한 제약이 생성자를 어떠한 방식으로도 훼방하지 않는 것에 놀라게 되었습니다(영감을 받았다고 봐야 합니다) 사실, 대부분의 데이터셋에서 결과를 크게 변경하지 않으면서, 필요한 경우 signal magnitude의 급격한 증가를 효과적으로 방지할 수 있습니다.
 
 

GAN 결과를 평가하기 위한 다중 스케일의 통계적 유사성(Multi-scale statistical similarity)

 
GAN의 결과물을 비교하기 위해서는 많은 수의 이미지를 조사해야 하므로, 이는 지루하고 주관적일 수 있습니다. 따라서 거대한 이미지 컬렉션에서 어떤 지표를 계산하는 자동화된 방법을 사용하는 것이 바람직합니다. 기존의 MS-SSIM과 같은 방법은 large-scale mode collapse를 신뢰성 있게 찾아내지만, 색상이나 질감의 분산 손실과 같은 작은 효과에 대해 반응하지 못하며, 또한 학습셋과 유사성을 기반으로 이미지 품질을 직접 평가하지 않습니다.
 
연구진들은 성공적인 생성자는 모든 스케일에서 학습셋과 유사한 local 이미지 구조를 생성할 것이라는 직관에 기반하여 개발을 진행했습니다. 이를 laplacian pyramid 표현에서 추출한 local 이미지 patch의 분포간 다중 스케일의 통계적 유사성을 고려했습니다. 표준적인 방법에 따라 pyramid는 16 x 16 픽셀의 low-pass 해상도에서 시작해서, full 해상도에 도달할 때까지 점진적으로 2배씩 증가합니다. 각 successive level은 이전 레벨의 up-sample 버전과의 차이를 encoding 합니다.
 

라플라시안 피라미드

 

라플라시안 피라미드는 사용되는 기법 중 하나로, 그림 참조로 넘어갑니다.


 
단일 라플라시안 피라미드 레벨은 특정 공간 frequency band에 해당합니다. 개발진들은 16384개의 이미지를 무작위로 샘플링하고, 라플라시안 피라미드의 각 레벨에서 128개의 descriptor를 추출하여 \( 2^{21} \) 개의 descriptor를 각 레벨마다 가지게 되었습니다. 각 descriptor는 \( x \in \mathbb{R}^{7*7*3}=\mathbb{R}^{147} \) 로 표현되며, 3개의 색상 채널을 가진 7 x 7 픽셀의 neighborhood 입니다. PGAN에서는 학습셋과 생성셋의 i번째 레벨에서 추출한 패치를 아래 수식으로 표현합니다.
$$ \left\{x_i^l \right\}_{i=1}^{2^{21}}    ,       \left\{y_i^l \right\}_{i=1}^{2^{21}} $$
 
각각의 색상 채널에 대한 평균과 표준 편차를 기준으로 \( \left\{x_i^l \right\} \) 와 \( \left\{y_i^l \right\} \) 를 정규화한 후, 512개의 투영을 사용해서 Sliced Wasserstein distance(슬라이스 바서슈타인 거리)를 SWD를 계산하고, 이들의 통계적 유사성을 추정합니다. 이는 earthmover distance의 효율적인 계산 가능한 무작위 근사값 입니다.
 

바서슈타인 거리(Wasserstein distance)

 

출처 : http://pizzathief.oopy.io/statistical-distance-1

 

Wasserstein Distance은 두 확률분포간의 거리를 측정하는 지표입니다. Earth Mover's distance, 짧게 EM distance,라고도 부릅니다.

 
통계적 유사성을 짧게 요약하자면, 라플라시안 피라미드를 사용하여 이미지의 구조를 다양한 해상도별로 비교하며, 각 해상도별로 랜덤하게 추출한 이미지 패치들의 분포를 비교하며, 각 해상도별로 랜덤하게 추출한 이미지 패치들의 분포를 비교함으로서 생성된 이미지와 실제 이미지의 유사성을 평가합니다. 이를 위해서 색상 채널별로 평균과 표준편차를 이용하여 패치들을 정규화하고, 슬라이스 바셔슈타인 거리를 사용하여 분포의 차이를 계산합니다. 이를 통해 생성된 이미지와 실제 이미지의 유사성을 다양한 해상도에서 평가할 수 있으며, 저해상도에서는 large-scale 이미지 구조의 유사성을, 고해상도에서는 edge의 선명도나 노이즈와 같은 pixel-level 속성의 유사성을 평가할 수 있다는 것입니다.
 
 
이 과정을 통해 제작한 모델의 model summary는 아래와 같습니다.
 

 
각각 Celeb A 데이터셋을 학습한 모습 ▼
 


 
pytorch HUB의 도움을 받아, colab에서 코드로 옮기도록 해보겠습니다.
이미 학습이 다 된 모델이기 때문에, 추가적으로 epoch를 실시할 필요는 없습니다.
 

import torch
use_gpu = True if torch.cuda.is_available() else False

 
PGAN으로 제시되어 있는 신경망을 다운로드 합니다.
 

# 높은 퀄리티의 Celeb A 데이터셋으로 학습됨 (512 X 512 픽셀의 이미지를 출력함)
model = torch.hub.load('facebookresearch/pytorch_GAN_zoo:hub',
                       'PGAN', model_name='celebAHQ-512',
                       pretrained=True, useGPU=use_gpu)

 

num_images = 2
noise, _ = model.buildNoiseData(num_images)
with torch.no_grad():
    generated_images = model.test(noise)

# 맷플롯립으로 다운로드해서, 토치비전으로 출력
import matplotlib.pyplot as plt
import torchvision
grid = torchvision.utils.make_grid(generated_images.clamp(min=-1, max=1), scale_each=True, normalize=True)
plt.imshow(grid.permute(1, 2, 0).cpu().numpy())
plt.axis("off")
# plt.show()

 

 
PGAN을 사용하여 무작위적인 이미지셋이 출력된 부분입니다.
 
256 X 256 픽셀의 비교적 낮은 해상도로도 다운로드 해봅니다.
 

model = torch.hub.load('facebookresearch/pytorch_GAN_zoo:hub',
                       'PGAN', model_name='celebAHQ-256',
                       pretrained=True, useGPU=use_gpu)

 

num_images = 2
noise, _ = model.buildNoiseData(num_images)
with torch.no_grad():
    generated_images = model.test(noise)

grid = torchvision.utils.make_grid(generated_images.clamp(min=-1, max=1), scale_each=True, normalize=True)
plt.imshow(grid.permute(1, 2, 0).cpu().numpy())
plt.axis("off")

 
이렇게해서 결론을 지어 보겠습니다. 다음시간에는 더 특별한 모델들로 찾아오겠습니다!
 

※ 2023.3.12. 문단 위치 오작성으로 인해 1차 수정

Reference

 
원 논문 : https://arxiv.org/abs/1710.10196 

 

Progressive Growing of GANs for Improved Quality, Stability, and Variation

We describe a new training methodology for generative adversarial networks. The key idea is to grow both the generator and discriminator progressively: starting from a low resolution, we add new layers that model increasingly fine details as training progr

arxiv.org

Cascaded Refinement Networks(CRN) 논문 : 
https://arxiv.org/abs/1707.09405 
https://www.slideshare.net/DeepLearningJP2016/photographic-image-synthesis-with-cascaded-refinement-networks 
 
High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs(여러개의 판별자) 논문 :
[1711.11585] High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs (arxiv.org)
 
Softmax GAN에 대한 논문 : 
https://arxiv.org/abs/1704.06191 
 
라플라시안 피라미드에 관한 논문 : 
https://arxiv.org/abs/1506.05751 
 
바셔슈타인 거리(EM-distance) 관련 설명 : 
https://pizzathief.oopy.io/statistical-distance-1
https://dogfoottech.tistory.com/185 

 

pytorch hub : 
https://pytorch.org/hub/facebookresearch_pytorch-gan-zoo_pgan/ 
 

 

728x90