Paper/Human

[Human] SelfRecon: Self Reconstruction Your Digital Avatar from Monocular

침닦는수건 2023. 3. 8. 00:24
반응형

SelfRecon: Self Reconstruction Your Digital Avatar from Monocular Video

 

내 맘대로 Introduction

이 논문은 SMPL + NeRF 컨셉을 이용해서 3D Human reconstruction을 목표로 하는 논문이다. NeRF 컨셉을 녹인 것이기 때문에 결과물로 나오는 3D Human mesh는 SMPL류도 아니고 rigging이 가능한 형태도 아닌 그냥 mesh 덩어리다. 그냥 입력 데이터에 딱 맞는 덩어리가 나오는 논문이다. contribution 자체가 explicit method (SMPL 기반) 과 implicit method (SDF + NeRF) 를 합친 것에 있다. 
 
사실 상 SMPL에 옷을 커버하는 +@를 더하는 컨셉을 유지하고 그 시작인 SMPL+D (2015년에 나온 VideoAvatar에서 사용한 모델) 보다 나은 결과를 얻고자 도전한 것 같다. NeRF 컨셉의 MLP로 +@를 추정하기 때문에 최적화 기반 방식보다는 강점이 확실히 있을 것 같고 그렇기에 이전과 달리 조금은 펑퍼짐한 옷까지 커버가 가능해보인다.
 
하지만 역시나 펄럭임이 심한 옷은 MLP가 수렴을 안 할 것이라 실패할 가능성이 높지 않을까 의심이 조금 가긴 하는 논문이다. 주로 다룬 데이터셋도 사실상 동작 변화 거의 없고 제자리에서 돌기만 하는 people snapshot으로 고른 것만 봐도 조금 느껴진다. 
 
 

핵심 내용

위 그림만 봐서는 되게 간단해 보일 수 있지만 위 그림에 들어서기 전 사전 작업 단계가 더 복잡하다. 

  1. 비디오의 각 프레임마다 SMPL 피팅을 하고 (SMPLify 같은 것으로), pose/shape parameter를 다 찾아두어야 한다.
  2. PiFuHD를 이용해서 각 프레임마다 normal image를 뽑아두어야 한다.
  3. 1.에서 얻은 SMPL 피팅 결과를 이용해 deformation field를 만들어 두어야 한다.

1~2 과정은 이 글에서 설명할 범위가 아니기 때문에 건너뛰고 3.부터 설명하도록 하겠다. 
 

Deformation fields

먼저 Deformation field란 다음과 같다. 사람은 물체처럼 형상이 가만히 있는 물체가 아니기 때문에 multi-view contraints를 쓰더라도 3D recon이 쉽지 않다. 따라서 카메라가 움직여서 발생한 움직임이 아닌, 사람이 움직여서 발생한 움직임을 동시에 이용해야 한다. 그 사람이 움직인 것을 vector로 표시한 것이 deformation field다. 사람 표면의 한 점 p가 있다고 했을 때, 자세0의 p 위치에서 자세 1의 p위치를 가리키는 vector 라고 생각하면 된다. 
 
본 논문에서는 두 가지 형태를 사용했다. 사람은 자세 뿐만 아니라 옷, 머리카락 등 "움직임"이라고 할 만한 것들이 너무 많기 때문에 하나로 변화를 기술하기가 쉽지 않다. 따라서 자세 vs 기타로 나누어 다루는게 일반적인데 논문에서도 그대로 따랐다. 
 
자세로 인해 변하는 것들은 Skinning transformation field, 기타 잡다한 것으로 변하는 것들은 Non-rigid deformation field라고 불렀다. Skinning transformation field는 SMPL을 적극적으로 이용한다. 위 사전준비 1.에서 얻은 SMPL 피팅 결과를 voxel grid로 둘러싸고 voxel grid cell 위치 하나하나 마다 인접 SMPL 모델 vertex 30개의 skinning weight를 평균내어 저장한다. 이 짓을 한 번 해두면 voxel grid cell 마다 어떤 vertex를 따라 움직여야 하는지 알 수 있기 때문에 다음 프레임의 새로운 SMPL 자세가 주어졌을 때 대략 어디로 이동할 지 알 수 있다. 간단히 voxel grid cell 마다 다음 프레임의 어느 cell로 이동할지 알게 되는 것이다. (기준 프레임에서 미리 한 번 계산해두는 것으로 끝낸다.)
 
이 결과는 단순히 SMPL (옷 없음) 모델로만 만든 field 이기 때문에 자세로 인한 움직임을 기술하는데 기여할 뿐 옷과 머리카락 등 기타 잡다한 것들은 배제되어 있다. 이 voxel grid 들을 이용해서 어느 프레임에서 3D point 위치가 주어지면 다른 프레임에서 해당 3D point가 자세로 인해 어디로 이동할지 대충 (그러나 꽤나 정확하게) 찍을 수 있다. trilinear interpolation을 활용한다.
 
Non-rigid deformation field는 그냥 MLP다. 거창하게 말했지만 그냥 특정 프레임마다 기타 잡다하게 변하는 움직임을 함축하는 conditional variable이 존재한다고 가정하고 h 라는 optimizable 변수를 만들고 이를 입력으로 받고 x,y,z vector를 출력으로 하는 네트워크다. 
 
p -> Non-rigid deformation - > skinning transformation 순으로 변화시키면 다양한 사람 겉모습 변화를 기술할 수 있다.
 
이것으로 사전 준비는 끝이다. 
 

Canonical implicit SDF

이 논문은 복잡해보여도 결국 SDF+NeRF 컨셉이기 때문에 공간에 대해 SDF를 잘 예측하는 f(p)를 학습시키는 것이 목표다. 이것을 학습시킨 뒤 공간을 SDF로 채우고 Marching cube로 mesh화한다. 이 때 공간은 비디오의 여러 프레임 중 하나에서 정한 래퍼런스 프레임에 대응되는 공간 1개 뿐이다. 이것을 canonical space라고 했고, 다른 프레임 정보도 전부 래퍼런스 프레임으로 가져와서 canonical space 상 SDF를 잘 맞추는 것에만 집중하도록 했다.
 

Differentiable Non-rigid Ray-casting

위 deformation field 개념을 정의해서 vector를 얻어내는 방법은 만들었다. 근데 문제는 움직일 3D point를 찾는 문제다. 기존 NeRF류 논문을 조금 읽어봤다면 학습할 때 쓰는 3D point는 형상의 표면에 집중해서 sampling 할수록 좋다는 것을 알 것이다. 그런데 지금 상태는 표면이 SDF function, f만 알고 있기 때문에 표면이 어딘지 모른다. 
 
궁여지책으로 현재까지 학습된 f를 이용해 marching cube를 이용해 표면을 강제로 만들고 그 표면과 ray가 부딪히는 위치를 sampling해서 사용하는 방법을 사용하게 되었다. 래퍼런스 프레임에서 표면 point는 p, 기타 프레임에서 표면 point는 x라고 정의했다.
 

 
추가적으로 marching cube로 찾은 surface라고 해도 아직 학습 중인 f를 이용했고, zero level set surface를 완벽하게 찾는 것은 아니어서 최적화 루프 몇 번을 돌아서 3D point를 조금 더 신중히 뽑도록 했다. 
 
여기까지 그럴 듯 했는데 치명적인 문제가 하나 더 있다. 이 과정이 differentiable하지 않아서 back propagation이 안된다는 것이다.
 

저자들은 위와 같이 이상적으로 f(p)=0 이어야 한다는 점과 deformation 전후로 계속 ray 위에 p가 존재해야 한다는 점을 이용해 강제로 chain을 연결해서 jacobian을 직접 계산할 수 있도록 식을 세웠고 이를 이용해서 differentiable하게 만든다. 
(위에 최적화 루프도 돌아야 하고 이렇게 강제로 gradient를 연결한 것이기 때문에 학습이 엄청 비효율적이고 느릴 것이라는 예상을 할 수 있다.)
 

Implicit Rendering Network

이건 그냥 NeuS나 IDR같은 논문과 같다. 결국 이 논문도 3D supervision을 제공하지 않기 때문에 2D image 레벨에서 색상을 갖고 supervision을 제공해야 한다. NeRF 류 논문들이 원래 그렇지 않은가.
 

위 방식으로 3D point, p를 선별했다면 이 p의 normal, position, feature 다 MLP에 때려넣고 대응되는 pixel color와 맞도록 학습을 시키면 된다. gradient를 강제로 흐르게 하는 과정에서 deformation field도 엮이기 때문에 앞의 Non-rigid deformation MLP도 같이 학습된다. 
 

Loss

각 프레임의 사람 마스크도 같이 있을 경우, 중간에 point 찾느라 만든 mesh를 이용해서 mask loss를 먹인다. 실루엣이 GT 마스크와 맞아떨어지도록 IoU loss가 추가된다. 
 

Non-rigid deformation의 크기가 Skinning transformation과 과도하게 다르면 안된다. 자세로 인한 변화가 제일 큰데 기타 잡다한 변화가 이를 넘어서거나 이보다 과하면 안 좋다.
 

사전 준비에서 찾은 pose parameter는 학습 과정에서 계속 업데이트 되는데 그걸 이용해서 지금 학습 과정에서 자세가 크게 바뀌지 않도록 억제한다. pose parameter가 PCA로 생성된 파라미터라는 점을 이용해서 linear algebra를 이용해 식을 세웠다. (이해가 되지 않는다면 eigenvalue와 eigenvector에 대해서 다시 공부하길)
 

직접 2D supervision을 제공하는 부분은 똑같다. pixel color가 결과 color와 같아야 한다는 L1 단순한 loss이며 PiFuHD로 normal을 구해뒀기 때문에 normal도 loss로 추가해준다. 
 

SDF+NeRF 논문에서 효과적이었다는 regularization term을 죄다 추가해준다.
 

마지막으로 중간에 나온 Mesh vertex 위치의 SDF 값이 0이 되도록 유도함으로써 중간에 사용하는 Mesh가 주 학습 목적인 SDF function을 더욱 잘 표현하도록 한다.
 

Results and discussion

공개된 결과물의 퀄리티는 상당하다. 제일 궁금한 것은 학습 시간인데 아마 엄청 오래 걸리지 않나 싶다. 그리고 시간 당 자세 변화가 크면 실패할 가능성이 높아보인다. 
 

반응형