[논문리뷰] 3D Gaussian Splatting for Real-Time Radiance Field Rendering, SIGGRAPH'23
2024. 6. 24. 07:00ㆍ3D Vision
- 앞서 DUSt3R를 리뷰했는데요, 3D Vision 분야에서 훨씬 핫한 논문이 있습니다. Gaussian Splatting입니다. Kate Yurkova의 글을 많이 참고했습니다.
Introduction
- Gaussian Splatting이 큰 주목을 받은 이유는 그간 3D reconstruction 분야에서 SOTA로 취급되던 NeRF보다 빠르면서도 좋은 성능을 보여주었기 때문입니다.
- NeRF보다 빠르다는 의미에는 학습뿐만 아니라 랜더링도 포함됩니다. 아래 예시에서는 Gaussian Splatting이 InstantNGP [1]와 학습 속도는 6분 정도로 비슷하면서 100 fps 이상의 랜더링 속도를 보여줍니다.
- 퀄리티의 차이를 직관적으로 느끼기엔 영상만 한 게 없습니다. 사용된 NeRF는 nerfstudio의 nerfacto-huge 모델입니다.
- Gaussian Splatting이 scene을 어떻게 표현하는지, 그리고 왜 빠른지에 대해 알아보겠습니다.
Scene Representations
- Scene을 3D로 표현하는 방법은 크게 두 가지가 사용되어 왔습니다.
- 첫 번째는 meshes와 points를 이용하는 방법입니다. GPU/CUDA 기반 rasterization에 최적화하기 적합하기 때문에 가장 일반적으로 사용되는 방법입니다.
- 두 번째는 continuous 하게 표현하는 방법입니다. NeRF에서는 \((x, y, z)\) 좌표를 \(\theta), (\phi)\) 방향에서 봤을 때의 색과 density를 출력하는 함수를 학습하는 식으로 사용됩니다. 랜더링시 특정 픽셀의 색을 결정하기 위해 ray 상의 점들을 stocastic sampling으로 골라 색을 구하는 과정이 필요하기 때문에 연산량이 많습니다.
- 논문에서는 3D Gaussians로 scene을 표현하는 방법이 퀄리티와 학습 및 랜더링 시간 측면 모두에서 더 우수함을 주장합니다.
- 먼저 전체적인 흐름을 살펴보고 3D Gaussians로 어떻게 scene을 표현하는지 알아보겠습니다.
Gaussian Splatting
- 입력은 static scene을 촬영한 이미지들입니다. Static object만 존재한다면 서로 다른 시점에 촬영해도 괜찮겠으나, 움직이는 물체가 있다면 하나의 시점에서 동시에 촬영된 이미지를 사용해야 성능 저하를 피할 수 있겠습니다.
- 이미지들을 입력으로 Structure-from-Motion (SfM)을 돌려 sparse pointcloud를 얻습니다. 이 pointcloud가 3D Gaussians의 초기 위치가 됩니다.
- 3D Gaussians를 최적화하기 위해선 정답 이미지와 비교할 수 있어야 합니다. 이를 위해 3D Gaussians를 2D projection 하고 differentiable tile rasterizer를 이용해 이미지화합니다. Tile rasterizer는 GPU sorting algorithm (Radix sort by NVIDIA CUB sorting routines [5])을 이용해 Gaussians의 visibility ordering 기반 \(\alpha\)-blending을 수행하기 때문에 매우 효율적이라고 합니다.
- 2D Projection과 Rasterization이 모두 differentiable 하기 때문에 정답 이미지로부터 Gaussians를 최적화할 수 있습니다. Gradient descent를 이용하는데, 여기서도 GPU를 최대로 활용하기 위해 일부 operations에 custom CUDA kernels를 사용합니다 [2, 3].
- Gradient descent만으로 최적의 Gaussians를 찾을 수 있으면 좋겠지만 역시 3D reconstruction이 그렇게 쉽게 구해지진 않습니다. Regularization 역할을 하는 heuristic이 사용됩니다. 100 iterations마다 Gaussians의 수를 늘리거나 줄이는 Adaptive Density Control을 하는데요, 구체적인 방법은 조금 뒤에 설명하겠습니다.
Example
- Gaussians로 표현된 scene을 하나 예시로 보겠습니다.
- SfM의 sparse pointcloud에서 시작해서,
- 최적화 후 700만개의 Gaussians로 scene이 표현된 모습이구요,
- opacity를 모두 1로 하면 아래와 같은 모습입니다.
- 출처: https://github.com/vwxyzjn/hfblog/blob/main/gaussian-splatting.md
- SfM의 sparse pointcloud에서 시작해서,
3D Gaussians as Scene Representations
- 각 3D Gaussian은 아래의 parameters를 갖습니다.
- Mean \(\mu \in \mathbb{R}^{3}\): \((x, y, z)\)의 위치를 결정합니다. 앞서 언급했다시피 SfM의 결과로 얻어진 pointcloud로 초기화됩니다.
- Covariance \(\Sigma \in \mathbb{R}^{3 \times 3}\): Gaussian의 모양을 결정합니다. Isotropic 대신 anisotropic covariance matrix를 사용함으로써 Gaussian이 sphere가 아니라 ellipsoid의 모양을 가질 수 있게 했습니다. Anisotropic covariance 덕분에 보다 compact representation을 가질 수 있었다고 합니다.
- 원본 (left), 랜더링 된 이미지 (middle), Gaussian을 60%로 축소하여 랜더링 한 이미지 (right)입니다. Right의 많은 빈 공간은 scene이 compact 하게 표현되었음을 보여줍니다.
- 그런데 covariance \(\Sigma\)를 그대로 최적화하기엔 무리가 있습니다. Covariance matrix는 positive semi-definite한 특성을 가져야 하는데요, 이런 특성을 만족하도록 제한하면서 gradient descent optimization을 하기는 어렵기 때문입니다. 논문에서는 트릭을 사용하는데요, covariance matrix를 Singular Vector Decomposition으로 eigendecomposition 하는 것부터 시작합니다. $$\Sigma = V L V^{-1}$$ 여기서 \(V\)는 rotation matrix로 볼 수 있고 \(\sqrt{L}\)은 scaling matrix로 볼 수 있습니다. $$\Sigma = R S S R^{-1} = R S S^T R^T = (R S) (R S)^T$$ 이렇게 표현된 covariance는 "unit covariance matrix를 가지는 데이터에 linear transformation \(R S\)를 적용했을 때, 그 데이터의 covariance"로 해석할 수 있기 때문에 기하학적으로도 의미 있는 값이 됩니다 [4]. 즉, rotation matrix와 scaling matrix를 위의 식대로 연산하여 구한 matrix는 covariance임이 보장됩니다. 따라서 gradient descent로 rotation matrix의 quaternion (4 parameters)과 scaling matrix의 main diagonal (3 parameters)을 업데이트 함으로써 covariance matrix를 업데이트 할 수 있습니다.
- 원본 (left), 랜더링 된 이미지 (middle), Gaussian을 60%로 축소하여 랜더링 한 이미지 (right)입니다. Right의 많은 빈 공간은 scene이 compact 하게 표현되었음을 보여줍니다.
- Opacity \(\alpha \in \mathbb{R}\): 불투명도를 결정합니다. Sigmoid가 적용되어 \([0, 1)\) 범위의 값을 가집니다.
- Color \(C \in \mathbb{R}^{3 l_{max}^2}\): 색을 결정합니다. 이때 Gaussian이 하나의 RGB 값을 가지는 것이 아니라 view direction에 따라 다른 RGB 값을 가질 수 있도록 Spherical Harmonics coefficients를 이용해 표현합니다 [2]. 어떤 물체의 색은 불변하지만 보는 방향에 따라 다르게 보이는 것을 모사한다고 보면 될 것 같습니다. 이런 view dependence를 고려하게 되면 non-Lambertian effects (e.g., 금속 재질의 표면에서 일어나는 반사)를 잘 표현할 수 있습니다.
- Spherical Harmonics (SH)는 구면좌표계에서 polar angle \(\theta\)과 azimuthal angle \(\phi\)을 입력으로 받아 구의 표면 위치에서의 값을 출력합니다. SH 함수는 아래와 같이 정의됩니다. 복잡하죠? $$Y_l^m(\theta, \phi) = \frac{(-1)^l}{2^l l!} \sqrt{\frac{(2l+1)(l+m)!}{4 \pi (l - m)!}} e^{im\phi}(\sin \theta)^{-m} \frac{d^{l-m}}{d(\cos \theta)^{l-m}}(\sin \theta)^{2l}$$ 수식의 의미를 알 것까진 없고, SH 함수가 두 개의 positive integers \(l\)과 \(-l \le m \le l\)로 결정된다는 것을 캐치하면 됩니다. 이때 하나의 \(l\)에 속하는 SH 함수들 (\(Y_l^{-l}, \cdots, Y_l^{l}\))을 묶어 band라고 합니다. 색을 SH로 표현한다는 말은 red, green, blue 각각을 SH 함수들의 linear combination으로 표현한다는 말과 같습니다.
-
- Band의 수 (\(l_{max}\))를 정하면 몇 개의 SH 함수를 사용할지가 정해집니다. \(l\) 번째 band에 \(2l - 1\) 개의 SH 함수가 있기 때문에 총 \(l_{max}^2\) 개의 SH 함수가 사용되고, 최적화할 SH coefficients도 \(l_{max}^2\) 개가 됩니다. 논문에서는 \(l_{max} = 4\) 를 사용했습니다.
Optimization
- 최적화는 gradient descent로 이루어집니다. 그 중에서도 Stochastic Gradient Descent (SGD)를 사용함으로써 표준 GPU 가속 프레임워크를 이용할 수 있었고, 일부 operations에 custom CUDA kernels [2, 3]을 적용했습니다.
- Gaussian Splatting에는 neural network가 없습니다. 딥러닝 논문에 익숙한 저에겐 생소해 적어둡니다. 최적화의 대상은 Gaussians의 파라미터들 (mean, covariance, opacity, and color)입니다. 따라서 새로운 입력이 들어올 때마다 최적화 단계를 거쳐야 합니다.
- Loss function은 \(\mathcal{L}_1\)과 \(\mathcal{L}_{\textup{D-SSIM}}\)으로 구성됩니다 (\(\lambda = 0.2\)). $$\mathcal{L} = (1 - \lambda) \mathcal{L_1} + \lambda \mathcal{L}_{\textup{D-SSIM}}$$
- 안정적인 최적화를 위한 테크닉이 일부 사용되었습니다.
- "warm-up"을 위해 4배 작은 resolution에서 시작해, 250과 500 iterations에서 두 배씩 키웁니다.
- SH coefficients는 view-dependent color를 표현하기 때문에 angular information의 부족에 취약합니다. NeRF같이 hemisphere의 거의 모든 각도에서 촬영한 이미지를 사용하면 괜찮지만 그렇지 않은 경우 zero-order component부터 틀려먹을 가능성이 있습니다. 이를 완화하기 위해 zero-order component만 최적화하는데서 시작해서 1000 iterations마다 band를 하나씩 늘려갑니다.
- Optimization을 몇 iterations나 돌릴지는 퀄리티와의 trade-off 관계에 있습니다. 7K 정도 돌리면 적당한 퀄리티를 얻을 수 있고, 30K를 돌리면 background까지 최적화되는 모습입니다. 첫 번째 scene의 경우 각각 5분과 35분이 걸렸고, 두 번째 scene의 경우 7K는 8분이 걸렸다고 합니다.
Adaptive Density Control
- Optimization으로 Gaussians의 모양, 위치, 색을 바꿀 순 있지만 개수까지 바꿀 순 없습니다. 어떤 Gaussian이 너무 넓은 영역을 커버하거나 (over-reconstruction), 하나의 Gaussian으로는 표현하기 힘들어 보인다면 (under-reconstruction) 더 많은 개수의 Gaussian으로 표현할 필요가 있습니다. 100 iterations마다 Adaptive Density Control을 통해 under-reconstruction이나 over-reconstruction이 발생한 Gaussian을 둘로 쪼개게 됩니다.
- Under-/Over-reconstruction을 판단하는 좋은 기준은 positional gradient가 크게 발생했는지 여부입니다. 큰 positional gradient가 발생했으면서 Gaussian의 크기가 작다면 under-reconstruction이, 크다면 over-reconstruction이라고 판단할 수 있겠습니다. 두 경우 모두 똑같은 Gaussian을 복사해 positional gradient만큼 이동시키는데요, over-reconstruction의 경우 원본과 복사한 Gaussian 둘 다 1.6배 축소시킴으로써 전체 volume을 유지시켜 줍니다.
-
- Opacity \(\alpha\)가 너무 작은 Gaussian은 삭제할 필요도 있습니다. 따라서 100 iterations마다 \(alpha\)가 작은 Gaussian은 삭제해 줍니다. 뿌옇게 보이는 구름이 둥둥 떠다니는 것처럼 보이는 floater 현상을 줄이기 위해 3000 iterations마다 \(\alpha\)를 0에 가까운 값으로 설정해 줍니다.
Why Faster than NeRF?
- Gaussian Splatting도 NeRF와 마찬가지로 랜더링을 위해서는 모든 pixels의 색을 각각 계산하는 과정이 필요합니다. 하지만 NeRF보다 가볍습니다. 그 이유는 무엇일까요?
- Gaussians를 공유하는 pixels에 대해서는 한 번의 2D projection만 하면 됩니다. 인접한 pixels일수록 같은 Gaussians를 공유할 가능성이 큽니다.
- NeRF의 경우 width x height x #sample 만큼의 MLP 연산이 필요하지만, Gaussian Splatting에서는 Gaussian이 그대로 사용됩니다. 따라서 ray sampling strategy를 고를 필요도 없습니다.
- NeRF에는 필요 없는 sorting 과정이 Gaussian Splatting에서는 필요하지만, frame당 한 번, GPU에서, differentiable custom CUDA kernels을 이용해 실행되기 때문에 빠릅니다.
Experiments
- 퀄리티 측면에서 SOTA인 Mip-NeRF360 [6]과 속도 측면에서 빠른 InstantNGP [1]와 Plenoxels [2]가 비교 대상으로 선정되었습니다.
- Gaussian Splatting이 메모리는 많이 먹는 편이지만 우수한 퀄리티와 학습 및 랜더링 속도를 확인할 수 있습니다.
- SfM의 도움 없이 100K uniformly random Gaussians로 시작해도 comparable한 PSNR scores를 얻을 수 있습니다 (첫 번째 표). 하지만 이것은 background가 없는 synthetic dataset의 결과였구요, real-world scene의 경우 background가 뭉개지고 floater 현상이 더 심해지게 됩니다 (두 번째 그림).
- Densification 중 split과 clone을 off 해보는 실험입니다. Split을 하지 않으면 background가 뭉개지고, clone을 하지 않으면 thin structure를 잘 표현하지 못하는 듯합니다.
- 상대적으로 앞에 위치한 \(N\) 개의 Gaussians만 최적화하는 것은 성능을 크게 악화시켰습니다 (왼쪽). Pulsar [7]에서 제안된 테크닉인데요, Pulsar보다 두 배 큰 \(N (=10)\)을 사용했지만 Gaussian Splatting에서는 통하지 않았습니다.
- Anisotropic covariance 또한 성능에 큰 영향을 미쳤습니다. Isotropic covariance를 사용할 경우 (i.e., scalar covariance) surface를 잘 표현하지 못하게 됩니다. 제일 왼쪽의 나무줄기를 자세히 보면 그 한계를 쉽게 확인할 수 있습니다.
Limitations
- Gaussian Splatting도 NeRF와 비슷한 문제를 가지고 있습니다. 많은 뷰에서 커버하지 못한 부분의 퀄리티는 떨어지구요, floater 현상도 여전히 있습니다. 심지어 GPU memory는 NeRF보다 몇 배는 더 필요합니다.
- 간단한 visibility 알고리즘을 사용하기 때문에 Gaussians의 순서가 갑자기 바뀌는 부분이 존재할 수 있습니다.
- Heuristic technique이 많이 사용됩니다. 실험적으로 정해진 값들이 많고, 안정적인 최적화를 위해 \(M\) iterations마다 해줘야 할 일들이 있습니다.
References
- Instant Neural Graphics Primitives with a Multiresolution Hash Encoding, SIGGRAPH'22
- Plenoxels: Radiance Fields without Neural Networks, CVPR'22
- Direct Voxel Grid Optimization: Super-fast Convergence for Radiance Fields Reconstruction, CVPR'22
- https://www.visiondummy.com/2014/04/geometric-interpretation-covariance-matrix/#Covariance_matrix_as_a_linear_transformation
- Revisiting Sorting for GPGPU Stream Architectures, PACT'10
- Mip-NeRF 360: Unbounded Anti-Aliased Neural Radiance Fields, CVPR'22
- Pulsar: Efficient Sphere-Based Neural Rendering, CVPR'21
'3D Vision' 카테고리의 다른 글
[논문리뷰] Grounding Image Matching in 3D with MASt3R, ECCV'24 (2) | 2024.10.16 |
---|---|
Structure from Motion of COLMAP (0) | 2024.08.12 |
[논문리뷰] DUSt3R: Geometric 3D Vision Made Easy, CVPR'24 (2) | 2024.06.10 |