DL/Computer Vision

[Computer Vision] StyleGAN: A Style-Based Generator Architecture for GANs 논문 리뷰 및 구현 (2)

moonzoo 2023. 2. 10. 14:51

이전 글 StyleGAN 논문 리뷰에 이어서 간단하게 StyleGAN을 구현해보고자 합니다.

https://mz-moonzoo.tistory.com/21

 

[DL-Papers] StyleGAN: A Style-Based Generator Architecture for GANs 논문 리뷰 및 구현 (1)

이번에 소개할 논문은 A Style-Based Generator Architecture for Generative Adversarial Networks으로 StyleGAN으로 자연스러운 고해상도 이미지를 만들면서 많이 알려지게 된 논문입니다. 저희 학회 컨퍼런스에서 함

mz-moonzoo.tistory.com

 


StyleGAN 구현

StyleGAN은 기존의 PGGAN 구조에 Style transfer 개념을 적용하여 generator architecture를 재구성한 아키텍처이므로

나머지 구조보다는 논문에서 주로 다룬 Style transfer 개념 부분을 살펴보도록 하겠습니다.

 

PixelNorm

Pixelwise Normalization을 사용했는데, 이는 pixel마다 존재하는 Feature Vector를 단위 길이별로 Normalization해주는 것입니다. Pixelwise Normalization은 train 과정에서 신호의 크기가 제어를 벗어나는 것을 효과적으로 방지해줍니다. 

 

Learned affine transform A

AdaIN layer에 들어가는 style 정보가 될 수 있도록 affine transform 실시

 

*

AdaIN

ADaIN이라는 Layer를 활용해 style 정보를 입힐 수 있도록 만들었습니다. 하나의 이미지를 생성할 때 여러개의 스타일 정보가 레이어를 거칠 때마다 입혀질 수 있도록 하기 위해 AdaIN을 사용했습니다.

 

 

 Conv2d의 하이퍼 파라미터를 균일하게 설정합니다.

fully-connected와 affine transform에 N(0, 1)을 사용하여 모든 가중치를 초기화합니다.

 

맨 처음의 conv block

+ Noise Layer

노이즈 계층은 학습 가능한 표준 편차(및 0 평균)의 가우스 노이즈를 추가합니다. 노이즈 레이어에 .noise를 설정하면 노이즈를 수정할 수 있습니다. 이것은 참조 구현을 확인할 때 사용하는 방법 중 하나입니다.

 

forward를 보면 맨 처음으로 constant vector를 넣어주고 noise를 추가해줍니다. 이 후 AdaIN layer를 거치고 Irelu를 적용해줍니다. 그 다음 conv 3*3에 들어가고 다시 위의 과정과 같이 두번째 noise를 추가해주고 AdaIN layer를 거치고 Irelu를 적용해주게 됩니다.

 

Styleconv_block

맨 처음 conv block와 비슷합니다. 첫번째 conv layer. conv1을 통과하고 noise를 추가해줍니다. 다음으로 역시 AdaIN layer를 거치고 Irelu를 적용 해준 뒤 두번재 conv2 layer를 통과하게 됩니다. 

 

ConvBlock

Discriminator을 생성할 떄 사용할 ConvBlock입니다.

 

Mapping network

Latent vector z(차원이 줄어든 채로 데이터를 잘 설명할 수 있는 잠재 공간에서의 벡터)를 가우시안 분포를 통해 뽑은 뒤 바로 사용하지 않고 별도의 Mapping Network를 거쳐 Latent vector w로 변환한 뒤 이미지를 만든 후 해당 space에서 interpolation을 진행하면 더 linear한 space를 따라갈 수 있습니다.

위를 보시면 별도의 mapping network에 latent_z를 넣어 새로운 latent vector w로 변환한 것을 보실 수 있습니다.

 

 

PGGAN 아키텍쳐

그 다음은 코드를 참고하시면 다음과 같은 구조로 generator과 discriminator을 생성하게 됩니다.

 

<요약>

1.  Mapping Network에서 Latent Vector w를 뽑습니다. (Mapping network)

 

2. w를 Affine 변환을 거쳐 AdaIN에 들어가는 style 정보가 될 수 있도록 만들어줍니다. (Learned affine transform A)

 

3. 생성 네트워크는 저해상도부터 시작해 점차 너비와 높이를 증가시키는(해상도를 높이는) 방향으로 구성됩니다

                                                                              (9개의 block) 

4. 각각의 block은 2개의 Convolution layer와 2개의 AdaIN layer를 가진다. (Styleconv_block)

 

5. Convolution layer에는 너비와 높이를 증가시키기 위한 Upsampling layer가 포함된다.

-> 제가 진행한 실습 코드에서는 포함돼있지 않았습니다.

 

https://github.com/moonjoo98/self_paper_reivew/tree/main/GAN/StyleGAN

 

GitHub - moonjoo98/self_paper_reivew: 개인적으로 진행한 논문 리뷰 및 구현입니다.

개인적으로 진행한 논문 리뷰 및 구현입니다. Contribute to moonjoo98/self_paper_reivew development by creating an account on GitHub.

github.com


StyleGAN의 경우 구현된 사례가 별로 없어서 제대로된 설명이 힘드네요...

구현해보면서 StyleGAN의 핵심은 파악한걸로 우선은 만족하고 좀 더 공부해보고 이해해야할 것 같습니다.