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

2026. 1. 7. 17:24논문리뷰

ECCV2020 에서 best paper로 소개된 Nerf Representing Scenes asNeural Radiance Fields for View Synthesis 에대해 리뷰를 해보려고합니다!!
 
사진으로 나온 피피티는 전부 제가 작성한 피피티 이미지 입니다.

"Novel View Synthesis"는 여러 장의 sparse한 이미지를 입력으로 받아, 기존 데이터에는 없는 새로운 시점에서의 이미지를 생성하는 기술입니다.
NeRF(Neural Radiance Fields)는 다양한 각도에서 촬영한 이미지들과 카메라 파라미터(즉, 카메라 ray의 위치와 각도)를 활용해, 트레이닝 데이터셋에 없는 새로운 시점에서의 이미지를 생성하는 Novel View Synthesis 기술입니다. 이전의 Novel View Synthesis 기술들은 high-resolution 표현이나 high-frequency 장면 표현에 대한 학습이 제대로 이루어지지 않는 문제가 있었습니다. 이는 보통의 신경망이 low-frequency에 편향되어 학습되는 경향이 있기 때문입니다. 이로 인해 이미지에서 high-frequency 부분은 학습이 잘되지 않았습니다.
 
NeRF는 이러한 문제를 해결하기 위해 positional encoding 기법을 사용합니다. 이를 통해 다양한 frequency를 포함하는 고차원 입력을 만들어, high-frequency 영역을 잘 표현할 수 있도록 학습을 진행합니다.
렌더링(Rendering) 과정은 3D 객체를 2D 이미지로 변환하는 기술로, 각 픽셀의 색상을 계산해 2D에 투영하는 과정을 의미합니다. 기존 렌더링 방식에서는 uniform sampling 방식이 사용되었습니다. 하지만 이렇게 되면 물체가 없는 빈 공간에서 샘플링이 과도하게 이루어져 학습이 비효율적으로 진행되는 문제가 있었습니다.
 
이 문제를 해결하기 위해, NeRF는 하나의 네트워크가 아닌 coarse networkfine network 두 개의 네트워크를 학습하는 방식으로 개선하였습니다. 이 방식은 학습을 좀 더 효율적이고 정확하게 만들 수 있습니다.
 
하단의 이미지는 다양한 각도에서 촬영한 입력 이미지들과 카메라 파라미터를 기반으로 NeRF를 학습시켜 새로운 시점에서의 이미지를 생성하는 과정을 설명한 것입니다.
 

Classic Volume Rendering
Classic Volume Rendering은 3D 객체를 특정 뷰 방향에서 바라볼 때, 3D 물체의 volume 정보를 이용해 각 픽셀마다 컬러를 계산하고, 이를 2D 이미지에 투영하는 기술입니다.
먼저, 3차원 객체를 바라보는 직선 ray는 그림에서 빨간 화살표로 표시되어 있습니다. 이 ray는 벡터식으로 표현할 수 있습니다. Ray는 3차원 공간에서 물체를 바라보는 원점으로부터 특정 방향 d로 t만큼 이동한 점들의 집합으로 이루어진 선입니다. 따라서 t 값에 따라 ray 위에서 다양한 입자의 위치를 나타낼 수 있습니다.
즉, r(t)는 원점으로부터 방향 d를 따라 이동한 ray 상의 한 점을 의미하며, 이 ray상의 각 t 값에 대해 물체의 density와 RGB 값을 구한 뒤, 이를 누적하여 해당 방향에서 바라보는 하나의 픽셀에 대한 C(r) 값을 계산합니다.
이렇게 구한 C(r) 값을 전체 이미지의 모든 픽셀에 대해 계산하여 2D 이미지를 렌더링하게 됩니다.
 

Classic Volume Rendering: 픽셀 색상 계산
아래의 식은 2D 이미지에 투영된 한 픽셀의 색상인 C(r)를 계산하는 방법입니다. 이 계산은 ray 위의 객체가 있을 가능성이 있는 부분에서 시작점인 t_n부터 끝점인 t_f까지, 해당 파티클들의 RGB 값을 모두 더해주는 방식입니다.

  • σ(r(t)): 이는 ray상의 t 지점에 위치한 파티클의 density를 나타냅니다. 밀도가 클수록 해당 파티클의 색이 선명해지고, 이 값은 파티클의 불투명도를 나타낸다고 생각할 수 있습니다. 0과 1 사이의 값으로 표현됩니다.
  • c(r(t)): 이는 ray상의 t 지점에 위치한 파티클의 RGB 값입니다. 밀도와 RGB 값은 모델을 통해 예측된 값을 사용합니다.

대문자 T는 누적 투과율(transmittance)로, t_n부터 t 지점까지 파티클들이 얼마만큼 t를 가로막고 있는지에 대한 가중치를 나타냅니다.

  • 누적 투과율은 ray를 따라 이동하면서 물체들이 얼마나 가로막고 있는지에 대한 척도입니다. t 앞에 불투명한 파티클들이 많으면 density가 1에 가까워지고, 이 값은 점점 커지게 됩니다. 그러나 T는 마이너스 지수로 계산되므로, 누적 투과율 값은 점점 작아집니다.

결국 이 값은 우리가 바라보는 방향으로, t 앞에 얼마만큼 물체가 가로막고 있는지, 그로 인해 물체가 얼마나 보이는지에 대한 척도라고 할 수 있습니다.
따라서, 최종적으로 해당 식은 t_n부터 t_f까지의 파티클들을 대상으로 앞에 얼마나 불투명한 파티클이 많은지에 대한 누적 투과율, density, 그리고 RGB 값을 모두 적분한 값이 됩니다.
이 식을 통해 ray상의 파티클들의 cσ 값을 알 수 있다면, 특정 방향에서 바라본 렌더링된 이미지의 픽셀 색상인 C(r)을 계산할 수 있습니다.
 

Neural Network에서의 Sampling을 통한 근사치 계산
앞서 언급한 것처럼, Neural Network에서 무한한 연속 데이터를 처리하는 데는 메모리 비용계산 복잡도 문제가 발생합니다. 이를 해결하기 위해, 실제 렌더링에서는 Sampling을 사용해 근사치를 구하는 방식으로 진행됩니다. 이 과정은 다음과 같이 이루어집니다.

  1. 특정 viewing direction을 따라 뻗어나가는 ray가 물체를 통과할 때, 시작점인 t_n과 끝점인 t_f를 정의합니다.
  2. t_nt_f 사이에 N개의 particleuniform하게 sampling합니다.
  3. 샘플링된 각 지점 t_i에서 네트워크를 통해 density와 RGB 값을 구합니다.
  4. 이렇게 얻어진 density와 RGB 값을 사용하여 Ĉ(r)을 계산합니다.

오른쪽 수식에서 보실 수 있듯, 이는 논문에 나온 uniform sampling 수식입니다. 예를 들어, t_n = 0, t_f = 1, N = 4일 경우, 즉 0부터 1까지 4개의 값을 샘플링하는 예시입니다. 이 값을 수식에 넣으면, 각 T10과 1/4 사이에 위치하는 파티클을 샘플링하고, 그 후에는 계속해서 중간 값을 샘플링하게 되는 방식입니다.
 

Sampling을 통한 근사치 계산 및 누적 투과율 (Transmittance)
이전에 연속적인 파티클에 대해 적분한 식이 1번 식이고, 실제로는 이를 uniform하게 샘플링해서 3번 식과 같은 방식으로 사용합니다.
빨간 박스로 표시된 t 지점의 파티클의 density는 1 - exp(−σδ)로 변경되어 계산됩니다. 이 부분은 논문에서 별다른 설명이 없지만, 전통적으로 알파 합성(Alpha Composition)을 사용한다고 합니다.
제 생각에는 샘플링을 하면서 각 지점에서의 density인 σ와 각 파티클 사이의 거리인 δ를 고려해 확률적으로 계산하려는 의도로 식을 변형한 것으로 보입니다. 따라서 1 - exp(−σδ)는 오른쪽 그래프와 같이, 해당 i번째 파티클에서 σ나 δ가 작을 때는 값이 0에 가까워져 작아지고, 반대로 σ나 δ가 커지면 값이 빠르게 1에 가까워져 커지게 됩니다.
누적 투과율(Transmittance)도 오른쪽과 같이 변경되어 계산됩니다. 실제로는 적분이 σ 형태로 바뀐 것을 확인할 수 있습니다.
조금 더 쉽게 예시를 들어 누적 투과율에 대해 설명해 보겠습니다:

  1. I번째 샘플링된 파티클i+1번째 샘플링된 파티클이 있을 때, 두 파티클 모두 density가 0.9인 객체들입니다.
  2. I번째 파티클의 RGB 값을 계산하려면, T_it_n부터 t까지 앞의 파티클들이 얼마나 불투명한지에 대한 누적 투과율I번째 파티클의 density모델을 통해 예측된 RGB 값을 곱한 값이 됩니다. 예를 들어, 이때 I번째 파티클의 RGB weight0.51이 됩니다.
  3. i+1번째 샘플링된 파티클을 계산할 때는, i번째 파티클까지의 누적 투과율을 고려하여 T_i를 계산하고, 그 결과는 0.17이 됩니다. 이때 i+1번째 파티클의 RGB weight0.102가 됩니다.

따라서, 앞에 density가 0.9와 같이 높은 파티클이 있으면, 뒤에 있는 파티클의 색상은 약해집니다. 즉, density누적 투과율color의 선명도를 결정하는 가중치(weight)와 같은 역할을 한다고 할 수 있습니다.
 

NeRF 논문의 제안 기법
NeRF 논문에서 제안한 기법을 살펴보면, novel view synthesis 기술들은 복잡한 외관을 가진 물체를 표현한 이미지에서 high frequency 부분NN이 low frequency에 편향되어 학습되는 문제를 겪고 있습니다. 또한, high-resolution representation을 위해 각 camera ray의 양을 늘려보았지만, 비효율적이라는 실험 결과가 있었다고 합니다.
따라서 high frequencyhigh resolution 이미지에 대해서 잘 학습이 이루어지도록 하기 위해, sincos 함수를 사용해 다양한 frequency가 포함된 고차원 입력으로 변경하여 High frequency 영역을 학습할 수 있도록 positional encoding을 적용하였습니다.
기존에 소개한 classic volume rendering에서의 uniform sampling 방식은 비효율적입니다. 그 이유는 camera ray가 통과하는 공간에는 물체뿐만 아니라 빈 공간도 포함되어 있기 때문입니다. 물체가 있는 부분, 즉 density가 높은 파티클만 샘플링이 많이 되도록 하려면, Hierarchical Volume Sampling이 필요합니다.
Hierarchical Volume Sampling은 이미지의 전체적인 부분과 물체가 있는 density가 높은 구체적인 부분을 모두 학습할 수 있도록, coarse networkfine network 두 개의 네트워크를 학습하는 방식입니다.

NeRF의 전체적인 학습 과정
NeRF의 학습 과정은 다음과 같이 진행됩니다:

  1. 첫 번째 단계camera ray를 따라 샘플링된 파티클의 5D coordinates (x, y, z, θ, φ)를 모델의 입력으로 넣는 것입니다.
  2. 그 후, 이 입력 데이터를 모델에 통과시키면, 해당 ray 상의 파티클들densityRGB 값을 얻을 수 있습니다.
  3. densityRGB 값을 바탕으로 렌더링을 진행하여, 해당 ray가 통과하는 2D 이미지상의 픽셀에서의 RGB 값을 구하게 됩니다.
  4. 예측된 픽셀의 RGB 값과 실제 GT렌더링된 RGB 값 사이의 MSE loss(Mean Squared Error)를 계산합니다. Backpropagation을 통해, 예측된 픽셀의 RGB 값과 GT사이의 차이를 최소화하도록 학습이 진행됩니다.

Positional Encoding의 적용과 실험 결과
이전에도 설명드린 바와 같이, 입력으로 기존의 5D coordinates인 ray상의 위치를 나타내는 position(x, y, z)과 viewing direction(θ, φ)이 사용됩니다. 그러나 이것이 그대로 사용되는 것이 아니라, viewing direction인 (θ, φ)는 Cartesian vector(x’, y’, z’)로 변환됩니다.
그 후, 각 좌표의 요소들은 sincos 함수를 통해 positional encoding이 이루어집니다.

  • L은 차원 수입니다.
  • position(x, y, z)에서는 L=10으로 설정하여, x, y, z 각각에 대해 sin, cos 함수가 2번씩 10번 적용되므로, 총 60개의 입력이 주어집니다.
  • view directions을 구성하는 (x, y, z)에서는 L=4를 적용하여 총 24개의 입력이 주어집니다.

실험 결과(우상단)를 보면, GT, 두 번째 이미지는 positional encoding을 적용한 결과이고, 마지막 이미지는 positional encoding을 적용하지 않은 결과입니다. 이 실험에서, positional encoding을 적용한 결과디테일 부분확연히 잘 표현된 것을 확인할 수 있습니다.

NeRF의 네트워크 구조 (MLP)
NeRF는 모델로 MLP(Multi-Layer Perceptron)를 사용하며, 총 9개의 Fully-Connected(FC) layer와 활성화 함수로 ReLU를 사용합니다.
먼저, 물체의 위치 정보 (x, y, z)만을 입력으로 하여 8개의 Fully-Connected layer를 통과시킵니다. 이를 통해 해당 particle의 밀도(density)를 예측합니다.
그 이후, 기존에 입력으로 사용했던 위치 정보에 물체를 바라보는 방향 정보(view direction)를 결합하여 9번째 Fully-Connected layer에 입력하고, 이를 통해 RGB 값을 예측합니다.
이와 같은 구조를 사용하는 이유는, 물체의 색상이나 반사 특성이 보는 각도에 따라 달라지는 Non-Lambertian Effect를 모델링하기 위함입니다.

  • 물체의 밀도(density)는 관측 각도와 무관하게 동일하므로, 앞의 8개 FC layer에서는 위치 정보만을 사용해 학습합니다.
  • 반면, 색(RGB)은 물체를 바라보는 방향에 따라 달라질 수 있으므로, 방향 정보마지막 FC layer의 입력으로 추가해 주었습니다.

Hierarchical Volume Sampling (NeRF 제안 기법)
다음은 NeRF에서 제안한 Hierarchical Volume Sampling 방식입니다.
camera ray에 대해 uniform sampling을 수행하는 기존 전략은 비효율적인데, 그 이유는 ray가 통과하는 공간에는

  • free space: 물체가 존재하지 않는 빈 공간
  • occluded regions: 이미 앞의 입자에 의해 완전히 가려져 더 이상 광선이 도달하지 못하는 영역

이 모두 포함되기 때문입니다. 이러한 영역들은 렌더링에 거의 기여하지 않습니다. 따라서 NeRF는 아무것도 없는 지점보다는, 실제로 물체가 존재하는 particle이나 영역에서 더 많이 샘플링이 이루어지도록 하는 전략을 제안합니다.
이를 위해 NeRF는 single network가 아닌, 구조는 동일한 두 개의 네트워크를 학습합니다.

  • Coarse network
  • Fine network

먼저 coarse network는 특정 ray에 대해 64개의 샘플을 uniform하게 sampling하여 장면 전체를 거칠게 학습하는 역할을 합니다.


Coarse Sampling 과정
Coarse 과정을 조금 더 자세히 살펴보면 다음과 같습니다.

  1. 하나의 ray를 n_c개의 구간(bin)으로 나눕니다.
  2. 각 구간에서 particle을 하나씩 uniform하게 sampling합니다.
  3. 샘플링된 particle들을 입력으로 하여, MLP를 통해 각 particle에 대한 density와 RGB 값을 출력합니다.
  4. 출력된 density와 RGB 값을 사용해 volume rendering을 수행합니다.

이 렌더링 과정은 이전에 설명한 방식과 동일하며,
누적 투과율(transmittance)과 density를 해당 particle의 RGB 값에 대한 weight로 사용하여,
ray가 통과하는 2D 이미지 상의 한 픽셀의 RGB 값을 계산하게 됩니다.
여기까지의 과정은 앞에서 설명한 classic volume rendering과 동일한 흐름이라고 볼 수 있습니다.

Fine Network와 Inverse Transform Sampling
이후 과정은 논문에서 자세히 설명되어 있지는 않지만, 추가로 정리해보면 다음과 같은 방식으로 진행됩니다.
먼저, coarse network에서 사용된 전체 N_c개의 particle들이 있으며, 이를 그림에서는 흰색 particle로 표현할 수 있습니다. 이 particle들 각각에 대해 렌더링 과정에서 계산된 RGB 가중치(weight)가 존재합니다.
이 weight 값들을 정규화(normalization)하여 PDF(Probability Density Function, 확률 밀도 함수)를 구성하고, 이를 누적하여 CDF(Cumulative Distribution Function, 누적 분포 함수)를 계산합니다.
이후 Inverse Transform Sampling을 이용해, coarse network에서 density가 높았던, 즉 weight가 컸던 영역을 중심으로 N_f개의 particle을 다시 샘플링합니다.


Fine Network Sampling 과정
Fine network에서는 다음과 같은 입력이 사용됩니다:

  • Coarse network에서 사용한 N_c개의 particle
  • Inverse Transform Sampling으로 추가로 선택된 N_f개의 particle

즉, 총 N_c + N_f (예: 64 + 128 = 192개)의 particle을 새로운 NeRF 네트워크(fine network)에 입력으로 사용하여 렌더링을 진행합니다.
이 과정 덕분에 fine network는 단순히 균일하게 샘플링하는 것이 아니라,
coarse network에서 density가 높았던 영역, 즉 물체가 실제로 존재할 가능성이 높은 particle 주변에서 더 촘촘하게 sampling하도록 학습됩니다.
그 결과, RGB 값에 대한 가중치가 높은 영역, 다시 말해 물체가 있을 만한 위치에서 더 많은 샘플이 사용되며,
192개의 particle을 기반으로 σ(density)와 c(RGB)를 출력하게 됩니다.


Loss 계산 및 학습
Fine network에서도 coarse network와 동일한 방식으로 volume rendering을 수행한 뒤,

  • Ĉ_c(r): coarse network를 통해 예측된 ray의 RGB 값
  • Ĉ_f(r): fine network를 통해 예측된 ray의 RGB 값

을 각각 계산합니다.
이후 두 결과 모두에 대해, 예측된 픽셀 RGB 값과 실제 그라운드 트루스 RGB 값 사이의 MSE loss를 계산하고, 이를 통해 backpropagation을 수행합니다.
결국 학습 과정은 그라운드 트루스와 예측된 픽셀 RGB 값의 차이를 최소화하는 방향으로 진행됩니다.

NeRF 전체 학습 과정 정리
전체 학습 과정을 그림으로 정리해보았습니다.
이 그림은 실제 논문에서 실험에 사용된 배치 사이즈 4096개의 ray에 대해, 한 번의 iteration이 어떻게 진행되는지를 나타낸 것입니다.
먼저, 하나의 iteration마다 4096개의 픽셀에 대한 rayrandom sampling하여 하나의 배치를 구성합니다.
각 ray에 대해 uniform sampling을 수행하여 particle들을 선택하고, 이들의 5D coordinates (x, y, z, θ, φ)를 네트워크의 입력으로 사용합니다.
이때 viewing direction (θ, φ)은 Cartesian vector (x′, y′, z′)로 변환되며, 이후 positional encoding을 통해 입력 차원을 확장한 뒤 네트워크에 입력으로 전달됩니다.
네트워크는 각 particle에 대해 density와 RGB 값을 출력하고, 이를 이용해 volume rendering을 수행합니다.
따라서 그림에서 주황색으로 표시된 부분
한 iteration당 4096개의 ray × ray당 64개의 particle, 즉 4096 × 64번의 네트워크 계산이 수행됩니다.
렌더링 결과는 각 ray마다 하나의 픽셀 RGB 값을 출력하므로, 최종적으로는 배치 사이즈(4096)만큼의 픽셀 연산이 이루어집니다.


이후 coarse network에서 계산된 결과를 바탕으로,
N_c = 64개의 coarse particle과 N_f = 128개의 fine particle을 합쳐
192개의 particle을 입력으로 사용해 fine network에서 동일한 과정을 다시 수행합니다.
그 결과, 그림에서 노란색으로 표시된 부분에서는
한 iteration당 4096개의 ray × ray당 192개의 particle, 즉 4096 × 192번의 네트워크 계산이 이루어집니다.
마찬가지로 렌더링 결과는 배치 사이즈만큼의 픽셀 RGB 값으로 출력됩니다.
마지막으로, coarse network와 fine network에서 각각 예측된 픽셀 RGB 값
그라운드 트루스 RGB 값 사이의 MSE loss를 계산하며, 이 loss는 배치당 한 번 계산되어 backpropagation에 사용됩니다.


이와 같은 과정을 반복하면서,
NeRF는 GT와 예측된 픽셀 RGB 값의 차이를 최소화하는 방향으로 학습이 진행됩니다.

실험 설정 및 평가 지표
NeRF 논문에서는 이미지 합성 분야에서 널리 사용되는 세 가지 평가 지표PSNR, SSIM, LPIPS를 사용하여 실험을 진행하였습니다.


PSNR (Peak Signal-to-Noise Ratio)

PSNR은 원본 이미지와 예측된 이미지 간의 차이를 측정하는 지표로,
두 이미지에서 동일한 위치의 픽셀들 간 MSE(Mean Squared Error)를 기반으로 계산됩니다.
즉, 픽셀 단위의 정량적 비교를 통해 두 이미지가 얼마나 유사한지를 평가하는 방식입니다.

  • PSNR 값이 높을수록 두 이미지가 더 유사함을 의미
  • 일반적으로 30 dB 이상이면 시각적으로도 품질이 우수한 결과로 간주됩니다

SSIM (Structural Similarity Index)

SSIM은 이미지의 구조적 유사성을 평가하는 지표로,
단순한 픽셀 차이가 아닌 사람의 시각 인지 특성을 고려합니다.

  • 밝기(luminance)
  • 대비(contrast)
  • 구조(structure)

이 세 가지 요소를 종합적으로 평가하며,
값이 높을수록 두 이미지가 구조적으로 더 유사함을 의미합니다.


LPIPS (Learned Perceptual Image Patch Similarity)

LPIPS는 지각적 유사성(perceptual similarity)을 평가하는 지표입니다.
비교할 두 이미지를 각각 VGG 네트워크에 입력하고,
중간 layer에서 추출한 feature 값들 간의 차이를 측정하여 유사도를 계산합니다.

  • 사람이 느끼는 시각적 차이와 더 잘 대응되는 지표
  • 값이 낮을수록 두 이미지가 더 유사함을 의미

실험 결과 분석
실험 결과를 보면, NeRF는 기존의 모델들(SRN, NV, LLFF)과 비교했을 때
전반적으로 더 우수한 성능을 보였습니다.
특히 LPIPS 지표에서는 값이 낮을수록 좋은데,
기존 방법인 LLFF가 NeRF보다 약간 더 낮은 LPIPS 점수를 보이기도 합니다.
하지만 NeRF의 저자들은 LLFF보다 더 다양한 view에서 자연스럽고 일관된 이미지 생성이 가능하다는 점을 강조하며,
전체적인 novel view synthesis 성능 측면에서는 NeRF가 더 우수하다고 주장합니다.

소소하지만 저의 아이디어까지...
 

아래는 제가 참고한 자료에 대한 url입니다.
논문 paper: 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