Paper/Human

Towards Fast, Accurate and Stable 3D Dense Face Alignment (a.k.a 3DDFA)

침닦는수건 2023. 7. 14. 11:02
반응형

내 맘대로 Introduction

3DMM을 이미지에 fitting 시키는 논문 중 현재 SOTA라고 불리는 논문이다. body로 치면 HMR 류 논문의 SOTA이다. 성능을 높이는 것에만 집중하지 않고 cpu에서도 빠르게 도는 것을 목표로 했기 때문에 구조도 단순하고 네트워크도 그리 무겁지 않다. face pose가 필요한 논문들 (특히, NeRF 류) 에서 preprocessing으로 잘 쓰고 있는 논문이므로 성능은 실험적으로도 충분히 검증된 것 같다. 

 

메모하며 읽기

입력 이미지를 받고 MobileNet으로 feature extraction 후, 각각 keypoint 찾고 3DMM parameter찾는 모듈 입력으로 넣어주는게 전부다. 사실 엄청 간단한데 핵심은 keypoint 모듈은 학습 단계에만 쓰고 버림으로써 feature 효율만 높여주고 빠지는 것과 3DMM parameter 찾을 때 사용하는 loss가 dynamic하게 적용된다는 점이다. 이외 학습을 부스팅하기 위한 일종의 augmentation trick도 소개 한다.

알고리즘은 introduction읽고 나서 보면 이해할리 없으니 후반부로 옮겨두겠다.

배경지식으로 3DMM에 대해서 알아야 하는데, SMPL과 같은 방식으로 제작된 PCA 기반 parametric mesh model로 shape/expression parameter가 있다. 각각 얼굴 모양과 표정을 기술하는 파라미터라고 보면 된다. 각각 199개, 29개 dimension을 갖고 있지만 PCA 특성 상 eigenvalue가 큰 애들만 몇 개 골라내서 써도 표현력이 충분하기 때문에 잘라내서 쓰는데 이 논문에서는 40개, 10개를 썼다.

최종적으로 네트워크에 추정하는 값은 3DMM 파라미터 50개 + camera pose 12개다.
(3x4 matrix element를 그대로 추정하면 rotation matrix property가 깨진 값이 나올 수도 있는데 어떻게 처리했는지 안나옴...)

meta joint optimization, 즉, 3DMM parameter 모듈에서 사용하는 기법인데 여기서 사용할 두 개의 loss term을 먼저 설명한다. 

VDC는 vertex distance cost로 흔히 아는 vertex가 L2 distance다. 이름만 어렵지 간단함.

WPDCsms weighted parameter distance cost인데 이건 조금 신기했다. 수식 (7)처럼 사실 L2 distance로 만드는 weight를 사용하는데, 이 때 추정한 파라미터에서 i번째 파라미터를 0으로 처리하고 distance를 계산한 걸 weight로 쓴다. 

왜냐하면 i번째 파라미터가 0처리되었을 때 만약 distance가 커진다면 표현력이 큰 파라미터로써 현재 중요도가 높은 파라미터라는 뜻이므로 weight와 의미가 같기 때문이다. 이런 식으로 weight를 만들고 L2 loss를 사용한 것이 WPDC다.
실제로 WPDC를 구현하면 파라미터 개수만큼 껐다 켰다를 반복하면 계산해야 되기 때문에 연산시간이 크게 늘어난다. 62개의 파라미터가 있으니 62번 켰다 껐다 해야하는 셈이다. 하지만 순서만 바뀔 뿐 단순 반복 연산이기 때문에 머리를 잘 쓰면 matrix 연산처럼 동시처리할 방법이 있었다. 그 방식이 fWPDC다. 


meta joint optimization을 만들기 전에 냅다 VDC와 WPDC로 학습을 돌려보니 조금 독특한 양상이 나왔다. VDC는 수렴이 어려운 반면 WPDC는 수렴이 잘되는 양상이었다. 케이스 스터디를 해보았더니 WPDC로 학습하고 이후 VDC로 학습하면 또 수렴이 잘 되었다.

이 결과로 하여금 VDC와 WPDC 간의 순서, 비중이 학습에 지대한 영향을 끼친다는 것을 알고 meta joint optimizatino을 떠올리게 되었다.

맨처음엔 단순히 학습이 진행됨에 따라 VDC의 비중이 높아지도록 hyper parameter를 사용하는 방식을 떠올렸으나 그림 3을 보면 만족스럽진 못했다고 한다. 따라서 dynamic하게 비중을 조절해줄 수 있는 방법을 떠올렸다.

바로 소량의 train, test 셋, meta dataset이라고 불리는 것들을 만들어두고 학습 중간에 이를 이용해 VDC, WPDC 간의 효과를 검증하고 선택해서 쓴다. 

중간에 meta train셋을 이용해 VDC로만 업데이트한, WPDC로만 업데이트한 두 가지 버전 weight를 잠시 생성하고 이 두 weight로 meta test셋을 평가한다. 이 때 VDC 버전, WPDC 버전 중 loss가 더 적은 것이 무엇인지 판별하고 해당하는 경우의 loss를 사용하는 방식이다. (학습 속도는 개나 줘버린 것 같기도...)

3DMM 모듈로 충분해보이긴 하는데 keypoint 모듈은 왜 넣었느냐. 사용하진 않더라도 학습 시에 keypoint 모듈을 넣고 keypoint loss, keypoint <-> 3DMM vertex loss를 추가했을 때 성능이 뛰었기 때문이다. (해보다가 발견한 것 같다.)

그래서 학습 시에는 활용하고 학습이 끝나면 떼어내기로 결정한 것 같다.

마지막으로 갖고 있는 데이터가 너무 깨끗하다 보니 실제 사용 시나리오 중 대표적인 비디오에 적용했을 때 대처 능력이 조금 떨어졌나 보다. 그래서 비디오에서 대표적으로 발생하는 noise 4종류를 선별하고 이를 augmentation하는 방식으로 학습했다. 



첫번째는 gaussian noise, 순수한 영상 잡음, 두번째는 motion blur, 세번째는 in-plane rotation, 이미지 상에서 돌아가고 줄어들고 늘어나기 네번째는 out-plane rotation 3차원에서 머리 자체가 돌아감.


네번째는 사실 불가능한 augmentation인데 Face profiling이라는 논문을 활용해서 처리했다고 한다.

 

반응형