Paper/Human

Self-Supervised Monocular 3D Face Reconstruction by Occlusion-Aware Multi-view Geometry Consistency

침닦는수건 2023. 8. 2. 10:43
반응형

내 맘대로 Introduction

3DDFA 처럼 얼굴 이미지 한 장 들어왔을 때 해당 얼굴에 대응되는 3DMM 파라미터와 R|t를 뱉어주는 네트워크다. 차이점은 학습할 때 multiview constraint를 써서 성능을 높였다는 점이다. 개인적으로 이런 multiview consistency를 사용하는 논문들이 깔끔한 것 같아서 맘에 든다. 하나 아쉬운 것은 이를 위해선 카메라 포즈가 사전에 계산되어 있는 얼굴 데이터가 있어야 하니 데이터 수집 측면에서 단점이 있는 논문이라고 할 수 있겠다. 

 

메모하며 읽기


학습 시에만 multiview image를 사용하고, inference 시에는 singleview image 이미지를 쓰는 네트워크다. 입력은 이미지, 출력은 3DMM 파라미터인데, 이를 multiview image에 각각에서 3DMM 파라미터를 얻어낸다. 이후엔 3D mesh가 있는 셈이고 서로 간의 correspondence를 계산하는 것이 매우 쉬운 일이니 correspondence를 이용해 사용할 수 있는 온갖 consistency는 다 추가해서 loss를 걸어주는 방식이다. 

출력은 3DMM의 identity, expression, texture 파라미터와 카메라 포즈 SE3, 마지막으로 텍스처를 다루기 위해서 spherical harmonic coefficient로 조합되어 있고 총 257 dimension이다.

먼저 이 논문에서 말하는 rendering, view synthesis라는 단어를 먼저 짚고 넘어가야 할 것 같은데, 일단 둘은 volume rendering과 무관하다. NeRF 컨셉과 전혀 관련이 없는 단어이며 착각하면 안된다. rendering은 현재 single view에서 추정한 3DMM mesh(w/ texture)로 single view image/depth를 만드는 것, view synthesis는 multiview에서 추정한 3DMM mesh(w/ texture)를 warping해서 single view image/depth를 만드는 것이다.

위에 소개된 2D feature loss들은 rendering이라는 단어를 사용했으므로 single view 내에서 끝나는 loss들이다. t-1, t+1 시점 정보는 쓰이지 않는다. 

먼저 render loss 는 앞서 257개 파라미터 중 텍스처를 위한 SH coefficient 를 추정했으므로 이를 이용해 다시 image를 만들어내고 원본 이미지와 비교하는 loss다. 얼굴에 해당하는 영역에만 매겨진다.

landmark loss는 이미 유명하듯, projected 3DMM vertex vs GT 2d landmark다. 

identityloss는 feature level에서 similiarty를 계산해주는 loss로 두 얼굴이 latent level에서 유사하도록 유도해서 사람이 달라지는 일을 막는 loss다.

regularization loss는 3DMM 파라미터를 추정하는 네트워크다 보니 파라미터 값이 튀지 않도록 0으로 당겨주는 loss다.



 이제 multiview loss를 소개할 차롄데 사전에 multiview에서는 occlusion 이슈가 있기 때문에 이를 해결하기 위해서 occlusion mask를 생성한다. 원리는 간단한데, 3D mesh가 있다보니 이를 추정한 R|t로 rendering하는 과정에서 각 mesh face들을 rasterization하게 되고 자연스럽게 어떤 mesh face가 이미지에서 보이고 안보이는지 구분할 수 있다. 

이런 식으로 두 이미지를 짝지어 볼 때, 두 이미지 모두에서 보이는 mesh face를 찾아내고 이를 이미지로 projection함으로써 occlusion에서 자유로운 pixel들을 찾아낸다. mesh face를 pixel로 바꾸는 과정은, 그림 (c)와 같이 삼각형 주변 pixel 모두를 사용하는 간단한 방식이다. 그냥 rasterization 결과 pixel들이다.



결과적으로 위 그림과 같이 occlusion에서 자유로운 애들만 warping해서 사용하는데 consistency가 꽤 많이 높아진다.
multiview loss 첫번째인데 correspondence를 알고 있으니, 이미지를 warping해서 reference image vs warp(source image) 비교를 하는 loss다. covisible mask는 당연히 사용된다.

multiview loss 두번째. rgb도 됐으니 개념 상 depth도 된다. 3DMM mesh + camera pose를 알고 있으니 depth를 얻어내는것은 당연히 된다. 다만 어디까지나 네트워크는 single view image to 3DMM이기 때문에 up to scale로 나오는 문제가 있어 그대로 warping하면 문제가 있다. 얼굴을 크게 크롭하면 가깝게, 얼굴을 작게 크롭하면 멀리 나오는 문제도 있을 것이다.

따라서 scale을 없애주기 위해서 두 depth map 끼리 평균 비율을 계산해서 나름 normalization해주고 사용한다. (확실한 방법같진 않아서 얼굴 이미지 크롭을 정확하게 해주는 것과 같이 써야할 것 같다.)
multiview loss 세번째. 안 등장하면 섭섭할 epipolar constraint다. landmark와 카메라 포즈가 주어져 있으니 두 이미지 각각에 epipolar line을 그리고 landmark들이 이 line과 얼마나 떨어져있는지를 loss로 사용했다. 결과적으로 epipolar constraint를 만족하도록 유도한다.



많은 논문에서 이미 도움이 된다는 것이 밝혀졌기 때문에 역시나 여기서도 효과적이다.
새로운 내용이 아니라 앞선 multiview loss들과 single view loss들을 어떤 비율로 섞었는지 디테일을 적어둔 것이다.
반응형