최근 synthetic data들의 중요성이 대두되고 있습니다. simulation, generative model 등 여러 방법이 있지만 여기서는 NeRF를 짧게 분석해보겠습니다.
정 의
NeRF는 Novel View Synthesis 계열의 기술입니다. NVS란 특정 몇 개의 시점에서 촬영한 이미지로부터 임의의 위치에서 본 대상의 모습을 뽑아내는 이미지 synthetic 기술을 말합니다.
처음에는 SfM | SLAM 등과의 차이가 무엇인지 의문이 들었는데요. SfM은 3D Object를 있는 그대로 정확하게 렌더링 하는 것에 (혹은 pose estimation) 방점을 두는 것이라면, NeRF의 Novel View Synthesis 계열은 synthetic data를 generation 하는 것에 방점을 둔 것입니다. 실제로 NeRF 돌리려면 input 중 하나인 pose를 알기 위해 SfM이나 SLAM을 필요로 합니다.
전체적인 구조
NeRF의 MLP 모델의 Input으로는 spatial location(3차원 위치)과 direction이 필요하고 output으로 color와 density가 나오게 됩니다. 이후 output값인 color와 density를 이용, Volume Rendering의 과정을 통해 하나g하나의 픽셀이 갖는 값을 예측하고 실제(GT)의 해당 픽셀 값과의 비교 (MLE를 사용)를 통해 학습해갑니다.
NETWORK
위 항에서 설명한 Input ->output을 만들어 주는 딥러닝 모델은 간단합니다.
오히려 여기서 중요하게 볼 것은 positional encording과 Direction input값이 input으로 들어오는 시점입니다. 아래 그림이 모델의 전체적인 아키텍처입니다. NetWork는 MLP로 구성되어 있고요, 각 layer마다 activation function은 Relu를 사용하였습니다. 아래 network에서 특징은 크게 두 가지로 볼 수 있습니다.
1. 아래 그림에서 감마(x)로 표현되어 있는 부분이 spatial location, 즉 3D position(x, y, z) 좌표입니다.
그렇다면 3차원으로 표시되어야 하는데 60차원 으로 표시되어 있습니다. 그 이유는 positional Encoding을 거쳐 차원이 증가되었기 때문입니다. positional Encoding은 어디서 많이 들어 봤는데요. ViT에서 나오는 positional Encoding과 똑같습니다. sin, cos으로 이루어져 있는 function을 통해 position정보를 augmentation 하는 역할을 합니다. 논문에서는 해당 작업을 통해 high frequence영역에서 정확도가 높아졌다고 하고 있습니다.
2. 또 특이한 부분은 감마(d : direction) input 값이 8개의 layer 를 거친 후에야 input으로 투입된다는 점입니다.
또 output 중 하나인 density(그림에 빨간색 block 시그마로 표시되어있습니다.) 는 8개의 layer 이후 output값으로 도출됩니다. 정리하면 position은 color, density에 모두 영향을 끼치지만, direction은 color에만 영향을 끼칩니다.
- position -> color, density
- direction -> color
논문에서는 direction에 관계없이 해당 position에서는 동일한 density가 나와야 하지만, RGB는 direction 즉 보는 방향에 따라 조명등의 이유로 달라질 수 있다고 말하고 있습니다.
VOLUME RENDERING
수식을 전개하기 전에 Volume Rendering의 의미를 살펴볼 필요가 있습니다. Ray(빛)은 직진합니다. 벡터라고 볼 수 있는데, 벡터는 o+td로 정의할 수 있습니다. o은 지나는 점(원점), d는 평행한 직선(direction)을 말합니다.
이미지를 이루고 있는 pixel 각각은 하나의 ray를 갖습니다. 그 각각의 ray는 원점부터 infinite까지 진행하면서 물체나 혹은 공기등에 반사되면서 해당 ray에 대응되는 camera pixel값의 RGB(color)를 결정합니다. 즉 이렇게 color 에 미치는 영향들을 고려해서 rendering 하는 방법론이 Volume Rendering이라고 할 수 있습니다.
volume rendering은 그래픽스 분야에서 익숙한 단어인데요. volume rendering 을 참고하시면 좋겠습니다.
위의 식이 Volume Rendering 의 eq이며 T는 transmittance 투과도를 뜻합니다.
해석해보면 density가 클 수록 weight가 커지며,tn이전부터 t까지 (즉, 현재까지) 의 density가 클 수록 weight가 작아집니다(앞쪽에 density가 큰 물체가 있으면 그 뒤에 있는 물체는 보여지기 힘들게 때문이죠).
위의 continuous한 적분식을 실제로 프로그래밍에 사용할 수 있도록 discrete하게 바꾸어야 합니다. 자세한 논문은 아래에 참조하였습니다.
discrete하게 나타낸 Volume Rendering 식은 아래와 같습니다.
다시 해석해보면 Ti(1-exp()) 부분이 weight(density*transmittance)로 ray의 일직선상에서 해당 point(Ti)가 얼마만큼의 중요성을 갖고 있는지를 뜻합니다.
SAMPLING
다음으로는 sampling입니다. 다시 말씀드리지만 Volume Rendering식에서 Ti는 ray 직선상의 point들을 말합니다. 이론상으로는 원점에서 infinite까지 무한의 point가 존재하니 계산이 불가합니다. 그래서 해당 논문에서는 object가 있을만한 곳 near와 far를 적절하게 설정하고 near와 far사이를 n개로 분할하여 각각의 n개 사이에서 uniform random하게 point를 뽑습니다.
RECAP 1
이 쯤에서 recap하면,
pixel마다 ray(o+td)를 정의하고 sampling을 통해 ray위의 point를 선발합니다. 그 후 선발된 point의 위치와 view direction이 MLP모델을 통과하고 output으로 density와 color를 출력하게 됩니다. 이 density와 color결과값을 volume rendering을 통해 하나의 값으로 정해지게 되고 이 값과 해당 pixel의 원래 픽셀값과의 MLE loss를 통해 학습을 하게됩니다.
FINE NETWORK
마지막으로 NeRF에서는 지금까지 설명했던 network를 coarse network로 정의하고 추가로 fine network를 두어서 더 정밀한 network를 완성합니다.
이유는 하나의 ray를 쏘았다고 가정하면 ray에 있는 수많은 point들 가운데 실제로 유의미한 값들은 weight가 높은 point들입니다. 즉, 더 중요한 point들에 더 sampling하겠다라는 뜻입니다.
방법은 inverse transform sampling 을 이용하는 것 입니다.
inverse transform sampling은 cumulative distribution function이 주어지면 probablility distribution에서 samling을 하는 method입니다. 아래 그림은 uniform distribution이 inverse transform sampling을 통해 normal distribution으로 inverse transform sampling되는 GIF입니다.
다시 NeRF로 돌아와서 보면, coarse network(이전까지 설명들인 network를 뜻합니다.) 에서는 uniform sampling을 통해 ray상의 point를 추출하여 network에 input으로 넣어주고 ouput으로 나온 density와 color를 이용해 weight를 구합니다.
fine network는 coarse network에서 구한 weight를 normalize 하여 상대적으로 얼만큼 color값에 영향을 미치는지 확인 할 수 있고, inverse transform sampling 을 통해 중요한 point들 위주로 다시 샘플링을 합니다.
이렇게 다시 샘플링된 더 중요한 point들을 따로 동일한 network에 통과시킵니다. 이 두번째 과정을 fine network라고 합니다.
LOSS
이렇게 두 개의 network (coarse, fine)으로 나온 값들을 MSE LOSS를 이용하여 계산하고 sum합니다.
coarse network으로 network의 general attribute를 가져가고, fine network을 통해서는 high frequency 정확성을 가져간다고 볼 수 있습니다.
RECAP 2
마지막으로 recap하겠습니다., 이미지 pixel마다 ray를 쏩니다. 직선의 ray 상에 uniform하게 point들을 sampling하고 MLP network에 point들의 direction과 position값이 input으로 입력됩니다. density와 color(RGB)를 결과 값으로 받은 후, volume rendering을 통해 하나의 값으로 추출합니다(coarse network과정). volume rendering할때의 각각의 point에서의 weight들을 inverse sampling방법을 이용해 weight가 높은 point들로 re-sampling합니다. 이렇게 뽑은 point들을 다시 MLP network에 넣어서 volume rendering 을 통해 하나의 값으로 추출합니다.(fine network과정).
참고로, 해당 network과정중에 sampling이 들어가게 되면 미분이 불가능하여 backpropagation이 되지 않습니다. 샘플링한 후 input에 넣어주는 것입니다.
이 후 나온 2개의 값(coarse network, fine network)을 GT값과의 MLE loss를 통해 학습을 진행합니다.
RESULT
결과적으로 NeRF는 Novel View Synthesic 계열에서 Sota 성능을 남겼습니다.
하지만 실제로 공개되어있는 소스를 돌려보면 input으로 굉장히 많은 picture를 사용해야하고 또 각각의 picture마다의 translation, rotation 을 알아야합니다. ( 위에서 언급한 SfM을 통해 사전에 이런 pose에 관련된 정보를 얻어야 합니다.)
이를 해결하기 위한 새로운 NeRF들도 이 후 review에서 다뤄보겠습니다 :)
마지막으로 논문을 읽고, 본 블로그의 짧지만 핵심 내용을 이해하셨다면, 이제 아래의 동영상으로 마무리 지으신다면 NeRF 마스터가 되어있으실겁니다.