Paper/Human

Anatomically Constrained Implicit Face Models

침닦는수건 2024. 6. 27. 11:36
반응형

내 맘대로 Introduction

 

이 논문은 FLAME, Faceverse와 비슷하게, Face mesh 모델을 제안한 논문인데 약간 컨셉 차이가 있다. 모든 인물에게 전반적으로 사용 가능한 face mesh 모델이 아니라 사람 1명에 국한된 face mesh 모델을 만드는 방법을 제안했다. 대상 범위를 1명으로 줄이면서 그 보상안으로 표현력을 대폭 끌어올리는 것이 이 논문에서 보여주는 장점이다. 

 

개개인 얼굴에는 다른 사람과 다른 고유 근육의 움직임들이 있는데, 그 디테일을 표현하기에는 확실히 사람마다 모델을 들고 있는게 좋다. 실제로 영화 산업 같은데서도 배우 별로 따로 복원해서 쓴다고 한다. 따라서 컨셉 자체는 reasonable 하다.

 

얼굴을 변형할 때 기준이 될 수 있는 가장 큰 단서는 얼굴 아래 뼈, 두개골과 턱 뼈에 의해 변형된다는 사실이다. 그런데 명시적으로 이 두개골과 턱 뼈를 3D SCAN만 갖고 찾아낼 순 없으니, 두개골과 턱 뼈 역할을 하는 Anatomy 하나를 찾는 것과 동시에 그걸 기준으로 변형하도록 모델을 만들었다. 

 

여기서 말하는 anatomy는 실제 인간의 뼈 구조랑은 조금 거리가 있다. 얼굴 변형의 기준 역할을 하나의 내부 구조일 뿐 해부학적으로 어떤 의미가 있는 것은 아니다. 그렇지만 anatomy라고 그냥 이름 붙였다. 

 

확실하게 피부 밑에 기준점이 있다 보니, 이마, 턱처럼 뼈 움직임에 바로 종속되는 부분의 표현력도 좋고, 볼처럼 non-rigid 하게 변형되는 부분 조차도 그 변형 값의 범위가 줄어드니 성능이 올라간다. (contraint 하나도 없는 것보다야 피부 밑에 anatomy에서 멀어지지 않도록 제한되니까)

 

남들과 다르게 생각해서 같은 문제를 잘 풀어낸 좋은 논문이라고 생각한다. 굳이 해부학적으로 말이 될 필요는 없다고 청개구리 생각으로 시작한 논문.

 

특징은 모델 정의를 implicit 하게 했다. 다른 말로 template mesh + PCA eigenvalue, eigen vector가 주어지는게 아니라 template mesh + MLP 여러개가 주어진다. 

 

메모




모델은 Template mesh를 3D scan들에 Fitting하는 것 동일하다.

하지만 template mesh의 vertex를 직접 움직이는 것이 아니라

vertex = 피부 밑 anotomy 상의 위치 + anatomy normal 방향으로 두께로 모델링을 해두고 [수식(1)]

anatomy 상의 위치 , normal, displacement를 움직여서 fitting 한다. 
-----------------
fitting이 완료되면 template mesh 피부 밑의 anatomy 모델도 찾아지고, normal도 찾아지고, 피부 두께도 찾아지는 셈

이렇게 찾은 anatomy + normal + displacement는 기존과 같이 LBS 변형할 수 있다. 여기에 표정에 따른 변화만 더해주면 얼굴 표현이 가능하다. [수식(2)]

왼쪽 그림과 같음

fitting하는 단계는 neutral geometry를 찾는 과정 까지만 !
여기서 하나 의문이 들 수 있는 것은

anatomy라고 부르는 저 피부 밑 구조는 해부학적으로는 두개골 + 턱뼈에 해당할 것이다.

하지만 지금 anatomy, s를 찾아내는 것은 unsupervised 방식이기 때문에 제멋대로 찾아질 것이고, 실제 해부학과 거리가 있다.

-> 저자도 이 점을 인정하지만 생각을 바꾸어 anatomy의 개념을 재정의한다.

저자가 표현하길,

볼과 같이 non-rigid deformation하는 영역 조차도 rigid deformation으로 approximation할 수 있게 만드는 피부 밑 "무언가" 를 anatomy라고 부른다.

이렇게 하면 해부학과는 거리가 멀지만 문제가 쉬워진다. 이마든 볼이든 턱이든, 기존 방식이 rigid, non-rigid 구분해서 풀었든 이 "무언가"를 이용한다면 전부 다 rigid deformation으로 풀 수 있다.

굳이 해부학과 일치해야 하나? 문제가 쉬워지면 되지.






모델 구성은 다음과 같다.

template mesh가 하나 있다. 이건 최대한 대상이 되는 개인에 맞추어져 있다. (안 맞다면 registration해서 최대한 맞게 변형해서 그걸 template mesh로 사용)

template mesh의 vertex를 입력으로 받는 MLP 3개

1) anatomy 위치 찾는 B
2) anatomy normal 찾는 N
3) anatomy normal 방향으로 두께 D

이걸 무표정에서 찾으면 된다. 하지만 무표정은 1컷이기 때문에 overfitting될 게 분명하므로 20 스캔을 활용해서 찾는다.

하지만 20 스캔은 서로 다른 표정이므로 여기에 표정에 대한 것도 같이 찾아내야 하는 상황이 됨.



수식(2)과 같이 LBS + expression deformation 

이렇게 최종 변형된 si까지 간 뒤에 최적화를 함.

이 과정에서 skinning weight처럼 찾아야 되는게 추가될텐데 그것도 MLP를 새로 달아서 같이 계산했다. (skinning weight도 여러 스캔을 봐야하니가 한 번에 푸는게 좋긴 함.)

expression deformation은 단순히 ei 하나도 퉁 칠수도 있지만 그러면 범위가 너무 크기 때문에 기존 방식대로 blender shape을 찾아주는 MLP를 두고 진짜 minor한 reisudla displacement만 ei가 찾도록 분리해서 찾음

-----------------
그러면 20 스캔을 보면서 B, N, D 는 알아서 공통되는 부분을 찾아서 수렴할 것이고 K, E는 skinning weight랑 blendershape찾고, 나머지만 ei 가 커버하도록 학습됨.


최종 surface point가 3D SCAN과 같을 것

미리 대충 anatomy를 초기값을 잡고 시작하는데, 초기값과 멀지 않을 것.

피부 두께 너무 크지 않을 것.



좌우 대충 될 것 (여기서 anatomy상의 대칭만 고려함)

skinning weight가 이마 같은 움직임 없는 곳은 0에 가까울 것.

기존 모델 만들 때 썼던 20개 스캔 말고, 새로 SCAN이 들어오면 어떻게 fitting할 수 있을까

LBS skinning weight 있고, blendshape도 있으니 transformation과 blendshape weight만 계산하면 됨. 

주어진 3D SCAN에 대해서 해당값들을 최적화하면 끝.

이 때 직접 그값을 최적화하는 것보다 neural reparametrization 을 썼다고 함.

scan 마다 learnable latent를 부여하고 이 latent로부터 transformation과 blendshape을 찾아내는 MLP를 붙이고 같이 최적화하는 것이다.

굳이 3D SCAN을 latent로 압축하고 MLP를 이용해 decoding하는 방식을 최적화 과정에 끼워넣어주면 더 성능이 좋다고 함 (NeuFace)





피부 두께에 해당하는 d만 일부러 scale하면 그럴듯하게 얼굴 변형할 수 있음!



그냥 다른 fitting하는 방식들보다 수치 좋음. (변형 표현력이 좋다는 듯)
반응형