本文說明如何拍攝影片或照片,採用開放原始碼的工具,透過高斯潑濺技術進行 3D 實景重建,並將建立好的模型發佈在網頁上。

高斯潑濺(又稱為高斯散射、3D Gaussian Splatting、3DGS)是一種目前很熱門 3D 實景重建與渲染技術,它比攝影測量法(photogrammetry)速度更快、效果更逼真,而且比神經輻射場(neural radiance fields,NeRF)更容易處理和互動。

拍攝影片或照片

高斯潑濺所需要的原始影像資料跟攝影測量法或神經輻射場非常類似,可以使用相機、手機或 GoPro 等設備,取得一系列符合以下原則的影像:

  1. 從不同角度拍攝足夠多的畫面,確保影像有足夠的覆蓋範圍,以便完整地重建場景、人物或物體。
  2. 確保每張影像之間有足夠的重疊(70–80%),也就是有足夠的相似性,以便構建重建模型。

實務上如果希望提升重建的品質,我們可以使用一些比較適合設備或技巧:

  • 廣角鏡頭可擴大覆蓋範圍與重疊區域,為模型提供更充分的數據以利重建。
  • 縮小光圈、拉開拍攝距離讓景深變深,使更多環境細節保持清晰,使模型能夠重建更多場景。
  • 縮短快門速度、調高 ISO 值,減少運動和相機震動造成的模糊,更有利於重建。
  • 手動設定白平衡或後製批次處理影像,讓影像色調保持一致。

這裡我使用 iPhone 手機內建的相機 app,使用錄影模式,在拍攝前對著目標長按後鎖定自動曝光與自動對焦。

iPhone 自動曝光/自動對焦鎖定

iPhone 自動曝光/自動對焦鎖定

如果是要針對一個特定物件進行拍攝,可以拿著手機以螺旋式的軌跡繞著物體進行拍攝,移動時不要太快,至少繞三圈以上,確保各種角度的畫面都有被清楚地拍攝到。

使用 Nerfstudio 自動重建

Nerfstudio 是一套用於神經輻射場的整合軟體環境,其包含各種重建過程中所需的工具,它同時也支援高斯潑濺的重建方法,因此若想要快速重建 3D 實景,使用這套軟體環境是最方便的。

Nerfstudio 的安裝方式有好幾種,若不想逐一安裝各種套件,可以採用 Docker 容器的方式執行,首先下載 Nerfstudio Docker 影像檔:

# 下載 Nerfstudio Docker 影像檔
docker pull ghcr.io/nerfstudio-project/nerfstudio:latest

接著建立一個專案目錄,並將 iPhone 拍攝的影片放在該目錄下的 input.mov

# 建立專案目錄
PROJECT_FOLDER=/home/$(whoami)/3dgs
mkdir -p ${PROJECT_FOLDER}

# 將 iPhone 拍攝的影片放在 ${PROJECT_FOLDER}/input.mov
mv /path/to/your_video.mov ${PROJECT_FOLDER}/input.mov

接著以互動是的方式啟動 Nerfstudio 的 Docker 容器,並將專案目錄掛載進 Docker 容器中:

# 以 Docker 容器執行 Nerfstudio
docker run --gpus all --rm -it \
    -u $(id -u) \
    -v ${PROJECT_FOLDER}:/workspace/ \
    -v /home/$(whoami)/.cache/:/.cache/ \
    -p 7007:7007 \
    --shm-size=12gb \
    ghcr.io/nerfstudio-project/nerfstudio:latest

接著就可以在 Nerfstudio Docker 容器中執行整套的高斯潑濺實景重建了,接下來的指令都是在 Nerfstudio Docker 容器中執行的。

高斯潑濺在重建時需要的是多張不同位置與角度的影像,所以我們要先使用 ffmpeg 從影片中抽取部份的影格,例如每隔三張抽取一張,再使用 COLMAP 這個工具透過運動推斷結構(Structure from Motion,SfM)方法算出稀疏點雲、相機位姿、相機內部參數等,這一些動作可以用 ns-process-data 來處理:

# 影像預處理(在 Nerfstudio Docker 容器中執行)
ns-process-data video \
    --data /workspace/input.mov \
    --num-downscales 0 \
    --num-frames-target 200 \
    --matching-method exhaustive \
    --output-dir /workspace

接著再使用 ns-train 進行高斯潑濺模型訓練:

# 進行 Nerfstudio's Gaussian splatting 模型訓練
export TORCHINDUCTOR_CACHE_DIR=/tmp/torchinductor
ns-train splatfacto \
    --data /workspace \
    --output-dir /workspace/splatfacto_outputs

在訓練的過程中,可以連到 http://localhost:7007 這個網址,使用 Nerfstudio 提供的網頁 viewer 查看目前的模型訓練情形,如果是在遠端的伺服器上進行訓練的話,可自己建立 SSH 通道將遠端的 7007 導回本地端觀看:

# 建立 SSH 通道
ssh -L 7007:localhost:7007 [email protected]

以下是 Nerfstudio 模型訓練 viewer 的畫面。

Nerfstudio 模型訓練 Viewer

Nerfstudio 模型訓練 Viewer

等訓練完成後,可以使用 ns-export 匯出高斯潑濺重建的結果,而 Nerfstudio 模型訓練的結果目錄預設會用時間來為命名,所以匯出時要自行指定想要匯出那一次的結果:

# 指定要匯出的結果目錄
OUTPUT_TIME=2026-08-10_103344

# 匯出檔案
ns-export gaussian-splat \
    --load-config /workspace/splatfacto_outputs/workspace/splatfacto/${OUTPUT_TIME}/config.yml \
    --output-dir /workspace/exports

匯出之後就可以得到一個高斯潑濺結果的 splat.ply 檔案,這個檔案就可以直接上傳至 SpperSplat 在網頁上觀看了,在 SpperSplat 上還可以進行進一步編輯,將周圍的雜訊去除。

使用 SpperSplat 編輯高斯潑濺場景

使用 SpperSplat 編輯高斯潑濺場景

再轉為 SOG 或 SPLAT 等其他格式,或是直接放在 SpperSplat 上分享:

SpperSplat 除了線上版本之外,也可以從 SuperSplat 的 GitHub 下載原始碼自己在本地端執行。

SplatTransform 高斯潑濺檔案轉換工具

SplatTransform 是另外一個高斯潑濺檔案轉換命令列(CLI)工具,適合用來對大量檔案進行批次處理。

首先安裝 SplatTransform 轉換器:

# 安裝 npm 套件管理程式
sudo apt install npm

# 安裝 SplatTransform
sudo npm install -g @playcanvas/splat-transform

使用 splat-transform 工具將 PLY 檔轉換為 SOG 檔:

# PLY 轉 SOG 檔案
splat-transform splat.ply splat.sog

# 查看檔案大小
ls -lh
total 71M
-rw-r--r-- 1 ubuntu root    65M Aug 12 09:14 splat.ply
-rw-rw-r-- 1 ubuntu ubuntu 5.9M Aug 12 11:14 splat.sog

將 PLY 檔轉換為 SOG 檔之後,檔案大小從原本的 65 MB 下降到 6.9 MB,非常適合放在網頁上。

參考資料