Paper Review

[논문 리뷰] (SIGGRAPH 2023) 3D Gaussian Splatting for Real-Time Radiance Field Rendering

marmot_ai 2025. 1. 8. 20:04

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