gusdlf93 / Paper_Survey

4 stars 1 forks source link

[2020 ECCV] NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis #18

Open gusdlf93 opened 2 years ago

gusdlf93 commented 2 years ago

NeRF는 이름 그대로, (Neural Radiance Fields)를 DNN으로 모델링하는 것입니다. Radiance Fields란 것은 5가지의 값으로 현실 세계를 나타내는데, Neural Radiance Fields는 특정 좌표값을(5가지) 입력으로 받아서 해당 위치에서 바라본 이미지의 RGB값을 Deep Learning으로 예측하는 문제라고 보시면 됩니다.

현실세계의 물체들은 3D로 이루어져 있습니다. 하지만 저희가 가지고 있는 대부분의 사진이나 이미지들은 2D 좌표계에서 표현이 됩니다.

이는 우리가 해당 물체를 측정하기에 충분한 관측 횟수가 주어지지 않았기 때문인데요. 만약 우리가 해당 물체를 표현하기에 충분한 관측 횟수가 주어진다면, 2D이미지들만으로 3D의 물체를 나타낼 수 있지 않을까요?

그런 가정에서부터 해당 논문은 출발합니다. 우선 해당 논문을 읽기 전에, 현실세계에 있는 물체를 카메라로 옮기는 방법에 대해서 먼저 알아보도록 하겠습니다. 가장 먼저, Radiance Field에 대해서 먼저 알아보도록 하겠습니다. Radiance Field는 Point와, View Direction으로 이루어져 있습니다.

  1. 관측자가 물체를 바라보는 방향에 해당하는 정보인 view direction (θ, φ)
  2. 물체가 존재하는 위치에 대한 정보 point (x, y, z)

이걸 이미지로 표현하게 된다면 다음 그림과 같습니다. image

원점을 물체의 중심점이라고 가정하면, 이때, Point에 해당하는 (X, Y, Z) 좌표값에서 관측자는 있게 됩니다. 그리고 관측자는 해당 위치에서 물체가 있는 방향으로 시선을 향하겠죠. 특정 위치에서, 바라보는 시선을 View Direction이라고 하고, 바라보고 있는 선을 Ray라고 합니다. X,Y 평면에서 Ray와의 각도를 θ라고 하고, Z와 Ray가 이루는 각도를 φ라고 합니다.

이제 하나의 예시를 들어가면서, 카메라가 3D물체를 2D좌표계에서 표현하는 방법에 대해서 알아보도록 하겠습니다. 우선 다음과 같은 물체가 있습니다. image 우선은 나무가 렌즈를 기점으로 거꾸로 매달려 있는데, 렌즈보다 위에 있는 물체의 경우에는 위에서 밑으로 Ray가 향하기 때문에, 실질적으로 카메라 상에서는 밑에 상이 맺히고, 렌즈보다 아래에 있는 물체의 경우에는 아래에서 위로 Ray가 향하기 때문에 실질적으로 상이 맺히는 위치는 카메라의 윗부분에 맺히게 됩니다. 이러한 원리로 렌즈를 기점으로 물체는 반전되서 표현됩니다.

5D 좌표계에서 X, Y, 좌표는 물체의 위치를 나타내고, Z축 같은 경우에는 카메라와 물체간의 거리를 의미하게 됩니다. 그리고 이를 일정 거리에 따라 나눠놓고 부르는 명칭이 달라지게 됩니다.

image

  1. 광학축에서는 따로 부르는 명칭이 있는지는 모르겠지만, 해당 좌표축의 점을 그냥 (X,Y,Z)라고 부릅니다.
  2. 카메라와 물체간의 거리인 Z축 값이 1되는 지점을 normalized image plane이라고 부릅니다. 여기서 각 좌표 값은 (X/Z,Y/Z,Z/Z) = (u, v, 1)이며 해당 지점에 임의의 값을 곱해서 image plane을 만들거나 Z를 곱해서 다시 광학좌표계로 만들 수 있습니다.
  3. image plane에서는 우리가 실질적으로 카메라로부터 얻어지는 image들이 얻어지게 되고, 여기서 각 좌표는 x, y로 표현됩니다. (z축은 normalized image plane을 만들 때, 1로 고정하므로 없어져도 무방하고, 제거하게 됩니다.)

여기서 한 가지 주의깊게 보셔야 할 점은, 광학축에서 image plane으로 만들 때, Z축이 없어진다는 겁니다. 즉, Z축의 있는 모든 값들이 projection되는 과정에서 합쳐지는 겁니다. 이는 일종의 weighted sum이라고 볼 수 있는데, 3D의 이미지를 2D로 표현하는 과정에서 관찰자와 물체간의 일직선상의 모든 점을 weighted sum해서 하나의 점으로 mapping하는겁니다. 여기서 weighted는 물체의 빽뺵함이 됩니다.(density라고 부르는데, 투명한것의 반대개념입니다.) 예를 들자면, 내가 나무를 바라보고 있는데, 중간에 자동차가 있다면, 자동차에 가려서 나무가 보이지 않겠죠? 이건 관측자가 물체를 바라보고 직선상의 경로인 (Camera ray) 사이에 자동차에 해당하는 픽셀들이 높은 밀도로 차 있어서 그런겁니다.

결국 pixel value = camera ray위에 존재하는 모든 point들의 RGB * density의 값 이라고 정의할 수 있습니다. 이는 밑의 그림을 보시면 좀 쉽게 이해할 수 있습니다. image

그런데 ray 위에 존재하는 모든 point들...은 사실 연속된 값들이기 때문에, 컴퓨터 입장에서는 Sampling을 해줘야만 계산을 할 수가 있습니다.

무슨 얘기냐면, Camera Ray의 픽셀값 C(r)은 다음과 같이 나타납니다. image 즉 ray [(x, y, z, θ, φ)에서 바라본] 픽셀의 기댓값 C(r)은 ray의 range(near, far)사이의 누적된 픽셀값입니다.

그리고 각 픽셀은 density를 가지고 있으므로, 픽셀에 density를 곱해줘야 합니다. t시점까지 누적된 density인 T(t)는 image 와 같이 표현됩니다.

즉, 카메라에서 물체를 바라봤을 떄의 픽셀값은 누적분포함수를 통해서 구해야 하는데, Continual한 값은 컴퓨터에서 처리할 수 없으므로, Sampling을 해줘야 픽셀값을 계산할 수가 있습니다.

Sampling의 가장 간단한 방법은 ray를 Uniform Sampling하는 것일겁니다. 하지만 Uniform Sampling은 성능이 그렇게 좋지 않습니다. 왜냐면, 대부분의 물체들은 물체를 만나기 전까지는 0으로 이루어진 픽셀들이 ray안에 많이 분포해 있다가, 물체를 만나게 되면서, 물체가 가진 density에 의해서 픽셀값들이 정해지게 되므로, 특정 시점 전까지는 픽셀값에 영향력이 거의 없기 때문이죠.

그래서, 아래의 그림과 같이 대안으로 네트워크를 만들었습니다. image

  1. ray를 n개로 Uniform하게 나눈 후(Nc 개의 Sample) 해당 Sample로 학습한 모델을 만듭니다. 해당 모델은 Coarse Network라고 하고 해당 네트워크에서는 density를 나타내는 T(t), volume density를 구합니다.
  2. volume density의 분포에 따라, density가 높은것들이 분포하는 구간에서 세밀하게 Sampling을 한 후(Nf개의 Sample), Nc + Nf개의 Sample로 학습한 Fine Network를 만듭니다.

다음으로 학습 방법에 대해서 알아보겠습니다.

네트워크는 단순히 MLP를 여러개 사용한 모델입니다. image 하지만, 네트워크에서 입력값이 매우 작다면, 학습이 어려워지고, 특히 Overfitting이 잘 생기게 되는데, 여기서는 그러한 문제를 Positional Encoding을 통해서 해결해주게 됩니다. Position에 해당하는 (x,y,z) 좌표를 Positional Encoding을 통해서 20배로 늘려주고, View Direction(θ, φ -> x,y,z`)에 해당하는 정보는 Positional Encoding을 통해서 8배 늘려줘서 사용합니다.

이렇게 만들어진 모델은 생각보다 Simple한데 비해서 성능은 매우 좋은 것을 알 수 있습니다. image

gusdlf93 commented 2 years ago

PPT : https://docs.google.com/presentation/d/1pnuG4VCcBdKybVN-ULSo3n0qKV6rbpKFiJ1C9L_d30M/edit?usp=sharing 참고: https://arxiv.org/pdf/2003.08934.pdf https://www.youtube.com/watch?v=zkeh7Tt9tYQ&t=476s https://darkpgmr.tistory.com/32