白話 3D Gaussian Splatting (3DGS) 與其後續進展
隨著深度學習技術的迅速發展,我們已不再滿足於僅僅對 2D 空間和文字的建模。2020 年,Neural Radiance Field (NeRF) 展示了類神經網路在隱式 3D 表示(implicit 3D representation)上的巨大潛力;而到了 2023 年,3D Gaussian Splatting (3DGS) 則採用了顯式(explicit)的 3D Gaussian 表示,並結合光柵化(Rasterization)渲染管線,提供了一種高效且易於解釋的 3D 場景建模方案。
3D Gaussian Splatting 不僅能以極快的速度生成新視角影像,其基於明確 3D Gaussians 的參數表示(如位置、尺度、形狀及視角依賴顏色)使得場景編輯與調整變得直觀且可控,並且更容易與現有的 3D 引擎直接整合。此外,3DGS 也為我們提供了一個很好的啟示:如何將傳統的 domain knowledge 與深度學習技術有機結合,從而突破現有方法的瓶頸。
文章難度:★★★☆☆
閱讀建議: 這篇文章會從基礎開始介紹 3DGS 的背景知識、基本運作方法與效果等,大約占文章前 2/3 篇幅,這部分會盡量深入淺出,避開太困難的數學細節;而後 1/3 篇幅會接著介紹一些 3DGS 近年的進步與應用,包含加速、壓縮、動態場景 modeling 與編輯等,這部分會是大概念地帶過,有需要深究請參考相關論文。
推薦背景知識:deep learning, ray tracing, rasterization, light field, neural rendering, novel view synthesis, 3D representation, neural radiance fields, Spherical Harmonics.
Background Knowledge for 3D Gaussian Splatting (3DGS)
3D Gaussian Splatting (3DGS) [1] 是屬於一種透過 3D Gaussians 作為 3D 表示 (3D representation),並進一步實現 Novel View Synthesis 的方法。
Novel View Synthesis (NVS)
Novel View Synthesis 指的是從有限數量的影像(或視角)推導出未觀測到的視角影像。在傳統上, NVS 可以由顯示(explicit)或隱式(implicit)的 3D representations (如 point cloud, mesh, voxel, SDF 等)進行 rendering 實現。
NVS 也可以不使用 3D representations ,直接使用影像插值達成,如 Light Field Rendering 或 View Morphing,但目前直接使用並不是主流作法。
3D Representations
3D 表示是用來描述三維空間中物體或場景的數學方法,主要可以從兩個維度來區分:
- 「表面表示」與「體積表示」,前者專注於物體的外部邊界,而後者描述整個空間中的屬性分佈;
- 「顯式表示」與「隱式表示」,顯式表示直接存儲具體的幾何數據(如頂點、邊、面或體素),而隱式表示則利用一個函數來隱式定義物體的幾何結構,通常能捕捉連續和平滑的細節。
3D Rendering
在 3D rendering 中,我們的目標是將描述 3D 物體或場景的表示轉換為 2D 影像。渲染方法一樣可以從兩個維度來區分:
- 根據 3D 表示的類型,可以分為「表面渲染(Surface Rendering)」與「體積渲染(Volumetric Rendering)」,前者直接利用物體表面資料進行渲染,而後者則對整個 3D 空間中的屬性進行積分合成;
- 根據計算方法,可分為 Ray Casting (or Ray Tracing) 與 Forward Rendering (e.g. Rasterization),其中 Ray Casting 透過從攝影機出發的射線採樣 3D 表示,而 Forward Rendering 則直接將 3D 幾何映射到 2D 像素上。
實際上在 Rendering 比較常聽到的名詞是 Ray Tracing 跟 Rasterization 。
NeRF (Neural Radiance Fields)
在 2020 年 NeRF [3] 透過使用類神經網路作為 implicit 3D representation ,將物體與場景的資訊,編碼 (encode) 進 MLP (multi-layer perceptron)中,在透過 ray tracing 進行 volume rendering 。
NeRF 在 NVS 上展現了非常強的成果,然而即使生成的影像品質極佳,但整體上受限於 ray tracing 本身的效率較 rasterization 差,再加上每次 ray tracing 都需要大量 inference encode 場景的 MLP ,這導致了畫面生成的效率不高。
3D Gaussian Splatting (3DGS)
3D Gaussian Splatting (3DGS) 是將 3D 場景透過 3D Gaussians (explicit 3D representation) 描述,可以直接透過 rasterization 進行 rendering。
此外,建構好的場景可以單純使用 3D Gaussians 描述,不需要再多次 inference 類神經網路。這使得 3DGS 擁有相當良好的效率。
Basic Format of 3D Gaussian
一個不帶有色彩的 3D Gaussian 是由中心點的 translation μ
、一組代表旋轉的 covariance matrix Σ
再加上不透明度 (Opacity) σ
組成。
Covariance matrix 一般在數學中描述為:
但由於 covariance matrices 只有在 positive semi-definite (PSD) 的情況下是有物理意義的,直接使用 gradient 訓練並不穩定。因此使用橢圓(ellipsoid) 來表示 3D Gaussian 的 covariance matrix 會是更穩定的做法,也就是:
- 四元數 (Quanterion): 用於表示三維空間裡的旋轉,也就是這 ellipsoid 的旋轉,透過 normalize 就可確保正確性。
- Scale: ellipsoid 三軸的 scale 。
Complete Format of 3D Gaussian
實際上生成圖片時,同一個物體在不同視角下會有不同的顏色顯現。
在 3DGS 的方法中,可以簡單對每個 3D Gaussian 設定一個顏色,然後用多個 Gaussians 堆出不同視角的顏色。但這個方法是低效率的,實際上更常使用的是用球諧函數(Spherical Harmonics, SH)來表示不同視角下的情況。
Spherical Harmonics 是拉普拉斯方程式的球坐標系形式解的角度部分。在古典場論、量子力學等領域廣泛應用。這聽起來很複雜,可以先簡單理解兩點:
- SH 形成定義在單位球面上的一組完備且正交的基函數,因此任何定義在球面上的函數都可以展開為 SH 的線性組合。
- 在球面上定義的任何函數(如光照分佈、反射特性等)都可以用 SH 來近似表示。
因此,考慮視角與顏色的 Gaussian 的基本組成可以表示為:
Workflow of 3DGS
整體上 3DGS 的優化流程可以簡單粗分為三個步驟:
- 透過 Structure from Motion (SfM) 或類似演算法 (e.g. Colmap)得到 sparse point cloud。
- 利用 sparse point cloud 初始化 3D Gaussians。
- 使用已知的相機參數與圖片匹配 (來自SfM 或其他演算法) ,透過可微分的 renderer (e.g. tile rasterizer) 生成圖片,並計算與真實圖片之間的 error 。
一旦整個空間中的 3D Gaussians 被優化好,就可以直接使用 Rasterization 對所有的 3D Gaussians 進行任何視角的 rendering 。
在原始的 3DGS 論文中,其實是沒有類神經網路的存在。但方法還是依賴梯度下降來更新高斯參數,因此通常還是會使用深度學習框架進行實作。
此外,某些後續研究還是有導入類神經網路,以克服一些顯示表示的問題,因此也不是所有 3DGS 中都沒有類神經網路。
Adaptive Control of Gaussians (Densification)
在 3DGS 原始論文中,每個 3D Gaussian 初始化時的設定是:
- 透過 SfM 初始化高斯點的數量與位置。
- 每個 3D Gaussian 都是 isotropic(在每個方向上的擴散程度是相同的),scale 設定為最近的三個點之間的距離平均。
在優化過程中,可能會因為 3D Gaussians 的初始化不好導致無法有效地表示場景。這可以細分為兩個情況:
- Under-reconstruction: 過少的高斯點不足以描述細節;
- Over-reconstruction: 過大的高斯無法區分細節。
針對這兩個情況,原始論問題使用的方法稱為 adaptive control of Gaussians (densification)。作法是透過檢查每個高斯對應區域在 view-space 中的位置梯度的平均值,即位置隨視角變化的平均速率,如果超過特定閥值,就會進行 densification。
- Under-reconstruction: 複製現有小型 Gaussian 並沿位置梯度移動。
- Over-reconstruction: 將覆蓋範圍過大的 Gaussian 分裂成兩個較小的 Gaussian (縮小尺度),根據原分布作為 PDF 采樣兩個新位置。
Why Rasterization Fast
Ray tracing 的原理可以用眼睛看物體來解釋。我們眼睛之所以看的到物體,是因為有光源打到了物體,然後反射進我們的眼睛。而 ray tracing 的想法其實就是反推這個射線,從相機中心發出射線,與物體相交就根據規則反射、折射或吸收,直到遇到光源或者走太遠停住。
而 3DGS 使用的則是 Rasterization,是將 3D 物件的幾何輪廓投影到影像平面後,切割成 2D 像素網格,或者可以直接想像把物體砸到成相平面上。因為 Rasterization 可以透過矩陣運算進行批次計算,搭配上 GPU 硬體設計利於 Rasterization,且長期進行了深度優化,這讓他的計算相當有效率。
Ray tracing 雖然因為能夠模擬物理光線的傳播,提供更高的渲染真實感,但計算開銷極高,通常需要加速結構 (如 BVH, KD-tree) 來提升效率。即使現在的 GPU 也為了 ray tracing 做的大幅優化,但效率還是遠不及 rasterization。
General Performance of 3DGS
在 3DGS 論文提出時,除了在 inference 達到了極高的速度外,在收斂 (訓練時間) 也展現了比當時收斂速度較快的 NeRF-based 方法更短的收斂時間 (不考慮 SfM 的時間)。
Improvements for 3DGS
在 2023 年 3DGS 提出後,不只大量的研究聚焦於 3DGS,同時也有五花八門的實際應用建立在 3DGS 的基礎上。這些都是來自 3DGS inference 的高效率,使得 real-time 應用變的可能。
雖然 3DGS 取得了相當大的成功,但其實還是有些潛在問題或是未完成的延伸研究。先撇除不同 NVS 方法都會遇到的問題(如視角缺乏下的表現),這邊會針對 3DGS 方法的記憶體問題討論優化方法。並針對延伸應用,如動態場景表達、編輯場景等進行討論。
Accelerating & Compressing 3DGS
雖然 3DGS 本身速度就已經很快了,但其實還有許多方法可以讓 3DGS 變得更有效率。而更重要的是,3DGS 在大型或複雜場景下,因為需要相當大量的 3D Gaussians 來描述 3D 場景,因此記憶體的消耗是比較大的。
有幾個直覺地方法可以加速並減少記憶體的消耗:
- Compact 3DGS [5]: 利用壓縮技術對 3D Gaussian 的參數進行壓縮,如 bit quantization。
- Vector Quantization for 3DGS [6]: 利用 K-means 算法將每個 Gaussian 的關鍵參數(例如位置、尺度、協方差矩陣以及其他特徵)映射到一個有限的 cook book 中,減少不同 3D Gaussians 的種類數。
- Pruning for 3DGS [7]: 評估每個 Gaussian 對最終渲染效果的貢獻,識別出那些在全局場景重建中意義較低的 Gaussians 並移除。
Editing with 3DGS
雖然說 3DGS 是 3D 的顯示表示,可以直接透過工具進行編輯。但實際上還是會期望能夠透過 generative 或是 multi-modality 的方法,讓編輯變得更加簡單。具我目前所知,3D content 的編輯的研究比起 2D 圖像來的前期許多,這是個有許多未知可探索的領域。
目前主要的方法是依賴 2D 圖像相關的演算法,如透過 Segmentation Anything [8] 獲得更多元的 2D 資訊,並搭配 2D 圖像生成演算法 [9],再將這些結果投影到 3D 去進一步獲得 3D semantic 資訊或調整 3D Gaussians。這類方法的共同問題是不同 2D 視角的演算法預測或生成圖片存在 consistency 問題,因此許多相關論文都會提出一些因應的特別優化 [10]。
Dynamic Scene with 3DGS
不論是 3DGS 或是 NeRF,其本質都是在對 3D 場景進行 modeling。在順利地收斂後,可以生成不同角度的 2D NVS。但如果想要生成連續影像(影片),那就必須考慮到時間的維度了。換句話說,這就會是四個維度的問題 (X, Y, Z, T)
。
一個直覺的方法是直接在不同 timestamp 都優化 3D Gaussians,但這個做法實際上相當沒有效率,也很容易會破壞時間上的連續性。其中一個合理的作法是交給網路去 encode 這樣的連續 function,這也是 4D NeRF 的主流作法之一。
在 4D Gaussian Splatting [11] 論文中不同的 timestamp 原則上共用一個基本的 3D Gaussian,再使用輸入為 (x, y, z, t)
的 MLP 預測每個 3D Gaussian 的相對變化(如位移量)。在輸入的部分為了避免 4D 輸入過於龐大,也參考了 HexPlane [12] 與 KPlane [13]的方法將 4D 資訊分解為多個 2D 資訊。整體上在保持精度與速度的同時,大幅降低了記憶體用量,是個值得參考的方向。
在 2023 年 3DGS 提出後,受惠於其高效率的 inference 機制,可以看到大量的 3D 應用使用 3DGS 作為基礎。實際上,3DGS 並不僅僅是一個可以用於 NVS 的方法,他的 explicit 3D representations 使得他未來在可調整、可解釋性、甚至與既有的物理引擎結合的可行性非常的高。這也提醒了所有在做深度學習的人,
並不是所有難以 modeling 的題目都該直接使用類神經網路來 modeling,結合 domain knowledge 或許才是現階段通向可信任應用的路。
好了~這篇文章就先到這邊。如果覺得這篇文章還是有些艱澀,讀完覺得無法理解 3DGS 基本概念的話,也相當推薦看以下這兩部影片學習。
老話一句,Deep Learning領域每年都會有大量高質量的論文產出,說真的要跟緊不是一件容易的事。所以我的觀點可能也會存在瑕疵,若有發現什麼錯誤或值得討論的地方,歡迎回覆文章或來信一起討論 :)
Related Topics
Reference
僅列舉部分論文與方法,並省略人名細節以利網路閱讀。
[1] 3D Gaussian Splatting for Real-Time Radiance Field Rendering [SIGGRAPH 2023]
[2] Advances in Neural Rendering [Computer Graphics Forum 2022]
[3] NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis [ECCV 2020]
[4] Structure-from-Motion Revisited [CVPR 2016]
[5] Compact 3D Gaussian Representation for Radiance Field [CVPR 2024]
[6] Compressed 3D Gaussian Splatting for Accelerated Novel View Synthesis [CVPR 2024]
[7] LightGaussian: Unbounded 3D Gaussian Compression with 15x Reduction and 200+ FPS [NeurIPS 2024]
[8] Segment Anything [ICCV 2023]
[9] Sdxl: Improving latent diffusion models for high-resolution image synthesis [ICLR 2025]
[10] View-Consistent 3D Editing with Gaussian Splatting [ECCV 2024]
[11] 4D Gaussian Splatting [CVPR 2024]
[12] Hexplane: A fast representation for dynamic scenes [CVPR 2023]
[13] K-planes: Explicit radiance fields in space, time, and appearance [CVPR 2023]
[14] Tutorial: Efficient Gaussian Splatting | CVPR 2024 [YouTube]
[15] 3D 重建技術 (三): 3D Gaussian Splatting,讓 3D 重建從學術走向實際應用的革新技術!用彩色橢圓球球表示場景![YouTube]