Skip to main content

3D Gaussian Splatting

3D Gaussian Splatting (3DGS) は、scene を多数の 3D Gaussian primitive の集合として表現し、differentiable な splatting によって real-time に rendering する手法です。

Primitive の定義

各 Gaussian GiG_i は、次の attribute を持ちます。

Attribute意味
μiR3\mu_i \in \mathbb{R}^3中心位置
Σi\Sigma_i3x3 共分散行列 (positive semi-definite)
αi\alpha_iOpacity
ci\mathbf{c}_iView-dependent color (spherical harmonics)

共分散は、回転 R\mathbf{R} と scale S\mathbf{S} を使って

Σ=RSSR\Sigma = \mathbf{R}\mathbf{S}\mathbf{S}^\top \mathbf{R}^\top

と表されます。

Rendering

各 Gaussian は image plane に投影され、2D Gaussian として splatting されます。Front-to-back の alpha compositing で pixel color を計算します。

Rasterization は GPU に最適化されており、高解像度でも 60 FPS 以上が出ます。

Training

3DGS は、SfM (COLMAP) で得た sparse point cloud を初期化に使います。

Photometric loss を最小化しながら、

  • Densification: 表現が足りない領域に Gaussian を増やす
  • Pruning: 不要な Gaussian (低 opacity / 大きすぎる) を削除

を行います。

NeRF との比較

観点NeRF3DGS
RepresentationImplicit MLPExplicit primitive
Training数時間〜数十分
Rendering遅い (ray marching)Real-time (rasterization)
Editing難しい比較的容易
Geometry 抽出中程度表面が荒くなりやすい
Sparse view苦手苦手 (priors が必要)

弱点

  • COLMAP 失敗時は initial point cloud が崩れる
  • Specular / reflective surface が不安定
  • Sparse view では floaters が出やすい
  • Surface 抽出は別途研究が必要 (2D Gaussian Splatting)
  • Memory 使用量が大きい

数式で見る最適化 objective

3DGS の学習では、rendering された画像 I^\hat{I} と ground-truth 画像 II の差を小さくします。代表的には、photometric loss と SSIM loss を組み合わせます。

L=(1λ)I^I1+λLDSSIM(I^,I)\mathcal{L}=(1-\lambda)\|\hat{I}-I\|_1+ \lambda\,\mathcal{L}_{\mathrm{DSSIM}}(\hat{I},I)

ここで、λ\lambda は二つの loss の重みです。I^I1\|\hat{I}-I\|_1 は pixel ごとの色の差を直接小さくし、DSSIM は局所的な構造やコントラストの一致を促します。この式の気持ちは、「色を合わせるだけではなく、画像としての見た目の構造も合わせたい」というものです。

Gaussian の共分散は、回転 Ri\mathbf{R}_i と scale si\mathbf{s}_i によって正定値になるように parameterize されることが多いです。

Σi=Ridiag(si2)Ri\boldsymbol{\Sigma}_i=\mathbf{R}_i\operatorname{diag}(\mathbf{s}_i^2)\mathbf{R}_i^\top

この形にしておくと、optimization 中にも共分散が自然な楕円体として保たれます。つまり、Gaussian の「向き」と「各方向の太さ」を別々に学習していると理解できます。

関連ページ

主なソース