본문 바로가기
AI/NeRF

[NeRF] 논문 리뷰

by 여기는 정글 2024. 2. 26.

안녕하세요! 정글러입니다.
오늘은 앞으로 다룰 NeRF 논문 리뷰를 하며 자세히 알아보고자 합니다.

1. Introduction

NeRF는 Representing Scenes as Neural Radiance Fields for View Synthesis의 줄임말로
다양한 각도에 찍은 이미지를 학습해 새로운 카메라 각도를 볼 수 있도록 아웃풋을 얻어낼 수 있습니다.

 
기존의 모델들은 굉장한 메모리가 소모되기에 상용화되기에 어려움이 있었습니다.
NeRF는 Implicit Representation을 사용한다는 점이 기존과 다른 점입니다.
 

가볍게 저장될 수 있다!

 
이는 해당 공간의 정보를 Voxel 형태로 Neural network를 통해 Implicit하게 저장한다는 뜻입니다.
즉, 그 지점에 x,y,z 좌표를 쿼리로 주고, 이를 네트워크에 넣어 아웃풋을 뽑는 것입니다.
따라서 메모리에 넣어야 하는 것이 voxel 형태가 아닌, 딥러닝 네트워크 하나만 저장하고 있으면
모든 공간상의 정보를 기존의 voxel 보다 가벼운 형태로 저장할 수 있습니다.
 

2. Representing Scenes as Neural Radiance Fields for View Synthesis

Implicit representation을 통해 각각의 네트워크에 쿼리를 넣습니다. 쿼리는 (x,y,z)의 좌표와 뷰디렉션을 포함합니다.
그러면 아웃풋은 RGB값과 density값이 아웃풋으로 나옵니다.
이를 볼륨렌더링을 통해 Ray의 값을 하나의 픽셀값으로 합쳐 렌더링을 하면 우리가 보는 이미지가 보여집니다.
이때 다른 카메라의 각도에서도 ray에서 점들을 샘플링하여 네트워크에 넣어서 값들을 뽑고, 다시 렌더링할 수 있습니다.
 

3. Camera Intrinsic and Extrinsic Parameters

3.1 Camera Intrinsic

3D좌표를 Nomalized Plane으로 보내고, Image Plane으로 보낸다.

우리가 모델링하고 싶은 것은 Image Plane의 (x,y)값입니다. 그 전의 단계가 Nomalized Plane입니다.
왜냐하면 카메라의 특성들이 들어갈 수밖에 없기 때문입니다.
 
Nomalized Plane은 Z축에서 초점거리로부터 1m인 지점입니다.
따라서 nomalized plane의 (x,y) 좌표는 1/Z해주면 나오게 됩니다.
*Z축 : 카메라가 바라보는 방향
 
그후, Nomalized Plane에서 Image Plane으로 변환하는 과정을 알아보겠습니다.

Intrinsic은 위에 첨부된 이미지의 matrix를 말합니다.
*fx, fy : 초점거리로부터 이미지 플레인까지의 거리
*cx, cy : 이미지 플레인의 중심의 위치
 

NeRF에서는 반대방향으로 간다.
Image Plane -> Nomalized Plane -> 3D 좌표


3.2 Extrinsic Parameters
Extrinsic Parameter카메라의 포즈를 나타냅니다.
x,y,z축은 각각 회전을 시킬 수 있는데, 이를 조합하면 모든 회전 행렬을 구현할 수 있습니다.

이 3D 로테이션 메트릭스와 트렌스레이션이 합쳐집니다.
이는 World to Camera metrix입니다.
 
NeRF에서 쓰는 것은 Cam to World matrix입니다.
카메라를 기준으로 Ray를 쏘고 점들을 얻고, 그 점들을 world 좌표계로 바꿔주기 때문입니다.
따라서 Extrinsic의 역행렬을 쓸 일이 많습니다.
 

4. Method

좌표값과 디렉션값을 MLP 네트워크에 넣어서 칼라값과 덴시티값을 얻어냅니다.
픽셀에 해당하는 RGB값을 구하기 위해 Ray를 쏠 때, 좌표들을 샘플링하고
이를 네트워크에 넣어서 칼러, 덴시티값을 얻어 이를 볼류렌더링을 통해 색깔을 얻는 과정을 겪습니다.
 

같은 지점이더라도 카메라 위치에 따라서 RGB값이 달라지는 것을 표현하기 위한 것입니다.

density는 0~무한대, 3d위치에서 질량이 얼마나 되는가입니다.
하지만 네트워크는 무한대가 될 수 없기 때문에 알파값을 통해 0보다 같거나 크도록 지정해줍니다.
알파값으로 그 지점에 물체가 존재하고 있을 확률을 0부터 1사이의 값으로 나타내는 것입니다.
이렇게 계산된 ray에 해당하는 RGB값 하나가 C입니다.

최종적으로 픽셀을 만들었다면 위치에 대한 RGB값으로 rendering loss를 걸어줍니다.
 

5. NeRF 활용에서 기대하는 점

앞으로 업무에서 NeRF를 활용하여 실제로 3D에셋을 제작하고자 합니다.
비개발자로서 현업에서 직접 사용해보면서 어떻게 잘 활용할 수 있는지, 한계점은 무엇인지 공유해보겠습니다. 
 
다음 게시물은 NeRF의 코드분석을 하면서 실제로 구현하는 방법을 정리해보고자 합니다.
감사합니다 :)