Paper/3D vision

GO-Surf: Neural Feature Grid Optimization for Fast, High-Fidelity RGB-D Surface Reconstruction

침닦는수건 2023. 6. 26. 15:02
반응형

내 맘대로 Introduction

NeRF 컨셉의 3D surface reconstruction 알고리즘의 고질병인 학습, 추론 속도를 빠르게 하기 위해 depth 정보를 끌어오고, MLP 대신 grid representation을 사용한 논문이다. 기존 Depth fusion에 비교한다면 hole이 더 잘 차있고 noise가 적다는 장점이 있고, NeRF 대비는 속도의 이점이 있다고 할 수 있을 것 같다.  naive한 알고리즘 대비 무려 60배 빠르다고 한다.

 

사실 내가 볼 때 속도 개선의 핵심은 grid_sampler의 2nd derivative 기능을 CUDA로 직접 구현한 점인 것 같다. 앞에는 뭐... 그냥 조합한 느낌인데 이 기능적 구현이 contribution이 너무 크다.

 

메모하며 읽기



scene representation을 MLP만 쓴 것이 아니라 4레벨을 갖는 grid 와 MLP를 같이 썼다. MLP는 4레벨의 정보를 모아 1번 도는 형태로 shared MLP이다. 

어떤 position, p가 주어지면 각 레벨 feature를 trilinear interpolation해서 concat한 뒤, MLP를 통과시킨다. 

color의 경우, 조금 다르게 finest 레벨 feature만 사용한다. 
volume rendering 수식은 NeuS 수식을 그대로 가져왔다. loss term도 동일한 것을 사용했으며 차이점이라고 하면, NeuS는 color를 이용한 supervision만 가능했지만 입력에 depth가 포함되어 있기 때문에 같은 형태로 depth 를 이용한 supervision이 가능하다는 점이다. 그래서 color + depth rendering loss가 사용된다.

depth가 주어지기 때문에 (noisy하긴 하겠지만) 대충 SDF에도 직접 supervision이 가능하다. depth를 SDF로 변환해서 l1 loss를 걸어주는데 surfcae 초 근접 영역에서만 걸어준다. (room scale이라서 16cm 정도도 근접이라고 본 듯)

depth의 noisy한 점을 완화하고 학습 불안정성을 낮추기 위해서 relaxed loss를 추가함


depth를 추가하는 것은 쉽지만 안정적으로 사용하는 것은 어려워 2가지 loss를 추가했다. 하나는 유명한 eikonal loss고 나머지는 smoothness term이다. 


특정 위치 주변 (epsilon 만큼) 내에서는 SDF gradient(normal)이 같도록 억제하는 기능이다.


이 논문에서 핵심적인 것 같은데, pytorch는 지금 grid_sampler 함수에서 2차 미분에 대한 gradient backward 연산을 지원하지 않는다. 즉, SDF gradient를 사용해서 loss를 이론적으로 만든다 한들 기능적으로 지원이 안된다.

그래서 이 저자들은 직접 CUDA kernal로 구현했다고 한다;; 대박인 듯. 이 부분만 뜯어서 다른데서 써도 좋을 것 같다.

loss 이야긴데 사실 앞이랑 중복이다. 

rgb loss는 모든 ray 대상
depth loss는 depth가 valid한 ray 대상
sdf loss는 모든 ray 대상(이지만 조건부 필터링됨)
free space loss도 마찬가지

eikonal loss는 free spcae loss와 같은 영역에 대해서
smoothness loss는 표면 근처에서만 적용했다.

초기화는 sphere로 했다.

반응형