논문 리뷰/face

[논문 리뷰] FaceScape

curious_cat 2023. 5. 17. 23:50
728x90
728x90

개요

기본적으로 고퀄 3DMM을 어떻게 만들었는지에 대한 논문이다. 그리고 이 3DMM 기반으로 single view face reconstruction을 하는 방법을 제시한다. 이번 리뷰에서는 3DMM 제작에 대해서 주로 다룰 것이다. 참고로 2개의 논문으로 쪼개서 나왔다:

관련 포스트:

FaceWarehouse와 비슷하게 FaceScape도 FACS 기반 표정을 사용한다. Shape은 다른 3DMM과 비슷하게 PCA를 사용한다.

 

제작 과정

데이터 수집

  • 68개의 DSLR 카메라를 사용했다. 안면을 찍는 30대는 8K, 나머지는 4K로 촬영했다. 카메라들은 동시에 촬영하도록 (오차는 5ms 이하) 싱크를 맞춰줬다. 
  • 16~70세 사이 938명의 얼굴을 촬영했다 (대부분 아시아인)
  • FaceWarehouse와 비슷하게 20개의 표정을 촬영했다 (무표정 포함)
  • 총 20 * 938 - 18760개의 얼굴 mesh를 reconstruction했다 (얼굴 표정을 제어한 3D 데이터셋은 과거에 비해서 최다수)
  • 이렇게 얻은 raw mesh는 대략 2,000,000 vertices, 4,000,000 triangles 로 이뤄져 있다 (face scan 후 raw point cloud data를 mesh로 바꿔서 얻은 mesh이기 때문에 vertex 와 triangle 수는 scan마다 다르다)
  • 나이, 성별 등 기록해뒀다. 분포도:

Topologically uniform model

  • 우선 눈, 눈썹, 입같은 3D facial landmark를 사용해서 template mesh를 3D 스캔에서 얻은 mesh에 대충 align하고, nonrigid ICP를 사용해서 template mesh를 deform하면서 3D  스캔에 더 정확하게 registration해준다. 
  • 이렇게 template mesh를 deform해서 registration을 하면 전반적인 얼굴 모양은 잘 표현이 가능하면서 모든 mesh가 같은 mesh topology를 갖는다는 장점이 있다. 하지만 template mesh의 vertex 수가 적기 때문에 모든 detail을 잘 캡쳐하지는 못한다.
  • 이렇게 template mesh를 registration하면서 잃게 되는 디테일은 UV space에서 displacement map에 저장한다: UV space에 각 pixel마다 대응되는 registered mesh에서 raw mesh까지 signed distance를 저장한다. 여기서 registered된 mesh에서 raw mesh까지 signed distance는 registered mesh에서 normal 방향으로의 raw mesh까지 거리를 뜻한다 (normal 방향이 +, normal 반대는 방향이 -).
  • 이렇게 얻은 representation을 topologically uniform model이라고 부르고, raw mesh 대비 메모리는 2%밖에 안되지만 mean absolute error은 0.3mm 이하라고 한다

multi-view image -> raw scan -> base model (template mesh를 registration한 모델) + displacement map (통틀어서 topologically uniform model이라고 부름)를 얻는다

Appearance based refinement

  • 이전 단계에서 얻은 topologically uniform model은 얼굴 shape은 잘 맞추지만, stretching deformation은 잘 표현이 안된다. 예를 들어 사람이 눈썹을 올렸을 때, template mesh에서 눈썹에 대응되는 vertex도 같이 위로 움직여줘야하는데, nonrigid ICP를 할 때 이것이 반영이 안 된다. 그 이유는 nonrigid ICP에서는 template mesh와 raw mesh 사이의 거리를 최소화하기 때문에, 표면과 평행한 방향의 움직임 (예를 들어서 눈썹을 올리면 얼굴 표면과 평행하게 vertex가 움직여야 한다)은 잘 캡쳐하지 못한다. 
  • 이런 문제를 해결하기 위해서 UV texture map에서 optical flow를 사용한다.
  • UV texture map은 동일한 사람이면 (거의) 같아야한다. 참고로 UV texture map의 각 pixel은 template mesh의 특정 위치와 대응이 된다. 눈썹을 움직여도 이 대응관계는 유지되기 때문에 UV texture map은 대략적으로 같아야 한다. 하지만 이전 단계에서 registration을 하고 UV texture map을 구해보면 texture map이 다르게 나온다 (밑에 그림 참고)
  • 그 이유는 눈썹을 올렸을 때 nonrigid ICP에 이 움직임이 반영되지 않아서 template mesh의 눈썹에 대응되는 vertex는 위로 올라가지 않기 때문이다. 그래서 눈썹이 올라가면 눈썹 위에 있는 vertex에 눈썹 색이 입혀지게 된다 (밑에 그림에서 neutral, brow raiser-before 참고)
  • 이 문제를 해결하기 위해서 optical flow를 계산해서 (DeepFlow 사용) 보정해준다 (밑에 그림에서 optical flow, brow raiser-after 참고)

  • 구체적으로는 neutral face와 표정을 지었을 때 texture map에서 optical flow구하고, vertex가 실제 있어야 할 위치를 구한 후, template mesh를 이 위치에 잘 대응되도록 deformation을 해준다:

Bilinear Model

  • Registered된 template mesh를 모아서 (26317 x 52 x 938) array를 만든다
    • Template mesh는 vertex가 26317개
    • 표정이 52개
    • 사람 수가 (identities) 938
  • 여기서 identity 쪽으로 PCA를 해서 3DMM을 만든다 (FaceWarehouse와 같이)

추가 노트

스캔이 완벽하지는 않다. 예를 들어서 lip funneler같은 경우 다음과 같은데 입술 부분이 찌그러져있다.

728x90
728x90