1. Introduce
2020년 NeRF 이후로 NeRF분야에서 가장 이슈가 된 3D Gaussian Splatting 논문을 소개하고자 합니다. (본 글은 Xoft님 블로그에서 도움을 많이 받았습니다.) Gaussian Splatting은 NeRF 대비 Training 시간을 대폭 감소시켰고 Quality도 기존 SOTA보다 앞선 기술입니다. 특히 렌더링 속도가 100FPS 이상인 점이 추후 Real-time으로 나아갈 수 있는 길을 제시했다는 점이 Gaussian Splatting 의 특징 중 하나 입니다.
기존 InstantNGP 나 NeRF 대비해서 렌더링 속도 FPS가 100이상으로 뛰어났고 Training 속도도 NeRF의 48시간 대비, 1시간 이내로 엄청나게 단축시켰습니다. Gaussian Splatting은 NeRF를 수정해 단점을 보완한 기술이 아닌, NeRF와는 다른 기술인 점을 명심하셔아합니다. 하기 내용은 NeRF와 Gaussian Splatting을 비교합니다.
NeRF는 3D 장면을 연속적인 방식으로 표현합니다. 예를 들어 물체를 아주 조각들로 하나하나 계산해서 3D 로 만든다고 생각하시면 됩니다. (카메라에서 장면을 바라보는 여러 Ray를 쏘고 그 Ray 위에서 색과 빛의 밀도를 여러 번 샘플링) 따라서 Training 시간이 오래걸립니다.
--> 볼륨기반으로 Ray에 따라 색과 밀도를 안개같은 연속적인 구름(볼륨)으로 구성합니다.
Gaussian Splatting은 Point Cloud와 비슷하게 불연속적인 점들의 집합으로 표현합니다. 예를 들어 장면의 중요한 부분만 골라서 작은 점들로 사용해 그립니다. (3D Gaussian을 Blob으로 표현해서 퍼진 점들로 만들고 이를 부드럽게 표현합니다.) 따라서 더 빠르고 간단하게 생성합니다.
--> 3D Gaussian Blob들이 모여 장면을 구성합니다.
그럼 본 논문에서는 왜 3D Gaussian을 사용했을까요? 3D Reconstruction에서 3D Gaussian의 장점은 다음과 같습니다.
1. 미분 가능한 볼륨 표현
- Differentiable : Rendering 과정에서 Parameter 조정할 때 Gradient를 계산할 수 있습니다.
- Volumetric : Gaussian Blob은 점이 아니라 3D Volume이기 때문에 Point Cloud/Triangular 보다 더 부드러운 표현이 가능합니다.
2. 명시적 표현
- Blob의 위치, 크기, 모양, 투명도를 수정할 수 있습니다.
- Neural Network 기반은 데이터 구조가 신경망 내부에 있어 수정이 어려웠습니다.
3. 효율적인 2D Projection 과 Alpha Blending
- Blob은 2D Projection 시(end user가 이미지로 보게되니까.), 타원형으로 나타나 2D 이미지 상에서도 부드러운 장면을 생성합니다.
- Gaussian 수학적 특성상 간단해서 효율적인 계산으로 빠르게 계산이 가능합니다. (일단 복잡한 표면이나 구조를 다루지 않습니다.)
- Blob들이 서로 겹치는 상황에서도 투명도(Alpha) 기반으로 간단히 색을 혼합하여 계산량을 최소화할 수 있습니다.
2. Overview
Gaussian Splatting의 전체적인 방법은 다음과 같습니다.
1. Initialization
- COLMAP 등으로 얻은 SfM Point, Camera Pose, Point Cloud 데이터 들을 사용해 3D Gaussian으로 만듭니다.
2. Projection
- Camera의 z축으로부터 1 떨어진 Image Plane으로 2D Gaussian으로 Projection됩니다. 이는 Ground Truth(2D 이미지)와 비교해 Parameter 업데이트를 위함입니다.
3. Differentiable Tile Rasterizer
- 미분가능한 형태의 Tile Rasterizer를 통해 2D Gaussian들을 하나의 Image로 생성합니다.
4. Adaptive Density Control
- Gradient 기반으로 Gaussian의 형태를 변화시킵니다. (복잡한 영역은 밀도를 더 세밀하게 하거나, 단순한 영역은 단순하게 하거나 불필요한 부분은 Remove하거나...)
3. Method
Xoft님의 아이디어를 착안해 Algorithm Pseudo Code에 따라 리뷰해보도록 하겠습니다. (저는 전체적으로 이해하기 편하더라구요...)
전체적인 3D Gaussian Splatting의 알고리즘입니다. 먼저 간단하게 설명드리자면
A : 변수 초기화
B : Inference 후 Loss 계산해 Update하는 부분
C : 간헐적인 Iteration 마다 Gaussian을 Remove, Split, Clone 하는 부분
Method (A) - 변수 초기화
변수 초기화에 앞서 각 학습 파라미터 M, S, C, A에 대해 설명이 필요합니다.
1) M
- SfM으로 획득한 Point Cloud Positon 데이터입니다. 그 Point 들이 초기 3D Gaussian의 평균값으로 사용되고 Point 수만큼 3D Gaussian이 생성됩니다.
2) S
- 3x3 모양의 3D Gaussian Covariance Matrix입니다. (알고리즘과 논문의 변수명이 달라서 임의로 작성했습니다.)
r_m : Rotation Matrix, s_m : Scale Matrix
- Rotation Matrix
3D Gaussian Blob이 회전된 방향을 나타냅니다.
일반적으로 Quaternion q (4x1)을 사용해 Rotation Matrix (3x3)으로 변환됩니다.
- Scale Matrix
3D Gaussian Blob의 x, y, z 축 각각의 Scale을 나타냅니다.
S가 Positive Definite일 경우에만 Gaussian Blob이 제대로 렌더링됩니다. Positive Definite기 때문에 모든 x, y, z축의 Gaussian Blob은 0보다 큰 값을 가집니다. (이제부터 S는 Σ로 표현합니다.)
- 3D Gaussian을 2D Gaussian으로 Projection 하는 수식은 다음과 같습니다.
World 좌표계에서의 Covarience Matrix 는 Σ.
World 좌표계에서 Camera 좌표계로 변환하는 Viewing Transformation은 W.
Camera 좌표계에서 Image 좌표계로 변환하는 Projective Transformation의 Jacobian은 J.
Covariance 특성으로 Transpose를 뒤에 붙이면 상기 수식이 완성됩니다.
3) C
- 3D Gaussian의 Color 값입니다. Color는 Spherical Harmonics (SH) 함수로 설계됩니다.- 3D Gaussian 마다 View 방향에 따라 최적의 SH를 찾도록 하는데요. 간단하게 요약하자면 Max Degree에 따라서 색상의 팔레트의 총 개수가 결정됩니다.
4) A
- 3D Gaussian의 투명도 값 (Alpha)
Method (B) - Optimization
1) Ground Truth 이미지 I ̂ 과 그 이미지의 Camera Pose V를 읽습니다.
2) M, S, C, A, V를 입력으로 받아 Rasterize해 Predicted Image를 만드는데, 이 부분은 알고리즘 2로 설명드리겠습니다.
Rasterizer
- 이미지를 16 x 16의 Tile들로 작게 나눕니다. (CUDA 처리를 위한 것으로 보입니다.)
- Duplicate with Keys : 각각의 2D Gaussian이 겹치는 수만큼 instance 화합니다. (각 instance 들은 key K(depth & id)를 갖습니다. / Gaussian을 여러 Tile로 복제한다고 생각하시면 됩니다.)
- Sort by Keys : key K를 정렬해서 카메라와 가장 가까운 Gaussian을 먼저 그립니다.
- Identify Tile Ranges : 같은 Tile ID를 가진 Start-End Gaussian을 식별해 Tile 별 list를 관리합니다.
- Blend in Order : 주어진 하나의 Pixel에 대해 앞에서부터 Color 와 Alpha를 축적하고 그 Pixel에 대한 Alpha 값이 목표 Saturation에 도달하면 Thread를 중지합니다.
3) Predicted 이미지와 Ground Truth 이미지와 비교해 Loss를 계산합니다. (Loss Function은 L1, D-SSIM)
4) Optimizer는 ADAM을 사용해 M, S, C, A값을 업데이트합니다.
Method (C) - Adaptive Control of Gaussians
- Scene에 맞게 3D Gaussian들을 Adaptive하게 변형하는 단계입니다.
- M, S, C, A는 각 iteration 마다 업데이트되는데, 이 부분은 100 iteration 마다 간헐적으로 수행됩니다.
1) Remove Gaussian
- 특정 threshold보다 낮은 Alpha값을 가진 Gaussian은 제거합니다.
2) Clone Gaussian
- Under-Reconstruction 에 대해서 작은 Covariance 3D Gaussian들은 같은 크기로 Copy하고 Positional Gradient 방향에 배치합니다.
3) Split Gaussian
- Over-Reconstruction 에 대해 큰 Covariance 3D Gaussian들은 작은 크기로 Split합니다. 분리된 Gaussian의 위치는 초기 Gaussian의 확률 밀도 값에 따라 배치합니다.
--> Clone은 Gaussian의 개수와 Volume이 모두 증가하고 Split은 Volume은 유지하지만 Gaussian의 개수가 증가합니다.
이러한 현상으로 공간내에 불필요한 Floater가 생성되고 잡음처럼 불필요한 Blob들이 생깁니다.
본 논문에서는 300 iteration 마다 Alpha 값을 0으로 초기화하여 해결했다고합니다.
4. Evaluation
NeRF에 비해 Memory를 많이 사용하는 단점을 가지고 있습니다.
렌더링 속도(FPS) 가 빠르고 Quality도 좋은 장점을 가지고 있습니다.
5. Limitation & Conclusion
- 입력 이미지가 부족한 Scene에서는 Artifact가 발생합니다.
- 또한 Large Gaussian을 생성한 경우에도 Artifact가 발생합니다.
- 마지막으로 높은 Memory 사용량으로 HW적으로 한계점이 있어 이 부분은 해결해야할 것으로 보입니다.