目錄
- 3D Gaussian splatting 01: 環境搭建
- 3D Gaussian splatting 02: 快速評估
- 3D Gaussian splatting 03: 用户數據訓練和結果查看
- 3D Gaussian splatting 04: 代碼閲讀-提取相機位姿和稀疏點雲
- 3D Gaussian splatting 05: 代碼閲讀-訓練整體流程
- 3D Gaussian splatting 06: 代碼閲讀-訓練參數
- 3D Gaussian splatting 07: 代碼閲讀-訓練載入數據和保存結果
- 3D Gaussian splatting 08: 自建模型展示網頁
快速評估
以下使用 Inria 提供的數據集運行訓練過程, 驗證和評估重建效果, 數據輸入是一組靜態場景的圖像以及攝像機位置, 表示為稀疏的點雲, 通過colmap處理得到.
下載示例數據
在項目 GitHub 倉庫 的首頁找到 Running 部分, 能找到這個下載鏈接
You can find our SfM data sets for Tanks&Temples and Deep Blending here: https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/datasets/input/tandt_db.zip If you do not provide an output model directory (-m), trained models are written to folders with randomized unique names inside the output directory. At this point, the trained models may be viewed with the real-time viewer (see further below).
下載 tandt_db.zip 到本地並解壓縮. 這個數據集裏面帶了4個場景, 兩個室內的, 兩個室外的, 都是兩三百張圖片, 圖片比較小, 單圖幾百K到幾千K, 適合驗證測試.
每一個數據集, 都會包含一系列的目錄和文件, 其中input是原始圖片輸入, images 和 sparse 目錄是下一步訓練要用到的文件.
訓練
用 conda 啓用之前創建的 3dgs 環境, 然後在項目目錄下執行
python train.py -s [素材路徑]
# 例如
python train.py -s ./data/tandt/truck
如果要進行評估, 訓練時需要增加--eval參數
python train.py -s ./data/tandt/truck --eval
執行過程中可以通過 nvidia-smi 和 nvtop 查看GPU的情況, 可以看到運行的功率, 顯存的使用率, 推薦使用 nvtop, 可以實時監控. 訓練時間根據顯卡不同, 從十幾分鍾到一個多小時都有可能. 訓練的輸出目錄在 output 目錄下, 每次訓練都會隨機產生一個目錄名, 可以通過創建時間辨別.
在結果目錄中可以看到兩個目錄, iteration_7000 和 iteration_30000, 分別是迭代7000次和30000次的 point cloud 文件. 這個文件可以直接用於3D渲染.
一般來講, 迭代7000次之後的效果就已經接近最終效果, 而30000次迭代的訓練時間是7000次迭代的5-6倍, 如果想快速評估模型結果, 訓練時可以加上--iterations 7000參數讓其在7000次迭代後結束.
查看
快速查看可以用第三方的網頁工具, 例如 https://poly.cam/tools/gaussian-splatting, 可以註冊後免費上傳 ply 文件.
評估
用帶--eval訓練的模型結果, 分別對訓練使用的鏡頭進行渲染, 需要指定訓練結果路徑(在output下的隨機目錄名), 以及訓練的輸入數據
python render.py -m [訓練結果路徑] -s [素材路徑]
例如
python render.py -m ./output/89ea0caf-3 -s ./data/tandt/truck
會在訓練結果目錄下創建 train 和 test 兩個目錄, 分別對應訓練數據和測試數據, 每一組數據分 gt 和 renders 兩個目錄, 分別是素材原圖和渲染結果圖.
在渲染完成後, 計算渲染結果和原圖的 SSIM, PSNR 和 LPIPS
python metrics.py -m [訓練結果路徑]
例如
python metrics.py -m ./output/89ea0caf-3
如果訓練時沒有指定 --eval參數, 也沒有人工區分訓練集和測試集, render.py 產生的 test 目錄是空的, 執行上面的命令會產生空結果.
Scene: ./output/89ea0caf-3
Method: ours_30000
Metric evaluation progress: 0%| | 0/106 [00:00<?, ?it/s]Downloading: "https://raw.githubusercontent.com/richzhang/PerceptualSimilarity/master/lpips/weights/v0.1/vgg.pth" to /home/milton/.cache/torch/hub/checkpoints/vgg.pth
100%|█████████████████████████████████████████████████████| 7.12k/7.12k [00:00<00:00, 9.46MB/s]
Metric evaluation progress: 100%|████████████████████████████| 106/106 [02:31<00:00, 1.43s/it]
SSIM : 0.9513068
PSNR : 31.6362495
LPIPS: 0.0676759
高級選項
optimizer_type 訓練加速
這個功能是 2024年7月在核心模塊 diff-gaussian-rasterization 的 3dgs_accel 分支加入的.
默認的導出不帶這個選項, 要啓用此選項, 需要將之前安裝的 submodules/diff-gaussian-rasterization 模塊刪除,
pip uninstall diff_gaussian_rasterization
將模塊切換到 3dgs_accel 分支後重新 pip install,
$ cd submodules/diff-gaussian-rasterization/
$ git branch -a
* (HEAD detached at 9c5c202)
main
remotes/origin/3dgs_accel
remotes/origin/HEAD -> origin/main
remotes/origin/debug
remotes/origin/dr_aa
remotes/origin/fast_culling
remotes/origin/main
$ git checkout -b 3dgs_accel origin/3dgs_accel
$ cd ../..
$ pip install submodules/diff-gaussian-rasterization/
而後在訓練時, 可以使用參數 --optimizer_type, 可以指定default, sparse_adam兩種加速方式
python train.py -s /home/milton/WorkPython/data2/ --optimizer_type sparse_adam
- 4060Ti顯卡, 使用
sparse_adam參數實測速度提升明顯, 訓練時間只有未開啓加速的一半. 從顯卡功耗看, 比未開啓加速功耗增加20%. - P104-100顯卡, 使用
sparse_adam參數實測速度無明顯提升, 顯卡功耗無明顯變化.
猜測這個加速會充分利用GPU的並行處理, 會增加GPU功耗, 4060Ti在正常模式下温度僅到63度, 而P104-100在非加速情況下温度83度已經達到温度牆, 功率受到限制, 因此沒有提升.
antialiasing: 抗鋸齒
--antialiasing抗鋸齒選項是 2024年8月在核心模塊 diff-gaussian-rasterization 的 dr_aa 分支加入的. 來源於 mip-splatting 項目.
這個參數可以作用於訓練和查看, 實測在訓練中使用這個參數後效果反而變差, 邊緣尖刺增加. 在SIBR Viewer中查看時, 勾選此參數可以改善遠景的圖像質量.
問題
顯卡温度過高
長時間運行時, 建議控制顯卡GPU温度在75攝氏度以下. 如果在nvtop中温度超過75, 需要使用 nvidia-smi 限制顯卡頻率以降低功率.
通過 nvidia-smi 查看 GPU 温度設置
nvidia-smi -q -d temperature
輸出為
Attached GPUs : 1
GPU 00000000:01:00.0
Temperature
GPU Current Temp : 35 C
GPU T.Limit Temp : N/A
GPU Shutdown Temp : 96 C
GPU Slowdown Temp : 93 C
GPU Max Operating Temp : N/A
GPU Target Temperature : 83 C
Memory Current Temp : N/A
Memory Max Operating Temp : N/A
默認的 Target Temp 是 83, 設置 Target Temp 的命令是 sudo nvidia-smi -gtt [温度]. 在散熱不佳 GPU 温度過高時, 執行這個命令可以立即觀察到頻率的下降, 可以用這個命令給GPU降温.