Paper/Human

PointAvatar: Deformable Point-based Head Avatars from Videos

침닦는수건 2024. 4. 24. 13:42
반응형

내 맘대로 Introduction

 

point cloud를 이용하여 head avatar를 표현하되, 3DMM shape,pose parameter에 binding되게 만들어서 animation이 가능하도록 복원하는 것을 목표로 하는 논문이다. 3DGS가 발표되기 이전 논문. 

 

핵심 아이디어는 3DMM vertex와 대응되도록 point cloud를 생성한 뒤, 3DMM LBS 를 통해 변형해가면서 렌더링하는 것이다. 지금 보면 3DGS와 매우 유사한 논문. 다만 isotropic gaussian이라는 점이 차이. 

 

메모

1) canonical point cloud <-> canonical FLAME 대응 관계 만들기

2) canonical point cloud + offset  == canonical FLAME vertex로 정의

3) LBS(pcd+offset) 후 렌더링

4) 이미지와 비교.

--> point cloud 위치와 offset가 최적화됨.





pcd 초기화는 sphere 형태로 시작, 개수는 적게 시작해서 점점 증가.

중간중간 이상한 위치(어느 시점에서도 안보이는 위치로 이동한 애들은 pruning)

최적화 cost function은 뒤에 나옴.
point normal도 뒤에 렌더링을 위하여 구하는데, 그냥 point normal 구하듯이 하면 성능이 떨어지니

SDF 뱉어주는 네트워크를 하나 만들어 네트워크가 smoothing 해준 normal을 구한다. 

point cloud가 있으니 SDF volume을 계산하고 그걸 GT로 쓴듯
pcd color는 albedo + shading(light, view dependent) 로 나누어서 봄

canonical은 albedo값만 다룸

MLP를 하나두어서 color 예측하도록 함. 

사실 NeRF랑 동일

구현상 SDFnet 이랑 합침

사실 상 핵심

1) canonical pcd + offset == canonical FLAME vertex로 정의한 뒤, FLAME pose, shape parameter를 그대로 사용하는 새로운 blendshape basis를 찾음

(아마 빠른 학습을 위해서 FLAME vertex와 pcd 개수를 맞추고 basis들을 FLAME basis로 초기화하고 시작했지 않을까 싶다...)

2) 여기서 pose basis, expression basis, skinning weight가 학습됨.
deformation이 정해지면 point normal을 수식에 따라 계산해주면 됨.

최종 color는 앞에서 구한 albedo * shading으로 구현했는데

shading은 light, view depedent이므로 normal을 입력으로 계산했다. 

shading MLP 붙여서 해결.
최적화에 사용되는 cost를 계산하려면 gradient가 렌더링과정에서 연결되어 있어야 하는데 당연하게도 diff. renderer 사용함

요즘은 pytorch3d에 들어있어서 가져다 씀.

1) 렌더링 결과 간 perceptual loss

2) 렌더링 결과 간 color loss

3) pose basis, shape basis, skinning weight가 FLAME 본래 값에서 멀어지지 않도록.

4) mask rendering loss



반응형