Manduss life
[논문] NeRF(Neural Radiance Field) 정리 본문
1. 3차원 Ray 생성
NeRF(Neural Rendering Field)는 다시점의 영상으로부터 3차원 점을 생성하여 각 점마다의 색상값(RGB)과 존재 확률값인 Volume Density의 두가지 속성값을 학습한다. 이로부터 특정 카메라의 위치와 방향에서의 3차원 점의 속성값들로부터 렌더링 영상을 생성한다. 3차원 점을 생성하기 전 영상으로부터 3차원 ray를 생성하는 과정을 거친다.
영상을 촬영한 카메라 센터로부터 초점거리 만큼 떨어진 이미지 평면상의 픽셀 위치좌표를 투과하는 3차원 ray를 생성한다. 위 방법으로 생성된 ray 상에서 3차원 점을 추출한다. ray 위의 점 $x(t)$을 정의하면 다음과 같다. $o$는 카메라의 원점, $\overrightarrow{d}$는 카메라의 방향벡터를 의미하고, $t$는 카메라 원점으로부터 점의 거리를 의미한다.
$$x(t) = o + t\overrightarrow{d}$$
카메라의 위치 및 방향 정보가 포함된 월드 좌표계 상의 방향벡터 $\overrightarrow{d}$를 구하기 위해서는 카메라 좌표계 상의 방향벡터 $\hat{\overrightarrow{d}}$를 계산한다. 카메라 원점과 이미지 평면의 위치좌표를 이어 카메라 좌표계의 3차원 방향벡터 $\hat{\overrightarrow{d}}$를 획득한다.
$$\hat{\overrightarrow{d}} = \left ( \frac{i - \frac{W}{2}}{f},\frac{j - \frac{H}{2}}{f}, 1 \right )$$
카메라의 위치 및 방향 정보의 행렬인 3x4 Transform 행렬의 각 열을 다음과 같이 정의한다.
$$P = (p_{1}, p_{2}, p_{3}, p_{4})$$
Transform 행렬과 카메라 좌표계의 방향벡터의 곱으로 카메라의 위치, 방향 정보가 포함된 ray의 최종 방향 벡터 $\overrightarrow{d}$를 획득한다.
$$\overrightarrow{d} = (p_{1}, p_{2}, p_{3})\cdot \hat{\overrightarrow{d}}$$
2. 3차원 점 샘플링
생성된 3차원 ray위의 특정 개수의 점을 샘플링하여 학습에 사용한다. 3차원 점을 샘플링하는 방법으로는 층화추출법을 사용한다. 층화추출법은 중복 추출을 방지하기 위해 층을 나눈 후 각 층 내에서 표본을 추출하는 기법이다. 아래 그림은 3차원 ray 위에서 층화추출법으로 샘플링된 점을 도형화한 그림이다. 3차원 피사체를 포함하는 샘플링 범위를 설정하고, 이 범위 내에서 샘플링 점의 개수만큼 균일하게 나눈 후 나뉜 ray 위의 점을 랜덤하게 위치시킨다. NeRF에서는 기본적으로 한 ray당 64개~192개의 점을 샘플링하여 학습시킨다. ray의 $k$번째 샘플 점의 위치를 의미하는 $t_{k}$를 정의하면 다음과 같다.
$$t_{k} = t_{near} + (k-1)\frac{t_{far} - t_{near}}{N} + \gamma_{rand} \quad (0\leq \gamma_{rand}< \frac{t_{far} - t_{near}}{N})$$
$t_{near}, t_{far}$은 카메라 원점으로부터 각각 샘플링 범위 내의 가까운 위치, 먼 위치의 거리 값이고, $\gamma_{rand}$는 특정 범위 내의 랜덤 숫자이다.
3. 볼륨 렌더링
샘플링 점들을 학습한 결과 각 점의 색상값과 Volume Density값을 추정하고 이로부터 렌더링하여 2차원 영상을 생성한다. 렌더링할 때 볼륨 렌더링 기법을 사용한다. 볼륨 렌더링 기법은 3차원 데이터셋으로부터 Line Integral을 사용하여 2차원 단면 이미지로 만든다. 이 기법을 사용하는데 필요한 값은 3차원 데이터의 RGBA값이다. 여기서 A(투명도)값은 Volume Density값으로 사용된다. 볼륨 렌더링 수식은 다음과 같다.
$$\hat{C}(r)= \int_{t_{near}}^{t_{far}}T(t)\sigma (x(t))c(x(t), \vec{d})dt,\quad T(t)=exp\left ( -\int_{t_{near}}^{t}\sigma(x(s))ds \right )$$
$\hat{C}(r)$는 ray $r$의 렌더링 결과 색상값이고, $\sigma$는 점의 Volume Density, $c$는 바라보는 방향에 따른 3차원 점의 색상값이다. $T(t)$는 $t$ 위치까지의 점들의 축적된 투과율을 의미한다. NeRF에서 사용하는 Loss function은 다음과 같다. 생성된 ray 각각의 Ground Truth 색상값($C(r)$)과 추정한 색상값($\hat{C}(r)$)의 차이의 합으로 Loss 값을 계산한다.
$$L = \sum_{r\in R}^{}\left [ \left \| \hat{C}(r) - C(r) \right \| _{2}^{2} \right ]$$
4. 네트워크 구조
3차원 점을 학습하여 점의 속성값을 추출하는 네트워크를 소개하고자 한다. 아래 그림은 네트워크 구조를 도식화한 그림이다. Volume Density를 추정하는 신경망 네트워크를 살펴보면 MLP(Multi Layer Perceptron) 형태인 256 dimension의 8개의 Fully Connected Layer로 이루어져 있다. 네트워크 input으로 3차원 점의 위치 정보가 들어가고, 4개의 layer후에 다시 입력으로 들어가는 구조이다. 그 다음 추가적으로 256 dimension, 128 dimension인 2개의 layer가 존재하는데 이는 카메라의 방향에 따른 색상을 추출하는 layer이다. 이 layer의 input으로 카메라의 방향값이 입력값으로 들어간다. 각 layer의 활성화 함수로는 검정색 화살표는 ReLU 함수, 주황색 화살표는 Sigmoid 함수이고, 채워져 있지 않은 화살표는 활성화 함수가 존재하지 않음을 의미한다.
5. 계층적 볼륨 렌더링
층화추출법을 사용하여 추출한 3차원 점만으로는 렌더링 결과에 좋은 성능을 보이기 어렵다. 그래서 제안한 추가적인 샘플링 기법은 계층적 볼륨 샘플링 기법이다. 이는 최종 렌더링 결과의 성능을 높이기 위해 의미있는 부분에서 추가 샘플링하는 기법이다. 이를 위해 네트워크를 위에서 설명한 네트워크 구조를 동일하게 갖는 Coarse 네트워크, Fine 네트워크 2개를 사용한다. Coarse 네트워크에 입력값으로는 샘플링 범위 내의 층화추출법으로 추출한 3차원 점들이다. 이로부터 나온 각 3차원 점들의 Volume Density값으로 Inverse Transform Sampling 기법을 적용하여 추가적으로 샘플링을 수행한다. Inverse Transform Sampling은 특정 확률분포를 따르는 난수를 생성해야 할 때 쓰이는 샘플링 기법이다. 이 결과로 Coarse 네트워크로부터 추출된 Volume Density값이 높은 위치의 점들이 샘플링된다. 층화추출법으로 샘플링된 점들과 Inverse Transform Sampling 기법으로 추출된 점들이 최종적으로 Fine 네트워크의 입력층으로 들어가 각 점들의 최종 속성값을 획득한다.
'논문' 카테고리의 다른 글
[논문] DONeRF : Towards Real-Time Rendering of Compact Neural Radiance Fields using Depth Oracle Networks (0) | 2022.01.04 |
---|