SYDLAB_inha/NeRF

NeRF - "Representing Scenes as Neural Radiance Fields for View Synthesis"

빈그레 2024. 4. 1. 00:33

https://kyujinpy.tistory.com/16

 

[NeRF 논문 리뷰] - NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

* 이 글은 NeRF에 대한 논문 리뷰이고, 핵심만 담아서 나중에 NeRF Code를 이해할 때 쉽게 접근할 수 있도록 정리한 글입니다. * 코드와 함께 보시면 매우 매우 도움이 될 것이라고 생각이 들고, 코드

kyujinpy.tistory.com

 

 

NeRF는 point cloud나 mesh,voxel등으로 표현된 3D object 자체를 rendering하는 게 아니라, 3D object를 바라봤을 때 보일 2D 이미지를 예측하도록 하는 것이다.

 

해당 물체를 어느 각도에서 봐도 2d 이미지로서 표현할 수 있게함으로써 3D 렌더링의 역할을 수행해내는 것

 

3D 오브젝트를 표현하는 건 cost가 많이 들기 때문에 explicit하게 저장하지 않고,  

좌표를 network에 넣으면 MLP를 통해 continuous representation 즉, pixel 별 rgb값을 얻는 implicit한 방식을 사용한다.

-> 그래서 모델이 매우 가볍고 continuous하다

 

일반적인 3D 구조는 discrete하다. 각 grid에 해당하는 지점에 feature가 하나씩 존재한다.

NeRF의 경우는 continuous하게 어느 방면에서든지 feature를 뽑을 수 있다.

따라서 매우 부드러운 3D 장면 연출 가능

color값 뿐만 아니라  volume density까지 함께 뽑기 때문에, 정말 photo realitic..? 하다

 

 

 

 

*** structure from motion : 카메라의 포즈를 계산하기 위한 

 

먼저 input image를 여러장 준비한다. 

위 드럼은 블렌더 툴에서 제작한 툴에서의 드럼을 캡처하였지만,

real image로 구성할 때에 콜맵사용! 카메라 파라미터값이 매우 중요

렌더링이 잘 안됐을 때는 카메라 파라미터 부터 의심하기

 

x,y,z,세타,파이 를 넣어주면 바라보는 위치에 따라 rendering을 해준다.

 

 

 

전체 network는 간단히 mlp로 구성되어있음

위치 좌표값인 x,y,z를 첫번째 layer와 다섯번째 layer에 넣어줌

9번째에서는 density값인 시그마를 출력하고 direction값인  세타와 파이를 입력 

**desntiy : 해당 공간에 물체가 있는지 없는지 알아내는 것이므로 시점(direction)과 상관 없이 공간에 의해서 결정

최종 출력은 : 해당 위치와 방향에서 바라본 r,g,b값을 출력 

//시점에 따라 보이는 색상이 다르니까 9번째 layer에서 넣어준 방향값을 바탕으로 rgb값 출

 

위치와 방향값을 넣어서 density와 색상 값을 출

 

모든 이미지 set에 대해서 pixel마다 ray를 쏴서 최종 픽셀값을 결정 

 

 

 

 

카메라의 중심으로부터 각 pixel을 지니가는 ray를 쏜다

ray위에 많은 sample point를 생성하고 특히 , object 근처에서 더 많은 샘플 포인트를 생성한다.

 

위치값 x,y,z와 방향값 세타 파이로 구성된 샘플 포인트가 input이 된다.

MLP( multi layer perceptro )을 통해서 각 sample point의 color rgb값과 desntiy sigma값이 예측된다.

 

위 사진처럼 값들이 모두 모여서 color값을 생성한

 

 

 

총 9개의 fully connected layer ( MLP) 가 각 layer를 통과할 때마다 ReLU를 통과

 

각 layer는 256차원의 dimension을 가지고 있음4

 

 

 

 

 

------------- Multi-Resolution Hash Encoding--------------------

기존의 Positional encoding대신에 mutli resolution hash encoding을 적용하여

보다 빠르게 NeRF를 학습하고 해상도를 높일 수 있음

 

9개 layer -> 3개의 layer

256차원 -> 64차원

 

학습속도를 빠르게 향상시켰음