Paper/Human

GGHead: Fast and Generalizable 3D Gaussian Heads

침닦는수건 2025. 4. 10. 19:15
반응형

내 맘대로 Introduction

 

상상만 했던 것을 직접 구현한게 나왔다. StyleGAN2의 3DGS 버전이다. latent 하나만 달랑 넣으면 template mesh에 대응되는 3DGS가 짠 나오는 논문. StyleGAN2 generator - 3DGS + diff. rasterizer - discriminator 3개만으로 풀어버렸다. 안 그래도 학습이 어려운 GAN 튜닝을 3DGS 같이 자유도가 높은 대상에 대해서 하는 것은 사실 누가 봐도 쉽지 않아보였는데 그걸 해버렸다. 그래서 SIGGRAPH에 됐나 보다....

 

메모

1) generator  UV domain 각 픽셀마다 3DGS primitives 예측

2) 3DGS 렌더링

3) discirimination.

latent 512 vector 를 UV map의 primitives로 생성!

UV map 형태의 3DGS gaussian primitives로부터 원하는 resolution에 따라 grid sampling해서 explicit 3DGS를 생성함

특별히 초기 위치는 template mesh의 mean shape으로 초기화하고 residual 을 예측하는 식으로 함.

-> 이렇게 안하면 자유도가 너무 높았을 것.
3D position이 사실 제일 중구난방으로 움직일 수 있는 녀석이다 보니 이 녀석을 regularization 잘 하는 것 (얼굴에 잘 붙어있도록 하는 것)이 핵심

그래서 mean template mesh vertex  + residual로 구현하되

residual도 열린 형태가 아니라 0.25 * 0~1 로 억제해서 결과적으로 25cm 이하로만 나오게 했다. 
각 gaussian의 크기도 얼굴이라는 대상의 특성 상, 크기가 그리 크지 않을 것이라고 가정함

각 gaussian의 크기도 7mm 이하에 머물도록 억제.


position, scale 이 두개의 범위를 억제하는 것 뿐만 아니라, 각 값이 0에 가깝도록 함.

opacity도 0에 가깝도록 억제.

각 3DGS 마다 UV map에서 sampling해서 만들어진 것이다 보니, 각 3DGS는 uv 값을 갖고 있음.

----
3DGS는 근데 굉장히 강력한 view synthesis 알고리즘이라서, 실제 geometry에 안맞더라도 렌더링 결과를 그럴듯하게 낼 수 있다.

따라서 3DGS를 Head uv에 대응되게 잘 만들었으나, 수렴하는 과정에서 중구난방으로 수렴하고 렌더링 결과만 그럴 듯하게 나올 수 있음.

-> geometry도 잘 얻어내고 싶은 상황에서 원하는 결과가 아님

-> 따라서 근접한 3DGS가 근접한 렌더링 픽셀을 만든다는 가정을 함

------------
이걸 어떻게 구현했느냐

1) 3DGS의 color를 해당 3DGS의 (u, v, 0)으로 바꿔치기함. blue channel이 0

2) 렌더링 후 TV Loss 갈김

이러면 3DGS -> pixel로 내려찍힌 위치를 알아내는 효과가 있다. 
pixel에 uv가 색칠해지니까, uv를 보고 어느 3DGS인지 알 수 있는 것.

이 때 인접 pixel과 uv가 많이 다르다면 서로 먼 3DGS가 이미지를 렌더링하고 있었다는 의미이므로, 바람직하지 않다고 여겨 loss를 발생시키는 것이다. TV Loss로.

---
색깔 바꿔치기 트릭 까진 좋았으나 diff.rasterizer를 통과하면서 opacity가 개입하기 때문에 바꿔친 색상이 그대로 이미지에 찍히지 않을 수 있다. blurry하게 찍힐 수 있음

이를 보정하기 위해서 opacity가 크다면 원래색 그대로 선명하게. opacity가 작다면 어둡게 (값이 작아지게) 만들었다. 

초기 UV Map은 256 256으로 시작하고, epoch 돌 때마다 올려서 512 512, 1024 1024까지 학습

GAN loss는 특별한 것 없이 rendered image vs 아무 이미지 던져주는 식

-> 튜닝을 어마나 했을까....



데이터셋은 놀랍게도 FFHQ 만으로 학습했고, EG3D 방식에 따라 crop + camera pose를 추출했을 뿐이다. 
진짜 개 잘된다. 이걸 보고 누가 template mesh로 초기화만 하고 그냥 discriminator로 학습한 결과라고 생각할까.

심지어 색상 초기화도 없고 위치 초기화만 한건데.


single feed forward 로 끝나니, 속도도 빠르고 모델이 단순해서 메모리 사용량도 적다.


친절하게도 template mesh를 바꿔가면서도 해줬는데, 큰 영향 없다고 한다. 
반응형