Paper/Human

3D Gaussian Blendshapes for Head Avatar Animation

침닦는수건 2024. 6. 19. 11:40
반응형

내 맘대로 Introduction

 

face 같이 geometry가 body나 cloth처럼 자유도가 그리 높지 않은 경우에는 blendshape이라는 기법으로 deformation space를 표현한다고 한다. (나도 blendshape이 뭔지 이번에 처음 알았다.) 대략 PCA의 eigenvector와 같이 deformation space를 표현할 때 핵심이 되는 방향을 찾아두고, 실제 변형을 할 때도 PCA 후 eigenvalue 바꿔가면서 원복 하듯이 하는 방식이라고 한다.

 

다시 말하면, 다양한 표정 (eigenvector 급) 을 미리 복원해두고 (표정 간에는 vertex tracking되도록) 실제로 deformation할 때는 이 표정을 섞어서 만드는 방식이다. 화난 표정 + 무표정 == 덜 화난 표정 나오는 개념. 

 

이 논문은 기존 face deformation 방식 그대로 blendshape을 사용하는데 vertex level이 아닌 Gaussian level에서 적용한 논문이다. 따라서 다양한 표정을 미리 복원해둘 때 각각은 vertex displacement와 color만 갖고 있는 것이 아닌 Gaussian primitives를 들고 있게 만든 것이다. 

 

아이디어 자체는 심플. 그러나 SIGGRAPH 논문이다. 완성도에는 의심할 여지가 없을 듯.

 

메모


1) 먼저 다양한 표정 촬영을 하고 표정 간에 Tracking이 되어야 하므로 FLAME model fitting

2) 무표정일 때. FLAME mesh surface에서 sampling한 점들을 갖고 Gaussian splatting 각각 수행 (이 때 densification, pruning을 막았을 것. 안그러면 tracking이 안되기 때문)

3) 그리고 이 초기 복원 결과가 각각 blenshape, B0 initial이 됨.

4) 뒤에서 다양한 표정 별로 Bk 한번 최적화 더 돌려주면 완성

5) Bk 만 수식(1)에 따라 weighted sum 하면 표정이 변화됨.

------------
이 때 입 안은 FLAME mesh가 포함하고 있지 않기 때문에 추가로 입 안에 볼륨을 잡고 따로 입 안 용 point를 샘플링했다. 

윗니는 head에 고정되도록, 아랫니는 턱에 의해 변형되도록 설정함.

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

다시 보니 
수식(1)에서 Bk를 쓰는게 아니라 dBk 를 쓰는게 의미가 크다.

상대 변형을 담도록 해둬야 나중에 B0만 갈아쳤을 때 새로운 사람들도 모델링할 수 있기 때문. 

이 논문이 한 사람 당 복원하는게 아니라 Blendshape 같은 경우 여러 사람 공용으로 쓸 수 있는 듯 하다.

각 표정 별로 이미 B0(Gaussian들)을 복원해두었고, 이를 움직여서 이제 다양한 표정 Bk (Gaussian들)을 복원해내야 한다.

Bk 초기값은 기존에 B0가 FLAME vertex에서 만들어 낸 것이기 때문에 FLAME pose parameter로 변형이 가능하다는 것을 활용했다. 

FLAME fitting 결과에서 얻은 각 표정 파라미터를 이용해서 0 to K vertex 별 움직임을 계산해두고 이 gradient만큼 B0를 움직여서 Bk를 만들었다. 

위치만 바꾸는게 아니라 Gaussian은 회전도 있어야 하기 때문에 이는 vertex가 해당한 face normal을 보고 어떻게 회전했는지를 반영해줬다. 
최적화는 앞서 초기화한 Bk에 joint 움직임+ head pose 움직임까지 반영해서 실제 이미지랑 더 잘맞도록 업데이트하는 과정이다.

여기서 놓치며 안될 포인트, Bk는 "표정"만 표현하는 blendshape이다. 따라서 턱 움직임이나 머리 돌림은 없다. 

FLAME pose parameter에 의해 LBS로 변형을 Bk를 한 번 더 해주고 렌더링 결과가 이미지와 맞는지 비교하는 방식으로 최적화 한다. 

--------------
이 때 FLAME vertex가 움직이는 정도에서 크게 벗어나지 않도록 regularization 잘 해줘야 overfitting 안된다고 한다.



mesh 변화에서 크게 벗어나지 않도록 억제하는 방법은 다음과 같다.

Bk 초기값을 만들 때 이미 FLAME에 의존하도록 만들어뒀고, pose에 의해 변형할 때도 FLAME에 의존해서 만들었다. 따라서 이렇게 FLAME에 의존해서 계산한 값을 기준으로 잡고

"residual"만 찾아내도록 최적화했다. 

수식(2)와 같이 첫 Ginit은 고정값으로 그대로 있고, 뒤에 따라 붙는 residual이 최적화되면서 최종 변형 상태를 결정하도록 했다.

이 때 residual도 변형 전후 위치 변화가 심하지 않을 경우 약화시키고, 위치 변화가 클 때만 강화해서 웬만하면 FLAME으로 만든 변형 범위를 벗어나지 않도록 했음

(거리 별로 차등을 둔 이유는 위치가 크게 안 변한 Gaussian이면 다른 값도 크게 변할 이유가 없다고 판단하는 것)



이렇게하면 수렴 상당히 잘한다고 함.

loss는 gaussian splatting loss그대로 쓰고 (3)

추가적으로 head 영역을 벗어난 gaussian을 최소화 하기 위해서 

alpha composition 결과가 mask를 벗어난 곳에서 높게 나오면 패널티를 부과함

-----------
마지막으로 입안을 모델링하기 위해 추가했던 윗니, 아랫니 gaussian들은  초기에 잡았던 입 안 volume 내부에 머물도록 SDF loss를 추가해줌.
반응형