Instant Neural Graphics Primitives

‍서산·2022년 4월 2일
4

논문 리뷰

목록 보기
1/2
post-thumbnail

ABSTRACT

Gigapixel image, SDF, NRC, NeRF를 모두 처리할 수 있는 모델을 소개한다.
multiresolution hash encoding 기법을 사용해 네가지 task를 모두 처리할 수 있고, 네트워크의 크기도 작아졌다.
또한 fully-fused CUDA로 작업을 병렬로 처리해 속도를 향상시켰다.

INTRODUCTION

NeRF에서 알 수 있듯이 high frequency의 핵심은 encoding이다.
Input의 차원을 늘려 더 자세한 정보를 추출할 수 있었다.
하지만 기존의 encoding 방법들은 하나의 task만 다룰 수 있었고 GPU를 제대로 활용하지 못하는 한계가 있다. 저자들은 이 문제를 multiresolution hash encoding을 사용해 해결하고자 한다.

간단히 encoding의 역사를 읊어보겠다.
NeRF에서는 sin과 cos으로 이루어진 encoding을 사용했었다. 이를 frequency encoding이라고 부른다.
현재 sota encoding 기법은 Parametric encodings이다.
중요한 내용이니 skip하지 않길 권장한다.

Parametric encodings

 
data structure와 neural network를 혼합해서 사용하는 방식이다.
기존 MLP는 모든 weight, bias 값들을 update한다.
하지만 data를 structure(grid, tree...)에 넣으면 어떨까?
예를 들어 3D grid를 사용하면 하나의 점에 대해 8개의 point만 update하면 된다.
점 하나에 대해 모든 weight를 업데이트할 필요가 없다는 뜻이다.

(위 사진은 Plenoxels에서 참고했다. 이 논문 역시 나중에 리뷰하겠다.)

하지만 이 역시 grid를 dense하게 쪼갤 경우 기존 MLP 방식보다 연산이 많아지는 문제가 발생한다.
물체가 없는 empty space에서도 계산을 하기 때문이다.

MULTIRESOLUTION HASH ENCODING

그래서 저자들은 새로운 encoding방식을 제안한다.
이미지를 grid로 쪼갠 다음 각각의 점들을 hashing하는 방식이다.
하나씩 살펴보겠다.

(5)를 보면 MLP가 보인다.
y를 Input으로 받고 이때 Φ는 weight parameter이다.

(4)를 보면 (5)에서 받은 y에 대한 정보가 나온다.
y = enc(x; θ)으로 이때 x는 점의 좌표값이고 θ는 encoding parameter이다.

추가로 y의 vector를 보면 초록색 부분에 ξ가 추가되는 것을 확인할 수 있다.
ξ가 NeRF에서의 viewing direction 정보이다.
즉 instant-ngp는 좌표값을 인코딩한 후 viewing direction과 함께 vector에 담아 MLP를 통과시키는 과정이다.

그럼 대체 hash encoding이 뭘까?

hash encoding

 

간격이 다른 grid를 16개 준비한다.(L=16) (multiresolution)
예를 들어 N=16이라는 것은 사진을 16x16으로 분할했다는 뜻이고 N=512라는 것은 512x512로 분할했다는 뜻이다.
즉, N의 최댓값을 크게 잡을수록 더 잘게 쪼개서 분석한다는 의미다.
(N의 최솟값은 16, 최댓값은 [512, 524288]이다.)

이렇게 총 16개의 grid를 만들면 넓게 쪼개진 grid와 잘게 쪼개진 grid들이 생긴다.
각각의 grid에서 점들이 생기고, 이 점들을 hash table에 mapping한다.
hash table이 data structure와 neural network를 혼합해서 사용하는 방식임과 동시에
dense grid에서 발생하는 문제를 해결할 수 있는 방식인 것이다

(여기서 hash table은 TxF크기를 가진다.
논문에서 T값과 F값은 고정되어 있다.)



예를 들어보겠다.
N=16인(가장 간격이 넓은 grid)경우, 289개의 점이 생긴다.
이때는 점의 개수가 T보다 작기 때문에 TxF크기의 feature vector에 점을 하나씩 대응시킬 수 있다.
반면 N이 점점 커지면(간격이 좁은 grid) 점의 개수가 T보다 커지게 되고, 점을 feature vector에 하나씩 대응시킬 수 없다.

그래서 hash function을 적용시켜준다.
쉽게 말해 점들에 index를 매겨주는 것이다.
하지만 점의 개수가 vector의 개수보다 더 많기 때문에, 하나의 벡터에 여러 점들이 mapping될 수 밖에 없다.
우리는 이를 colliding이라 부른다.

하지만 colliding역시 문제가 되지 않는다.
grid가 Coarser한 경우(N이 작은 경우), 점과 벡터가 일대일 대응이므로 점 하나가 vector에 미치는 영향력이 크다.
반면 grid가 Finer한 경우(N이 큰 경우), 점과 벡터가 n:1 대응이므로 점 하나가 vector에 미치는 영향이 작다.
자연스레 Coarse한 grid에 따른 가중치가 부여되는 것이다.

또한 어느정도 train이 되면 density정보를 얻게 된다.
이후로는 parameter update하는 과정에서 겹치는 점들중 density가 높은 점들의 가중치가 높아진다.
즉, 겹치는 점들 중 density가 높은 점의 정보가 vector에 더 많이 담긴다는 뜻이다.

EXPERIMENTS


논문에 나온 결과이다. (더 많은 결과는 PROJECT PAGE를 참고)
개인적으로 large natural 360 scene을 reconstruction한 결과가 인상적이었다.


이 사진들은 코닥 필름 카메라를 직접 구현해본 결과다.
CUDA 11이상 지원되는 GPU가 필요해서 Colab에서 진행했다.

왼쪽은 mesh형태를 export했고 오른쪽은 novel view 사진이다.
(코드 궁금하시면 깃허브 참고!)

0개의 댓글