CS/Computer Vision

NeRF(ECCV, 2020) 핵심 정리

공영재 2024. 10. 29. 20:45

Preview

https://arxiv.org/pdf/2003.08934

3D를 representation하는 방법은 크게 implicit representation과 explicit representation으로 구분한다.

 

explicit의 경우 pointcloud, voxel, mesh 등을 통해 3D를 직접 표현하므로 메모리를 많이 사용한다.

implicit의 경우 데이터를 간접적으로 표현하는데, NeRF는 이 방법에 해당한다.

픽셀 좌표를 넣어주면 Neural Network를 통해 추론하여 해당 좌표에 대한 RGB+density 값을 출력하는 방식이다.

이러한 방식을 통해 서로 다른 여러 시점의 사진을 입력으로 받아 새로운 시점을 합성할 수 있다. NN을 사용하기에 연속적인 공간을 표현하는데 자유롭고 디테일을 표현할 수 있으며, 저장 공간에 대한 부담이 적어진다.

 

Method

입력으로 시점의 위치 x, y, z 좌표와 2차원의 direction (수직, 수평)을 받고, 신경망을 거쳐 해당 픽셀의 색을 출력하게 된다. 이는 Volume Rendering이라는 방식을 통해 가능해진다. 먼저 생성할 novel view의 중심으로부터 객체를 향해 ray를 쏜 뒤, ray 상의 여러 point를 샘플링(a)하고 MLP를 통해 좌표의 RGB와 density를 예측한다(b). 그리고 ray위의 샘플링된 모든 포인트의 RGB, density를 바라보는 시점 쪽으로 projection한 뒤, ray가 첫번째로 만나는 객체에 더 가중치를 두는 등의 연산을 추가해(c) 픽셀의 최종 컬러값을 도출한다. 이후 각 ray마다 도출한 픽셀값을 g.t.와 비교해 rendering loss를 계산 한 뒤 network를 optimization한다(d).

학습은 multi-view에서 진행되기에, 네트워크는 여러 시점에서 일관되는 multi view consistent한 scene representation이 가능해진다.

참고로 입력의 경우 3차원 좌표와 2차원 방향을 필요로 하는데, 이는 보통 COLMAP (카메라 파라미터와 point cloud를 생성해주는 SfM을 범용적으로 사용할 수 있게 만든 라이브러리)로 구해서 사용한다.

 

Architecture

 

NeRF 아키텍처

 

아래에서 설명할 positional encoding된 60차원(L=10 *(x,y,z)*2(=sin,cos))의 데이터를 입력으로 받으며, 5번째 layer에서 skip connection을 통해 gradient vanishing을 완화하고, 9번째 layer에서 density를 출력한 후 방향 정보를 입력으로 받아 RGB 값을 출력한다. density의 경우 물체가 그 위치에 존재하는지에 대한 값이므로 방향과 상관없으니 저기서 출력하고, RGB의 경우 방향에 따라 달라질 수 있으므로 마지막 layer에서 방향을 추가한 뒤 RGB를 예측하게 된다.

 

Keypoints

NeRF는 이외에도 세가지 추가적인 방법을 활용해서 NeRF의 성능을 최적화한다.

 

- Positional encoding

 

NeRF의 input인 3차원인 위치 정보+2차원인 방향 정보가 너무 저차원이기에, 실제로 네트워크에 입력할 땐 positional Encoding으로 고차원으로 임베딩시켜 MLP의 입력 데이터를 고차원화 시켜준다. 저차원 입력을 사용하면 결과가 low-frequency에 치중되기 때문이다. 직관적으로 표현하자면, 저차원에서는 인지하기 힘든 세밀한 차이를 정밀하게 표현하기 위해 사용되었다고 보면 된다.

 

방향 및 Positional Encoding 유무에 따른 차이

 

- Hierarchical Volume Sampling

 

ray 위의  샘플 포인트들이 어떻게 선정되는지가 최종 성능에 영향을 미치기 때문에 NeRF는 균등한 간격으로 Sampling하는 Deterministic sampling이 아닌, Stratified Sampling 방법을 사용한다. 이는 ray 위 다양한 포인트를 샘플링하기 위해, 나눠진 구간 내 학습마다 포인트를 랜덤하게 새로 샘플링하는 방법이다.

또한, 먼저 기본적인 coarse 샘플링을 진행한 이후 밀도가 높은(물체가 존재하는) 구간에 대해 fine 샘플링을 더 많이 수행해 추가 학습을 진행한다.

 

Q.

- 입력 차원이 너무 낮아 positional Encoding으로 고차원으로 임베딩시켜서 인풋을 고차원화시켜준다고 하는데,

뉴럴 네트워크 내에서 layer의 shape을 늘려주는 거랑 어떤 차이가 있는지..?

반응형
loading