[논문 리뷰] (SIGGRAPH 2023) 3D Gaussian Splatting for Real-Time Radiance Field Rendering
https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
3D Gaussian Splatting for Real-Time Radiance Field Rendering
[Müller 2022] Müller, T., Evans, A., Schied, C. and Keller, A., 2022. Instant neural graphics primitives with a multiresolution hash encoding [Hedman 2018] Hedman, P., Philip, J., Price, T., Frahm, J.M., Drettakis, G. and Brostow, G., 2018. Deep blending
repo-sam.inria.fr
NeRF와 같이 camera pose가 주어지면 novel view synthesis하는 태스크를 푼 연구입니다.
"We introduce three key elements that allow us to achieve state-of-the-art visual quality while maintaining competitive training times and importantly allow high-quality real-time (≥ 30 fps) novel-view synthesis at 1080p resolution."
3D gaussian splatting은 퀄리티와 효율성을 획기적으로 개선했고, 이후에 다양한 태스크에 3dgs를 적용하는 논문이 수없이 많이 나오고 있습니다.
이를 가능하게 한 main contribution은 아래와 같습니다.
1. 3D Gaussians으로 scene representation
- 기존 NeRF 기반 방법들처럼 SfM에서 얻어진 camere pose가 input으로 사용됨
- 특히, SfM의 산출물인 sparse point cloud로 3D Gaussians을 initialize함
2. 3D Gaussians을 optimization하는 adaptive density control 방법 제안
3. Tile-based rasterization을 통해 real-time rendering 가능
Differentiable 3D Gaussian Splatting
3D Gaussian 개념을 사용한 이유는 differentiable (미분 가능)하고, 2D splat으로 projection하기 쉽고 렌더링을 위한 빠른 $\alpha$-blending이 가능하기 때문입니다.
본 논문에서 사용하는 3D Gaussian은 다음과 같이 정의됩니다.
이때, 가우시안은 아래와 같이 3D covariance matrix $\Sigma$로 표현됩니다.
$$G(x)=e^{-\frac{1}{2}(x)^T \Sigma^{-1}(x)}$$
가우시안의 평균은 SfM의 point cloud로 초기화되고, 공분산은 learnable parameter입니다.
3D 가우시안은 그대로 사용되지 않고, 렌더링을 위해 2D 가우시안으로 projection됩니다.
world -> camera 변환을 위한 viewing transformation $W$,
camera -> image 변환을 위한 projectve transformation의 Jacobian $J$를 사용하여
다음과 같이 2D 가우시안으로 projection됩니다.
$$
\Sigma^{\prime}=J W \Sigma W^T J^T
$$
뒤에 Transpose가 붙는 이유는 symmetric하게 만들기 위함이라고 합니다.
$\Sigma^{\prime}$에서 앞에 2x2만 추출하면 기존 point-based 방법들에서 사용하는 planar point + normal과 같은 의미를 갖게 됩니다.
3D Covariance $\Sigma$를 바로 optimize해서 학습하면 좋겠지만, covariance matrix는 positive semi-definite (모든 값이 양수)여야 하는데, gradient descent로 모델을 학습하면 이 조건이 지켜지지 않기 때문에 covariance matrix를 scaling matrix S와 roataion matrix R로 표현합니다.
$$
\Sigma=R S S^T R^T
$$
S, R은 learnable parameter로써 따로 optimize됩니다.
R은 실제로는 쿼터니언 (q)으로 표현되고, q를 normalize하여 사용합니다.
Optimization with Adaptive Density Control of 3D Gaussian
이전까지는 3D Gaussian을 어떻게 표현하는지를 설명했고, 이 파트에서는 3D Gaussian을 어떻게 학습하는지에 대한 내용을 설명합니다.
Trainable parameter는 다음과 같습니다:
position $p$, 투명도 $\alpha$, covariance $\Sigma$, color $c$
이 parameter들을 optimize하는 과정과 gaussian의 density (=개수)를 control하는 과정이 섞여있기 때문에
이 논문에서는 "interleaved adaptive density control"이라는 표현이 자주 사용됩니다.
Optimization
SfM으로 초기화된 point clouds (= geometry = gaussian)은 정확하지 않기 때문에,
geometry를 create, destroy, move하는 과정이 필요합니다.
각 trainable parameter에 대한 조금 디테일한 설명들이 논문에 나와있습니다.
$\alpha$는 [0,1) 값을 갖고 smooth gradient를 얻도록 sigmoid activation을 사용하고,
scale $S$도 비슷한 이유로 exponential activation을 사용하고,
$\Sigma$는 가장 가까운 세 점까지의 거리의 평균이 되는 isotropic Gaussian으로 초기화하고,
$p$에는 exponential decay scheduling을 적용합니다.
Loss function은 L1 loss와 D-SSIM loss를 사용합니다.
$$
\mathcal{L}=(1-\lambda) \mathcal{L}_1+\lambda \mathcal{L}_{\mathrm{D}-\mathrm{SSIM}}
$$
Adaptive Control of Gaussian
위에서 설명한 것처럼 SfM으로 초기화된 point clouds (= geometry = gaussian)은 정확하지 않기 때문에,
geometry를 refine하는 과정이 필요합니다.
100 iteration마다 Remove, Split, Clone 과정을 진행합니다. Pseudo code에서 주황색 박스 부분을 보면 이해할 수 있습니다.
1) Remove: opacity $\alpha$가 threshold $\epsilon_{\alpha}$보다 낮으면 투명해서 object가 없는 부분으로 간주하고 제거합니다.
Gaussian이 너무 적은 범위 또는 너무 큰 범위를 차지하고 있는 경우도 수정해주어야 합니다.
논문에서는 두 경우 모두 잘 recon되지 않았기 때문에 view-space positional gradient가 크다는 것을 확인했습니다.
2) Clone: 가우시안의 Scale이 작은 경우 (=under reconstruction), 같은 크기의 가우시안을 복사해서 gradient 방향에 둡니다.
3) Split: 가우시안의 Scale이 큰 경우 (=over reconstruction), 두 개의 가우시안으로 쪼개고, 각각의 크기를 1.6배 줄입니다. 쪼갠 가우시안의 위치는 원래 가우시안에서 PDF로 샘플링합니다.
즉, Clone은 가우시안의 개수와 volume이 모두 증가하고 & Split은 개수는 증가하지만 전체 volume은 유지됩니다.
추가로 3000 iteration마다 opacity $\alpha$를 0으로 초기화하여 카메라 근처에 떠다니는 floater들을 제거할 수 있었다고 합니다.
Fast Differentiable Rasterization for Gaussians
이 부분은 코드로 봐야겠다..
Experiments