3D Gaussian Splatting
3D Gaussian Splatting (3DGS) は、scene を多数の 3D Gaussian primitive の集合として表現し、differentiable な splatting によって real-time に rendering する手法です。
Primitive の定義
各 Gaussian は、次の attribute を持ちます。
| Attribute | 意味 |
|---|---|
| 中心位置 | |
| 3x3 共分散行列 (positive semi-definite) | |
| Opacity | |
| View-dependent color (spherical harmonics) |
共分散は、回転 と scale を使って
と表されます。
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 との比較
| 観点 | NeRF | 3DGS |
|---|---|---|
| Representation | Implicit MLP | Explicit 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 された画像 と ground-truth 画像 の差を小さくします。代表的には、photometric loss と SSIM loss を組み合わせます。
ここで、 は二つの loss の重みです。 は pixel ごとの色の差を直接小さくし、DSSIM は局所的な構造やコントラストの一致を促します。この式の気持ちは、「色を合わせるだけではなく、画像としての見た目の構造も合わせたい」というものです。
Gaussian の共分散は、回転 と scale によって正定値になるように parameterize されることが多いです。
この形にしておくと、optimization 中にも共分散が自然な楕円体として保たれます。つまり、Gaussian の「向き」と「各方向の太さ」を別々に学習していると理解できます。
関連ページ
主なソース
- 3D Gaussian Splatting paper: https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
- 3DGS GitHub: https://github.com/graphdeco-inria/gaussian-splatting