Paper/Human

3D Face Reconstruction with the Geometric Guidance of Facial Part Segmentation (3DDFA v3)

침닦는수건 2024. 5. 17. 10:59
반응형

내 맘대로 Introduction

3DMM (여기선 FLAME 안쓰고 BFM, FaceVerse 씀, 아마 서양인 데이터 bias 때문이지 않을까.)  을 이미지에 fitting하는 논문. HMR의 face version인데, 3DDFA version3인 셈이다. 

 

핵심 아이디어는 기존 논문들이 keypoint에 집중하던 걸 확장해서 segmentation mask를 이용한 fitting이다. segmentation mask를 사용하는 아이디어 자체는 흔하지만 기존 방식과 다르게 단순히 렌더링 결과만 놓고 pixel by pixel로 비교하는 것이 아니라, 새로운 loss를 제안해서 풀었다. 

 

(2d segmentation -> 3d lifting ) <-> (segmented 3d model)

 

mesh geometry가 segmentation mask에 더 직접적으로 반응하도록 설계된 loss 덕에 detail까지 표현할 수 있는 모델 파라미터가 잘 찾아진다.

 

개인적으로 흔하디 흔한 문제를 다뤘고 흔하디 흔한 source를 갖고 풀었는데, 새롭지 않다고 포기하지 않고 새롭게 생각해서 접근했다는 점이 좋다. 자기만의 연구 느낌이 나서 좋은 듯.

 

메모


모델은 FLAME 안 씀. 

BFM과 FaceVerse 사용. (서양인 데이터 bias 때문으로 생각함.)

카메라는 fixed perspectivep projection. 카메라 포즈랑 intrinsic을 대충 고정함.

texture도 찾아내는데, texture는 albedo(diffuse) + SH(specular)
시작은 이미지 part segmentation,
1) 양쪽 눈썹 각각
2) 양쪽 눈 각각 (표정 표현에 가장 중요하다고 생각해서 그런 듯)
3) 코
4) 입술
5) 얼굴 피부 (여집합)

알고리즘은 DML-CSR

이마는 의도적으로 눈썹 위로 잘라냄 
( 이마가 앞머리에 의해 가려지는 일도 많으니 오히려 방해됨을 걱정해서 잘라낸 듯.)


이젠 BFM, FaceVerse의 vertex segmentation

카테고리는 위 5개 종류와 동일하게.

직접할 수도 있지만, 데이터셋이 있으니 2d seg.를 보고 반복적으로 일치하는 vertex를 같이 3d seg.함. 후에 약간 손질.

역시나 이마 위는 배제됨.


직접한 이유는 기존 segmentation 영역이 너무 대충이기 때문.


핵심은 여기.

2d seg <->projected 3d seg를 비교하는 loss

단순히 IoU를 계산하는 방식은 효과가 떨어진다고 함.

그래서 직접 Vertex-to-pixel loss를 계산하는 방식으로 변경.

이 때 vertex수와 pixel 수가 다르고 correspondence를 계산할 수 없다. 따라서 anchor를 활용하는 방식으로 변경

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

1) pixel 마다 anchor 생성 (3d point 형태)
 - 아마 특정 거리에 3d plane 형성하는 형태

2) 영역 별로 각 anchor point와 back-projected 2D seg. point 
anchor point와 3d seg. vertex 거리를 계산함

d1, d2

그 중 min, max, avg 3개 거리 값을 줄이도록 강제




여기서 back-projected 2d seg.는 현재 추정된 3DMM 파라미터로 vertex들을 만들고 그대로 입힌 것.
위 PRDL loss와 더불어 landmark, photometric loss, perceptual loss로 학습함. 

regularization은 파라미터가 0에 가깝도록 유지.


좀 뜬금없지만, segmentation가 같이 제공되는 데이터셋도 같이 만들었다고 함. 학습할 때 쓴듯?

이 PRDL이라는 방식이 효과가 좋은 이유는 단순히 그냥 그렇게 한 것이 아니라 실제로 gradient 계산을 해보면 유의미하게 vertex 단위로 정확한 방향으로 이동시키기 때문임.

수식(11)이 핵심인데, anchor 대비 현 추정 결과 vertex 위치가 이동해야할 방향을 정확히 표현하고 있음.



min, max가 boundary vertex들을 움직여주고, avg가 centroid를 움직여주는 모양이며

주변에 anchor가 엄청 많기 때문에 boundary 전체, centroid 반복 강제하는 모양이 된다. 

더 특별한 점은 segmentation mask 영역 밖의 anchor도 기여를 크게 한다는 점. (기존 방식에서는 해당하는 영역만 개입함)

이 방식의 장점을 한 번 더 강조해주는데,



이렇게 명시적 거리 기반 loss로 하면 mask 외 영역 pixel들도 loss 계산에 관여하기 때문에 수렴 속도와 퀄리티가 훨씬 좋아짐.





결과가 기존 논문들은 잘되는게 맞나 긴가민가 싶은데 확연하게 잘되는게 보인다.


극단적인 표정은 당연히;;
반응형