안녕하세요. 오늘 리뷰할 논문은 NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis입니다. 2020년에 발표된 논문으로 발표된지 꽤 지난 논문이지만 여전히 학계에 엄청난 영향을 주고 있는 논문입니다. 특정한 3D 장면에서 여러 각도의 사진이 제공이 되면 사진으로 제공되지 않았던 각도의 사진도 모델을 통해 유추할 수 있다는 것을 보여준 논문입니다. NeRF는 광선이 사물을 비추는 현상을 굉장히 간단한 형태의 모델로 학습시켰습니다.
(해당 글은 개인적인 기록을 목적으로 잘못된 내용이 있을 수 있음을 알립니다.)
(https://arxiv.org/abs/2003.08934)
0. Abstract
특정한 장면(Scene)에서 여러 각도로 찍은 일부의 사진들을 가지고 완전 새로운 각도의 모습을 유추하는 task를 novel view synthesis라고 부릅니다. 해당 논문은 해당 task를 continuous volumetric scene function을 학습하며 SOTA급 성능을 냈습니다. 해당 논문에서 사용된 모델은 fully-connected layer만 사용된 굉장히 간단한 구조이며 입력으로는 5차원((x, y, z) 위치 좌표와 바라보는 방향 (\( \theta, \phi \))) 값이 들어가게 되고, 그에 대한 결과로 volume density와 해당 방향에 대한 RGB 값이 나오게 됩니다. 같은 곳(픽셀)을 바라보더라도 보는 위치가 다르면 값이 달라질 수 있다는 말입니다. 앞에서 말한 RGB 값은 바라보는 경로 상에 위치한 모든 점들의 RGB 값을 말합니다. 그리고 volume density와 경로 상에 있는 RGB 값들을 volume rendering technique을 사용하여 실제로 어떤 RGB 값이 보일지 유추하게 됩니다. Volume rendering하는 부분은 미분가능하기 때문에 모델과 함께 사용하기에도 용이합니다.
이렇게 말로만하면 잘 와닿지 않을 것 같아서 그림을 한 번 그려봤습니다. 특정한 위치에서 빛(ray)를 특정한 방향을 쏘면 그 경로 상에 있는 모든 지점의 volume과 RGB 값을 유추합니다. 물론 경로 상에 있는 모든 지점은 이론상 무한대지만 논문에서는 아래 그림처럼 유한한 갯수의 지점을 만들어줍니다. 여기서 volume이라는 단어는 대강 덩어리감(?)정도로 해석하시면 될 것 같습니다. 빛은 물체와 부딫히면 그 뒤로 갈 수 없습니다. 우리 눈에도 이 때문에 물체가 있다면 그 뒤를 볼 수가 없습니다. 이렇게 빛이 통과 할 수 있는 정도, 물체의 유무를 volume으로 표현한 것입니다. 그리고 여러 지점의 (volume, RGB) 값들을 합쳐서 특정 위치에서 눈에 보여지는 픽셀 값을 계산해줍니다.
1. Introduction
Abstract에 나왔던 내용을 제외하고 말해보자면 NeRF는 scene 하나 당 하나의 모델을 학습합니다. Scene 마다 여러 각도에서 본 사진들이 학습을 위한 데이터로 존재합니다. Ray을 쏴서 하나의 픽셀 값을 예측하는 것은 scene의 한 사진의 픽셀 하나를 예측하는 것 입니다. 한 scene의 여러 장의 이미지를 가지고 모델을 학습하면 실제로 물체가 있는 곳은 volume density를 높에 예측하고 정확한 색을 예측할 수 있게하여 일관성 있는 이미지를 생성할 수 있게 합니다.
하지만 위에서 제시했던 방법만 가지고는 이미지를 고해상도로 생성할 정도로 충분이 학습이 되지 않는다고 합니다. 그래서 저자들은 positional encoding과 hierarchical sampling을 사용하여 성능을 끌어올렸습니다. 자세한 내용은 뒤에서 설명하도록 하겠습니다. 해당 논문의 contribution은 아래와 같습니다.
- 복잡한 물체를 5D neural radiance field로 간단한 MLP에 parameterize하였습니다.
- 미분가능한 Rendering 방법을 통해 RGB이미지를 가지고 모델을 최적화하였습니다. 이 과정에서 사용된 hierarchical sampling strategy는 물체가 있을 확률이 높은 부분을 모델이 집중적으로 학습할 수 있도록 하였습니다.
- Positional encoding을 통해 5D 입력값 각각(x, y, z 따로)을 고차원 공간으로 투사하여 고주파 scene을 성공적으로 렌더링할 수 있도록 하였습니다.
2. Related Work
해당 부분이 궁금하신 분은 논문을 찾아보시면 좋을 듯 합니다.
3. Neural Radiance Field Scene Representation
아래 그림은 위에서 반복적으로 말했던 NeRF의 구조입니다. \((x, y, z, \theta, \phi)\)가 입력으로 MLP인 \(F_{\theta}\)에 들어가게 됩니다. 그리고 \(F_{\theta}\)는 ray 상의 RGB 값과 density를 반환해줍니다. \(F_{\theta}\)는 위치 정보를 받고 density를 예측하도록 하면서 여러 방향에서도 일관성이 있는 이미지를 생성할 수 있게 합니다. Scene을 MLP가 입체적으로 이해하도록 유도한다고 보아도 될 듯 합니다.
MLP인 \(F_{\theta}\)의 구조는 먼저 3D\((x, y, z)\)를 8개의 FC layer(ReLU도 있음)를 통과하여 density\((\sigma)\)와 256 차원의 특징 벡터를 얻습니다. 256 차원의 특징 벡터에 아까 사용하지 않았던 \((\theta, \phi)\)를 붙여서 FC+ReLU 한 층을 통과시켜 128 차원의 RGB 값을 얻어냅니다. 이러한 방식 때문에 물체의 같은 위치라도 바라보는 방향에 따라 다른 RGB값을 가질 수 있으며 입력 값으로 viewing direction이 들어가지 않으면 이미지의 질이 떨어지는 것도 확인할 수 있습니다. 최종적으로 얻어진 (RGB\(\sigma\))는 volume rendeing을 통해 하나의 픽셀 값으로 적분됩니다.
아래 그림은 배의 같은 위치라도 바라보는 방향에 따라 픽셀 값이 달라질 수 있음을 보여줍니다.
아래 그림에서 viewing direction을 학습에 사용하지 않은 경우, 생성된 이미지의 선명도가 떨어지는 것을 볼 수 있으며 바퀴를 보면 빛이 비침에 따라 검정색 바퀴가 다르게 보일 수 있는 것이 간과됨을 확인할 수 있습니다.
4. Volume Rendering with Radiance Fields
MLP를 통해 얻어진 (RGB\(\sigma\))는 ray 상에 존재하는 density와 RGB 값을 의미합니다. 이게 이미지 상에서는 어떤 색으로 보일지 계산하기 위해서 volume rendering이라는 과정을 거치게 됩니다. 이것은 식으로 아래와 같이 나타낼 수 있습니다. Ray 상에서 계산이 시작되는 \(t_{n}\)부터 \(t_{f}\)까지 연속적으로 적분을 하게 됩니다. 여기서 r()는 ray 정보, \(\sigma\)는 density 정보, T(t)는 합쳐져서 \(t_{n}\)부터 t까지 빛이 투사되는 정도(투명성)을 의미합니다. C(r)는 최종적으로 예측된 픽셀 값입니다.
하지만 위는 범위가 연속적이라는 가정이 있을 때의 계산법이고 실제로 컴퓨터 상에서 이런 연속적인 계산을 하기가 힘듭니다. 그래서 \(t_{n}\)부터 \(t_{f}\)를 이산적인 범위로 나누어서 적분을 진행하게 됩니다. Deterministic quadrature를 사용하여 적분하면 고정적인 위치를 쿼리로 주게 되어 성능이 저하된다고 합니다. 그래서 \(t_{n}\)부터 \(t_{f}\) 같은 길이로 나눈stratified sampling을 하였다고 합니다.
Stratified sampling을 하여 이산개의 bin을 아래처럼 계산을 하여 픽셀 값을 계산한다고 합니다.
\(\delta_{i}\)는 나뉘어진 bin의 길이입니다. 바뀐 식은 미분 가능한 alpha compositing하는 식으로 바꾸어 작성할 수 있습니다.
5. Optimizing a Neural Radiance Field
NeRF에 Positional encoding과 Hierarchical Volume sampling을 통해서 성늘을 SOTA급으로 끌어올렸습니다.
5. 1. Positional encoding
Positional encoding은 요즘에는 NLP분야에서 token에 더해주면서 모델이 token의 위치를 파악하게 할 수 있게끔하는 사용합니다. 여기서는 고주파 영역에서 \(F_{\theta}\)의 성능이 좋지 않은 문제를 개선하기 위해서 사용됐습니다. 이는 기존에 딥러닝 모델들이 lower-frequenct function에 편중되어 학습이 되는 경향이 있었다는 발견과도 같은 선상에 있는 이야기 입니다. Positional encoding은 learnable parameter가 따로 없고, 아래처럼 sinusoidal 함수를 사용합니다.
\(F_{\theta}\)에 입력 값을 넣기 전에 positional encoding을 먼저하여 입력 값의 차원을 두 배로 늘려줍니다. 그 후에 \(F_{\theta}\)에 입력값으로 넣어줍니다. Positional encoding을 할 때는 위지 정보와 방향 정보를 따로따로 나누어서 encoding해주었다고 합니다.
5.2. Hierarchical volume sampling
앞에서 말했 듯이 volume rendering에서 적분을 할 때 ray 상의 구간을 이산적으로 나누어 적분합니다. 이 과정을 더 효과적이고 효율적으로 하기 위해 sampling 과정을 거치게 됩니다. 이미지를 렌더링할 때 사실상 물체에 가려진 뒷 부분이나 아무 것도 없는 허공은 크게 계산을 하는데 의미가 없습니다. 이러한 점 때무에 NeRF에서는 \(F_{\theta}\)를 coarse network과 fine network로 두 개를 사용합니다.
Coarse network에서는 앞에서 나온 방법대로 구간을 균일하게 나눈 뒤 렌더링을 합니다. 이 때 나왔던 w 값을 정규화하여 piecewise-constant PDF를 만들어 줍니다. 그리고 해당 PDF의 확률에 비례하여 ray 상의 sampling을 진행합니다. 그래서 비어있는 공간 같이 계산이 불필요한 영역은 비교적 sampling을 적게하고, rendering에 필요한 부분을 집중적으로 sampling 해주어 한 번 더 연산을 하게 됩니다.
5.3. Implementation details
학습을 할 때는 아래와 같은 Loss를 흘려주면서 모델 학습을 진행합니다. Coarse prediction과 fine prediction 모두에 대해 GT view에 대한 MSE를 계산하여 loss 계산을 합니다. fine prediction이 최종 예측 값이니까 fine prediction만 가지고 loss를 구하는 방법도 있지만, coarse network가 ray 상에서 transparency를 나타내는 w(weight) 값을 잘 뽑아내는 것이 fine sampling을 할 때도 도움이 되기 때문에 아래와 같은 objective를 만들었다고 합니다. Coarse sampling은 64개 fine sampling은 128개를 했다고 합니다.
6. Results
다른 모델과 quantitative한 성능을 비교했을 때 전반적으로 모든 데이터 셋에서 좋은 성능을 보여주고 있습니다.
논문에 나와있는 예시들도 보면 다른 모델에 비해 복잡한 이미지도 선명하게 잘 만들어내는 것으로 확인해볼 수 있습니다.
위 표는 ablation을 진행한 결과입니다.