개발 · 컴퓨터공학 / / 2024. 7. 17. 23:23

NeRF(Neural Radiance Fields)논문에 대해서 알아보자

728x90
반응형

https://www.matthewtancik.com/nerf

 

NeRF라는 논문은 최근 vision관련 많은 논문들에서 인용되고 있고.

이것이 그래픽스 분야에서도 많이 사용된다.

 

비전 분야에 대해서는 문외한이지만 때문에 논문에 대해서 나름대로 공부를 해보자.

알아야할 개념들과 키워드 

NeRF 논문에 대해서 조금만 본다면 논문의 방법 자체는

다양한 각도에서 촬영된 이미지와 카메라 파라미터를 바탕으로 input하여,

output으로 새로운 뷰를 출력할 수 있는 방법이다.

 

NeRF라는 모델은 입출력에 대해 다층 퍼셉트론 MLP의 형식으로 모델이 구성되어있다.

 

학습하는 과정에서는 volume rendering이라는 말이 나오는데,

이것이 컴퓨터 그래픽스 분야에서 사용되는 volume graphic과 어떤 연관성이 있는건지.

 

그렇다면 NeRF에서의 volume이란 무엇을 말하는지 알아야한다.

해당 과정에서는 카메라 ray를 발사하고 샘플링하는 과정을 보니 graphics volume rendering과정과 유사한 연산이 많이 들어가는 것 같다.

 

또한 학습 방법에서 지도학습 supervised learning 방식을 사용하기 때문에 강화학습 reinforcement learning과는 달리 ground truth가 필요하다. 

지도학습이 어떻게 학습되는지에 대한 개념도 간단히 필요할 것 같다.

 

NeRF라는 이름 자체로부터 radiance filed라는 개념이 중요하다는 것을 알 수 있는데.

이에 대해서도 정리할 필요가 있을 것 같다.

 

논문에서는 이후 최적화 방안에 대해서도 다루고 있다.

positional encoding이라는 개념과

hierarchical sampling이라는 개념에 대해서도 이해가 필요하다.

 

논문에서 사전 연구를 좀 보면

Neural 3D shape. 즉 딥러닝에서 3D 형태로 표현하는 방법에 대한 연구와

View synthesis and image-based rendering. 이미지를 기반으로 합성한 새로운 장면을 만드는 방법에 대해서 선행 연구를 적어놓았다.

 

즉 기존에 사용되었던 딥러닝 3D 형태 표현법과 이미지 기반 장면 형성 방법은 합쳤다고 봐도 무방할 것 같다.

 

최적화 방안 중 positional encoding은 MLP 입력 정보 즉 위치, 방향 정보에 고주파 정보를 보존하기 위한 방법이라고 한다. 

또 다른 방안인 hierarchical sampling기술은 ray가 point를 샘플링하는 과정에서의 성능 향상 기법이다.

일정한 간격으로 샘플링을 하지만, 한 간격 구간 안에서는 랜덤하게 포인트를 생성한다고 한다. 

NeRF

NeRF는 이미지 기반으로 3D 형태의 이미지를 표현하는 것이지. 

point cloud 및 mesh 기반의 3d object를 생성하는 것은 절대 아니다. 

따라서 컴퓨터 그래픽스에서 rendering과는 관련이 있지만, topology와는 거리가 있는 기술이다.

 

NeRF는 MLP의 input으로 카메라의 뷰 방향 등을 넣고, 뽑아내는 것은 pixel color값이다. 

이러한 형태의 장점은 가볍고 연속적인 이미지를 뽑을 수 있다는 것이다. 

Volume Rendering

$$C(\mathbf{r}) = \int_{t_n}^{t_f} T(t) \sigma(\mathbf{r}(t)) \mathbf{c}(\mathbf{r}(t), \mathbf{d}) \, dt, \quad \text{where} \quad T(t) = \exp \left( -\int_{t_n}^{t} \sigma(\mathbf{r}(s)) \, ds \right)$$

 

위 볼륨 렌더링 수식이 NeRF를 공부하는 사람들의 난관이다. 

일단 매개변수 t는 해당 점에서 얼마나 멀리까지 가는지에 대한 궁금증을 갖게 한다.

 

일단 t는 3D 공간에서 ray가 지나가는 위치를 담고있는 매개변수이다.

공간에서의 세부적인 위치는 r(t)로 표현한다.

 

\(T(t)\)는 t라는 값에서 ray가 나아갈 때, 얼마나 block되는지를 의미한다.

 

\(σ(r(t))\)는 point \(r(t)\)에서의 density 밀도이다. 

 

함수 c는 color를 말하는데,

point \( r(t) \)을 d라는 각도로 보았을 때의 color pixel값이다. 

보는 방향마다 빛에 따라서 image의 color는 달라질 수 있기에. 

Loss 함수

$$\mathcal{L} = \sum_{\mathbf{r} \in \mathbb{R}} \left[ \left\| \hat{C}_c(\mathbf{r}) - C(\mathbf{r}) \right\|_2^2 + \left\| \hat{C}_f(\mathbf{r}) - C(\mathbf{r}) \right\|_2^2 \right]$$

 

\( \hat{C} \) 는 추정한 color이고, \( C \)는 실제로 ray를 통해 나온 색상인데. 

이 둘이 일치하는 정도를 loss로 정하는 수식이다.

 

Positional Encoding

네트워크가 낮은 차원이면 일반적으로 기능이 잘 돌아가지 않는다고 한다. 

그래서 하나의 trick으로 MLP에 input하는 값에 sin / cos 을 적용하는 방법을 이용한다. 

 

여기에 값에는 거듭제곱을 하면서 얻어내는 차원을 증가시킨다. 

Hierarchical Sampling

ray를 쏘았을 때 일정한 간격에 따라서 샘플링을 하게 된다.

이 샘플링 간격 중 밀도가 높은 구역에 해당하는 샘플링 구역이 있을 것이다.

 

이에 해당하는 구역을 또 나누어서 한 번 더 샘플링한다. 

 

soon...

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유