3D Gaussian Splatting (GS) — Technique of 3D Scene Reconstruction

Jeremy Pai
Life’s a Struggle
6 min readJun 1, 2024
Splats of Yellow Duck Scene! The background is my living room :)

Gaussian Splatting (GS) 在這兩年獲得了許多關注,除了場景重建的效果不錯之外,在訓練以及 Rendering 的速度都有顯著的提升。

Gaussian Splatting 想法上是用 3D Gaussians 描述場景,也因為 Gaussians 是可微分且容易透過 Point-based Rendering 的技術取得 Rendered Image。綜合以上好處,使得 Gaussian Splatting 能夠有較快的訓練速度。

場景重建先前最具代表性的技術是 NeRF (Neural Radiance Fields) 以及此技術的加強版,與 Gaussian Splatting 背後的技術原理完全不同。底下簡易列出幾個不同點,其實主要的差異與 Explicit Representation、Implicit Representation 有關:

Gaussian Splatting Workflow

  • SfM Points:實作上經常會透過 COLMAP 處理輸入的影像 (會經過 SfM [Schönberger and Frahm 2016] 的算法處理),得到 camera pose 以及 point cloud。這邊的過程與 NeRF 以及該技術的加強版是一樣的
  • Initialization:將 point cloud 每一個 point 替換成 3D Gaussians
  • Optimization / Training:經由一系列的優化調整 3D Gaussians 的參數,並且透過一些條件對 3D Gaussians 的密度做動態調整
  • Rasterization:這個部分比較複雜,推薦搭配 A Survey on 3D Gaussian Splatting 的圖比較容易理解。首先會將影像分成好幾個區塊 (tile),再將 3D Gaussians 投影到影像平面上。觀察這些 Gaussians 會碰到哪些區塊並分別標上記號、做排序,最後依據排序結果混合成最後的 Rendered Image。
A Survey on 3D Gaussian Splatting

上面的內容說的比較簡易,如果想要了解更多的話,可以參考 paper:

拍攝重點注意

我想要完整的試試看整個場景重建的流程,畢竟過去沒有實際操作的經驗。整個流程跑下來,我覺得前期的影像拍攝還滿重要的,會大大的影響最後場景重建的結果!

輸入是一段影片

如果是用一段影片記錄整個場景的話,記得拍攝時放慢一點,確保每一幀影像是清楚的、解析度是高的。

再來會透過 FFmpeg 將影片依據自己設定的格式轉成一堆影像。例如透過 FPS 的設定,可以增加或減少影像的數量。

ffmpeg -i {video} -qscale:v 1 -qmin 1 -vf fps={fps} %d.jpg

輸入是一堆影像

經驗上告訴我,如果沒辦法確保錄影過程中每一幀的影像品質都是高的話,拍照會大於錄影,避免影像都是模糊的。

有朋友告訴我拍攝手法可以依據上中下三個位置,分別拍攝上中下角度 (角度約間隔 15 度),這樣總共 9 張,再換到下一個位置繼續。這樣的流程可以讓整個場景拍攝的角度是豐富的。

底下的影片是自己拍攝影像,再透過原文作者的 GitHub codes 完成資料轉換、訓練場景重建以及可視化的步驟。我有將原影像壓縮上傳到我的 GitHub,有興趣可以看看。

我覺得主要是我拍攝是用手機,加上不是專業攝影師,所以也很常手抖。因此整體的影像品質不能說是很高的。但至少整體來說,我還是可以看出這是一隻在我桌上的黃色小鴨。

即便最後場景重建的效果不能說是很好,推斷這應該是與我拍攝的影像品質並不是那麼好有關... 可能需要思考是不是需要用到更好的相機或是優化拍攝手法,得到更高品質的影像。

最後想說明一下,要透過 Gaussian Splatting 實現場景重建其實有個很大的問題... 就是需要強大的 GPU!而且依據 paper 的說明,GPU RAM 至少要有 24 GB 比較保險,我的影像比較少,印象中整體不超過 18 GB。再來因為訓練完的場景要記錄所有 3D Gaussians,因此需要的儲存空間也比較大。總結來說,要試試 Gaussian Splatting 就會需要足夠好的硬體配置,這邊的話我會推薦去用 Colab,但免費版的應該還是不足以訓練,需要至少 L4 或是 A100 才可以。

關於 Gaussian Splatting 的未來發展,我覺得除了硬體上的限制之外,再來就是對於使用者要重建的場景,實際上會需要多少拍攝角度、多少影像這其實是未知的,只能說是越多越好。這個問題對我來說會是 3D 場景重建領域最需要解決的問題之一。

題外話

底下是我輸入 Prompt 讓 DALL·E 生成影像的結果,還挺有趣的~

“Gaussian Splatting uses millions of 3D Gaussians for explicit scene representation, and it’s capable of real-time rendering”

--

--

Jeremy Pai
Life’s a Struggle

機器視覺演算法工程師~不限主題隨心寫下自己想寫的事物