Paper/Human

Gaussian Head Avatar: Ultra High-fidelity Head Avatar via Dynamic Gaussians

침닦는수건 2024. 2. 17. 23:12
반응형

내 맘대로 Introduction

 

제목에서도 할 수 있다시피 gaussian splatting을 이용해서 head 복원을 하는데, expression을 자유자재로 바꿀 수 있도록 아바탕 형태로 복원하는 것을 목표로 한다. head의 경우 body와 달리 자유도가 낮기 때문에 복원이 쉽다는 장점이 있지만 사람의 identity를 결정하는 주요한 부분이므로 복원 퀄리티가 압도적으로 높아야 한다. 이 논문은 expression을 바꿀 수 있는 것에도 주목했지만 어떻게 퀄리티를 끌어올릴지도 고민한 논문이다.

 

핵심 아이디어는 NeuS로 강력한 초기값 계산 -> 3d gaussian splatting -> rendering -> super resolution 이다. 부족한 퀄리티를 강력한 초기화랑 super resolution 을 붙여서 해결했다. 

 

메모하며 읽기


어떻게든 퀄리티 좋은 아바타를 만드는 것에 집중하기 때문에 요구하는 입력 데이터가 꽤 된다.

1) 배경 제거
2) 무표정으로 촬영된 multi-view 이미지들 (초기화 + 학습용)
3) 다양한 표정을 촬영된 이미지들 (학습용)
4) 2-3) 이미지에 3DMM fitting (엄청 정확해야 함)
5) face keypoint 추출

2)는 NeuS를 돌려야 하기 때문에 syn가 맞는 multiview 이미지여야 한다. 
기본 3dgs (1) 에서 point 마다 128 채널을 갖는 learnable parameter가 추가된 모양이다. 

이 parameter는 intrinsic feature로 head expression에 따라 위치 별로 다르게 움직이고 변화하는 것을 학습으로 커버하기 위해 부여한 것이다. 직접 모델링하는 부분이 아님. 학습으로 자연스럽게 찾아지는 값.

-------------------
전체 과정은 간단하다. 

무표정이 기준이 된다. 무표정을 표현하는 3d gs 상태를 canonical space로 본다. 

canonical 3d gs들 + expression + head pose가 주어지면 변화된 deformed 3d gs 파라미터가 나오도록 네트워크를 학습하는 것이다. 

deformed params = (canonical params + expression + head pose)

위 과정을 각 parameter 단위로 쪼개서 보았을 때 position은 수식(3)과 같다.

canonical gs 위치에 expression에 의한 위치 변화 + head pose에 의한 위치 변화를 추정해주는 MLP 2개가 따라 붙는다. 

각 MLP는 expression, head pose parameter를 canonical gs position과 같이 받는 간단한 형태다. 

---------------

추가적으로 face에서 keypoint 위치들은 아주 핵심적인 위치라는 가정 하에 keypoint 위치에 대해선 강조하는 내용이 들어간다. 

MLP가 뱉어준 위치 변화를 각각 weighting해서 더해주는데 이 때 keypoint에 매우 근접한 gs일 경우 weight를 1, 멀 경우 0을 주는 식이다. 

이러면 네트워크가 keypoint를 deform할 때 무조건 정확해야 된다고 가이드 받으므로 keypoint는 집중해서 deformation하게 된다. 자연스럽게 keypoint 주변 gs를 옮기는 능력도 뛰어나진다.

color는 큰 차이없이 position과 같은 방식으로 2개의 color MLP를 달아 업데이트해준다.
rotation, scale, opacity도 같은 방식인데 MLP를 공유해서 2개만 쓴다. 총 6개 쓸 것을 2개로 쓰는 방식.

독특한 점은 rendering 할 때 32channel 이미지로 렌더링한다는 점이다. 512x512 해상도로 렌더링을 하는데 첫 3채널이 RGB고 나머지는 뒤에 따라붙을 super resolution 네트워크를 위한 feature dimension으로 남겨둔다.

3d gs + super resolution 한 번에 학습되고 high resolution에서는 l1 loss랑 VGG loss, low resolution에선 l1 loss 사용함.
근데 위 학습이 안정적이려면 초기화가 엄청 중요함. 대충 했다간 expression, head pose에 따른 변화를 배우기는 커녕 형상을 찾는 것도 어렵기 때문이다.

그래서 내린 결론이 꽤나 정확한 mesh를 얻어서 mesh vertex를 초기값으로 사용하는 것이다.

mesh는 NeuS와 같이 Neural surface reconstruction 사용한다.
 neural surface reconsturction을 쓰면 당연히 퀄리티 좋은 mesh가 나오니 좋은 초기값을 얻을 수 있다.

근데 더 주목해야 할 부분은 deformed color, deformed position MLP들 마저도 초기화할 수 있다는 것이다.

NeuS + expression/head pose condition으로 학습하는 과정에 color MLP, position MLP 따위가 붙어있을텐데 이걸 떼와서 뒤에서 써도 된다는 말이다. (입력도 같은 뿐더러 해야하는 역할도 동일함!)

초기화에 사용할 loss는 NeRF color loss + mask가 있으니 silhouette loss다.

역시나 32 채널 이미지 사용하므로 첫 3채널에만 loss를 가한다.
keypoint는 초기화할 때도 강조하는데, 초기화 네트워크 안에 deformed position MLP에서 keypoint 위치에 대해서 l2 loss를 추가해준 것이다. (3d gs할 때 했듯이 여기서도 똑같이)

3가지 regularization은 덤.
초기화가 끝나면 mesh vertex는 3d gs 초기 위치로 한다.

해당 위치에서 NeuS가 뱉어주는 feature도 그대로 사용함.

MLP 역시 그대로 떼어와서 사용함.
반응형