NeRF
Neural Radiance Fields(NeRF)는 3D 대상이나 장면을 신경망을 통해 학습하여 표현하는 방법입니다. 공간적 위치를 표현하는 (x, y, z)와 방향을 표현하는 (∅,ϴ)를 조합하여 5차원의 좌표계를 입력으로 하여 색(R, G, B)과 밀도(σ, 얼마나 투명한지)를 통해 나타냅니다.
학습 방법
NeRF는 3D 공간에 있는 광선의 밀도와 색상을 누적 합산을 통해 Volume Rendering(이하'볼륨 렌더링')을 수행합니다. 볼륨 렌더링은 신경망을 활용해 특정 시점의 2D 이미지 데이터를 입력 받아 3D 구조를 생성합니다. 방법은 간단하게 살펴보면 다음과 같습니다.
1) 다양한 각도에서 찍은 2D 이미지를 입력 데이터로 받아 여러 점들을 샘플링 합니다.
2) 각 지점에서 색상과 투명도를 계산하고 그 값들을 합성합니다. (Ray marching, 아래 식 참고)
3) 예측한 렌더링 결과와 실제 이미지 간의 손실을 계산하고, 역전파를 통해 가중치를 업데이트 합니다.
4) 최종적으로 학습이 완료되면, 훈련에 사용되지 않은 시점에서 장면도 렌더링해 3D 형태의 이미지를 만듭니다.
이에 대한 간단한 개요는 홈페이지에서 소개하고 있는 이미지를 통해 이해할 수 있습니다.
3DGS
지점마다 ray marching이라는 계산을 수행해야 하는 NeRF는 태생적으로 많은 연산이 발생할 수 밖에 없습니다. 이에 대한 보완 연구들이 많이 이뤄져서 개선이 있긴 하지만, 고해상도일수록 더욱 많은 연산이 필요하기 때문에 렌더링이 더욱 어렵습니다.
이에 3D 렌더링의 새로운 패러다임으로 3D Gaussian Splatting(3DGS)가 등장합니다. 3D Gaussian은 일반적으로 많이 보는 종모양 가우시안 분포(정규분포)를 3차원 공간으로 확장한 것으로 평균(중심 위치)과 공분산 행렬(각 방향의 분산)의 매개변수를 갖습니다. (기존 정규분포는 평균, 분산을 갖던 것에서 확장) 여기서 3DGS는 더 나아가서 색상(RGB)과 투명도 (σ)까지 포함합니다.
학습 방법
3DGS의 학습 방법은 다음과 같이 소개하고 있습니다. 도식으로 표현하면 아래 그림을 참고하시기 바랍니다.
1) 다각도의 2D 이미지와 카메라 위치를 수집합니다. (SfM이란 표현을 쓰긴 했지만, NeRF와 같습니다)
2) 3D Gaussian을 초기화 합니다. 평균, 공분산, RGB을 초기화 합니다.
3) 입력 데이터의 값을 활용해 Rasterizer로 예측한 이미지 값을 비교해 손실을 계산하고 최적화를 수행합니다.
4) 일련의 절차에 따라 Gaussian을 판단 및 정리하여 밀도를 조정합니다.
- 일정 기준보다 낮은 투명도를 가진 경우 Gaussian을 제거 합니다.
- 기하학적 특징을 파악하지 못한 경우(Under-reconstruction) : positional gradient 방향으로 복사 합니다.
- 광범위하게 Gaussian이 모델링 된 경우(Over-reconstruction) : Gaussian을 분리합니다.
- 위 과정들을 반복하며서 형상을 잡아갑니다.
다만, NeRF나 3DGS 모두 더 복잡하므로 관심이 있다면, 관련 논문 및 자세하게 분석된 블로그 글을 통해 더 자세하게 살펴볼 필요가 있습니다.
참고자료
[1] https://www.matthewtancik.com/nerf
[2] Midenhall et al. "NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis". https://arxiv.org/abs/2003.08934
[3] Kerbl et.al. "3D Gaussian Splatting for Real-Time Radiance Field Rendering". https://arxiv.org/abs/2308.04079