본문 바로가기
논문 리뷰

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

by unhyepnhj 2026. 1. 19.

https://arxiv.org/abs/2003.08934

 

NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

We present a method that achieves state-of-the-art results for synthesizing novel views of complex scenes by optimizing an underlying continuous volumetric scene function using a sparse set of input views. Our algorithm represents a scene using a fully-con

arxiv.org

 

NeRF(Neural Radiance Field)는 간단히 말하자면 입력된 2D 이미지를 기반으로, 해당 객체의 3D view를 생성하는 딥러닝 기반 기술이다. 2020년 ECCV 논문인데, 최근까지도 활발히 응용되는 것으로 알고 있다.

 

앞서 말한 '2D 기반 3D view 생성'을 view synthesis라 하는데, 본래 2D 이미지로부터 그 객체의 3D view를 추측하는 것은 매우 어려운 task였다. 직관적으로 예시를 들자면 사람의 옆모습만을 보고 정면에서 본 모습을 상상하라 하는 것이고... 사실 사람에게도 제법 어려운 일 아닌가 싶다. 어쨌든 NeRF는 view synthesis 문제를 \((x, y, z, \theta, \phi\)의 5D 좌표계로 나타내고, 학습 가능한 함수로 구성하는 접근법을 취한다.

 

 

Related Work

 

NeRF를 본격적으로 설명하기에 앞서, view synthesis의 related work을 살펴보면 좋다. 전통적인 view synthesis 방식은 explicit encode, 즉 grid나 mesh 등으로 "어떤 위치에 무엇이 있는지"를 명시적으로 저장하는 형식이었다. 논문에서 소개하는 몇 가지 방법과 그 문제점은 다음과 같다.

  • Dense sampling → interpolation: 입력 view가 매우 촘촘하게(dense) 주어지면 interpolation(보간)만으로 새로운 뷰를 추정 가능하지만, sparse view일 때는 사용할 수 없는 방식.
  • Mesh-based: 이미지로부터 mesh geometry와 texture를 추정한 뒤, 미분 가능한(→ 경사하강법 가능) rasterizer 또는 pathtracer로 최적화. 그러나 고정된 topology의 template mesh가 필요하므로 현실 장면에는 부적합.
  • Volumetric representations: Voxel grid(3D 큐브) 기반 방식.
    • 전통적인 방식: 3D 공간을 voxel grid로 나누고, 각 grid에 색상과 opacity를 저장해 ray marching으로 렌더링. 복잡한 geometry를 표현 가능하며 복잡한 geometry를 표현할 수 있지만, 근본적으로 discrete하게 샘플링하게 되므로 고해상도의 view를 생성하려면 3D 공간을 더욱 세밀하게 샘플링해야 함(cons).
    • CNN + voxel grid 방식: CNN이 샘플링된, diecrete한 장면을 보정해 전통적인 방식의 단점을 보완하나, 시/공간 복잡도로 scalability는 떨어짐.

이러한 상황에서 NeRF는 기존 volumetric 방식의 explicit encoding, discrete sampling, 고해상도 불가능 문제를

  • discrete voxel grid 제거 → continuous volume으로 표현
  • grid에 저장 → MLP 가중치에 encode

함으로써 해결한다. 이를 바탕으로 NeRF에 대해 보다 자세히 알아보자.

 

 

Nerual Radiance Field Scene Representation

앞서 언급했듯, NeRF는 장면을 5D 함수로 나타내고, 이는 \(x=(x, y, z)\)인 3D 위치 x와 \(\textbf{d}=(\theta, \phi)\)인 방향 \(d\)의 5차원 벡터 \((\textbf{x}, \textbf{d})\)를 입력받아, 색상 \(\textbf{c}=(r, g, b)\)와 volume density \(\sigma\)를 출력한다. 이때 5D representation을 예측하기 위해 MLP를 사용하는데, \(\sigma\) 학습에는 \(\textbf{x}\)만을 사용하고, \(\textbf{c}\)의 학습에는 \((\textbf{x}\)와 \(\textbf{d})\) 둘 모두를 사용한다고 한다. 이를 위해 MLP는 (1) \((\textbf{x}\)를 8개의 FC에 통과시켜 256차원의 feature vector인 \(\sigma\)를 출력하고, (2) 이후 \(\sigma\) 는 \(\textbf{d}\)와 concat되어 1개의 추가 FC를 통과한다. (2)의 결과 view-dependent한 RGB 색상이 출력된다. 이 과정은 미분 가능하므로 gradient descent로 오차를 줄일 수 있다.

 

 

Volume Rendering with Radiance Fields

 

앞서 우리는 radiance field \(F_\theta(\textbf{x}, \textbf{d}) → (c, \sigma)\)를 정의했다.여기서 문제는 이러한 radiance field가 있을 때 한 camera ray의 픽셀 색상 \(C(\textbf{r})\)을 어떻게 계산하는지인데, NeRF에서는 고전적인 volume rendering으로 이를 해결한다. 이때 camera ray란 3D 공간을 연속적으로 관통하며, camera ray \(\textbf{r}(t) \)는 origin \(\textbf{o}\)와 방향 \(\textbf{d}\)에 대해 \(\textbf{r}(t)=\textbf{o}+t\textbf{d}\)로 나타난다.

 

픽셀 색 \(C(\textbf{r})\)은 아래와 같은 적분으로 정의된다.

 

\(C(\textbf{r})=\int_{t_n}^{t_f}T(t)\sigma(\textbf{r}(t))\textbf{c}(\textbf{r}(t), \textbf{d})dt\)

 

여기서 각 항을 설명하자면,

  • \(\sigma(\textbf{r}(t))\): 해당 위치의 volume density, ray가 이 지점에서 멈출 확률의 밀도로서 geometry를 암묵적으로 표현
  • \(\textbf{c}(\textbf{r}(t), \textbf{d})\): radiance, 그 위치에서 & 그 방향으로 카메라에 도달하는 RGB 색
  • \(T(t)\): transmittance(누적 투과율), ray가 지점 \(t\)까지 장애물을 만나지 않고 도달할 확률로서 occlusion 효과를 담당
    • \(T(t)=exp(-\int_{t_n}^{t}\sigma(\textbf{r}(s))ds\)

이다. 정리하면 \(C(r)\)은 ray를 따라 모들 3D 위치에 대해 (해당 지점에 도달할 확률) x (해당 지점에서 멈출 확률) x (해당 지점의 색상)을 모두 더한 값이고, 즉 픽셀 색은 어느 한 surface의 색이 아니라 전체 지점들이 확률적으로 누적된 결과로서 나타난다.

 

앞서 설명했듯 \(\sigma\)와 \(\textbf{c}\) 예측에 MLP를 사용하는데, 적분은 연속, 즉 무한히 많은 점을 필요로 하는 데 비해 MLP를 무한히 호출할 수 없으므로 전체 구간을 bin으로 나누고 bin에서 값을 하나 선택한 다음 계산하는 구적법(quadrature)을 사용한다. 하지만 기존의 렌더링 방식인 deterministic quadrature를 따라 항상 정해진 위치(e.g., bin 중앙)에서 샘플링한다면 MLP는 매 iter마다 똑같은 값만 바라볼 것이고, 결과는 부정확해질 것이다. 따라서 NeRF에서는 구간 \([t_n, t_f]\)를 \(N\)개의 bin으로 나누고 각 bin에서 랜덤하게 샘플링하는 stratified sampling 방식을 채택함으로써 매 iter마다 다른 좌표 값을 사용, continuous representation을 가능케 한다.

 

 

Optimizing a Neural Radiance Field

 

위 과정에 더불어, NeRF는 두 가지 추가 장치를 도입한다. 앞선 과정은 장면을 모델링하기 위한 core component지만, MLP가 고주파 함수를 잘 학습하지 못하고 ray sampling이 비효율적이라는 문제가 존재하며 이 문제를 각각 (1) positional encoding, (2) hierarchical volume sampling으로 해결한다.

 

1) Positional Encoding

 

Transformer 등에서 사용하는 positional encoding과는 차이가 있는 개념이다. Transformer의 pos_enc는 토큰의 순서 정보를 주입하기 위해 사용하는 것이지만, NeRF의 positional encoding은 순서의 개념이 아닌 주파수 확장을 위한 것이다. 

 

선행 연구에서 MLP는 본질적으로 저주파 함수부터 학습하고, 경계 등을 나타내는 고주파 성분을 표현하는 데 불리함이 확인된 바 있다. 따라서 NeRF는 \(F_\theta(\textbf{x}, \textbf{d}) → (c, \sigma)\)을 학습해야 하지만, xyz와 direction을 MLP에 그대로 입력하면 oversmooth한 결과가 출력된다. 해당 선행 연구에서 입력을 네트워크에 전달하기 전에 고주파 함수를 사용해 고차원 공간으로 한 번 mapping하면 MLP가 고주파 성분을 잘 학습한다는 것을 확인한 바 있으며, NeRF는 이 접근을 도입해 입력 좌표를 여러 주파수 성분의 basis로 분해한다.

 

즉, 1차원 입력 \(p\)를 함수 \(\gamma\)를 사용해 2\(L\)차원으로 변환하며, 이때 \(\gamma(p)=(sin(2^0\pi p), cos(2^0\pi p), sin(2^1\pi p), cos(2^1\pi p),..., sin(2^{L-1}\pi p), cos(2^{L-1}\pi p)\))이다. MLP가 \(f(p)\)를 직접 근사하지 않고 \(f(\gamma(p))\)를 근사하게 함으로써 고주파 fourier basis를 깔아주고 MLP는 계수만 학습하게 한 것이다. 이로써 MLP는 변화에 민감한 경계나 질감 등의 고주파 성분을 보다 잘 근사할 수 있다.

 

2) Hierarchical Volume Sampling

 

Volume Rendering with Radiance Fields 섹션에서 stratified sampling으로 좌표를 랜덤하게 선택한다고 설명했지만, 실제 장면에서 대부분의 공간은 비어 있으며(empty space) 실제로 중요한 것은 물체의 surface 근처와 density가 큰 영역이다. 즉, MLP 호출 대부분이 쓸모없는 공간에 낭비되는 문제가 발생한다.

 

이 문제를 해결하기 위해 NeRF는 두 개의 네트워크를 동시에 학습하는데, 이때

  • Coarse network는 적은 샘플(\(N_c\)개)을 사용해 대략적인 density 분포를 파악하며,
  • Fine network는 coarse network의 출력을 입력으로 받아 중요한 구간에서 집중 샘플링

한다. Coarse network로 계산한 ray 색상은 \(\hat{C}_c(\textbf{r})=\sum_{i=1}^{N_c}w_ic_i\), 이때  이 ray가 최종 색상에 '기여'할 확률인 가중치 \(w_i\)는 \(w_i=T_i(1-exp(-\sigma_i\delta_i)\)이다. \(w_i\)를 정규화하면 \(\hat{w}_i\frac{w_i}{ \sum_{i=1}^{N_c}w_i }\)이고, 이 값은 ray 상의 piecewise-constant PDF, 즉 density가 높은 구간 또는 surface 근처의 구간이 되어 샘플링될 확률이 커진다.

 

이 PDF로부터 새로운\(N_f\)개의 샘플을 inverse transform sampling으로 추출한 뒤, coarse 샘플과 find 샘플을 합쳐 fine 네트워크에 입력하고 다시 volume rendering을 수행한다. 이 과정을 통해 중요한 구간에 샘플링이 집중되어 MLP를 효율적으로 호출할 수 있다. 논문 설정에서는 \(N_c=64\), \(N_f=128\)이다.

 

 

Implementation Details & Results

 

장면별로 하나의 NeRF를 학습하며, 학습에는 RGB 이미지, extrinsic parameter*, intrinsic parameter**, scene bound(\([t_n, t_f\-]\)의 네 가지 정보만 필요하다. 즉, mesh, voxel 등 없이 RGB 이미지와 포즈만으로 학습이 가능한 것이다.

* extrinsic(외부 파라미터): 카메라의 위치와 방향, world 좌표계 → 카메라 좌표계 변환.

** intrinsic(내부 파라미터): 카메라 자체의 광학적 특성(focal length, principal point, etc.), 카메라 좌표계 → world 좌표계 변환. 

 

이때 중요한 것은 pixel이 아니라 ray 단위로 샘플링하며, 매 iter마다

  • 전체 이미지 픽셀 중에서
  • 무작위로 ray를 샘플링

한다. 논문에서는 iter당 4096개의 ray를 샘플링한다.

 

여기서 중요한 점은 loss \(L=\sum_{r \in R}(||\hat{C}_c(r)-C(r)||_{2}^{2}+ ||\hat{C}_f(r)-C(r)||_{2}^{2}\)로, fine뿐 아니라 coarse에도 loss를 준다는 것이다. Coarse 네트워크의 출력이 fine 네트워크에 입력되므로, coarse의 PDF가 좋아야 fine sampling이 유의미하기 때문이다. 

 

결과는 아래와 같다. NeRF에서 경계나 질감 등이 잘 보존된 것을 확인할 수 있다.