一、引言
在計算機視覺和神經渲染領域,3D場景重建與渲染一直是熱門研究方向。近期,3D高斯散射(3D Gaussian Splatting)因其高效的渲染速度和優秀的視覺質量而受到廣泛關注。然而,當處理大型復雜場景時,這種方法面臨著內存消耗過大和訓練效率低下的問題。2024年,來自德國圖賓根大學自主視覺團隊(Autonomous Vision Group)開發的MIP-Splatting【CVPR 2024 Best Student Paper】提出了創新性解決方案,通過引入多尺度表示和興趣點策略,顯著提高了系統的性能和效率。
本文記錄了我對MIP-Splatting技術的完整復現過程,從理論基礎到環境配置,再到訓練測試,全面展示這項技術的優勢和實現細節。無論你是計算機視覺研究者,還是對三維重建感興趣的開發者,這篇博客都將幫助你理解并應用這一前沿技術。
該項目由德國圖賓根大學的自主視覺團隊(Autonomous Vision Group)開發,該團隊在計算機視覺、神經渲染和3D重建領域享有盛譽。主要團隊成員包括來自圖賓根大學和馬克斯·普朗克智能系統研究所的研究人員
該項目已在GitHub上完全開源,包括源代碼、預訓練模型和示例數據。
代碼庫:https://github.com/autonomousvision/mip-splatting
二、技術原理解析
2.1 3DGS簡介
3DGS是一種新型神經渲染技術,它使用3D空間中的高斯點云來表示場景。每個高斯點包含位置、旋轉、縮放和顏色信息,可以通過差分光柵化進行高效渲染。與傳統的神經輻射場(NeRF)相比,這種方法實現了數量級更快的渲染速度,同時保持了高質量的視覺效果。
2.2 MIP-Splatting核心創新
MIP-Splatting在3D高斯散射的基礎上,引入了兩個關鍵創新:
- 多分辨率表示(Multi-resolution Representation):類似于傳統圖形學中的MIP映射(Mipmapping),MIP-Splatting構建了多層級的高斯點表示。當觀察者距離場景較遠時,系統會使用低分辨率表示,減少渲染計算量;當觀察者靠近時,則采用高分辨率表示,保證細節質量。這種多尺度策略極大地提高了渲染效率。
- 興趣點策略(Interest Points):MIP-Splatting引入了興趣點檢測機制,自動識別場景中視覺上重要的區域,并在這些區域分配更多的高斯點,而在不重要的區域使用更少的點。這種自適應分配優化了內存使用和計算資源。
- 自適應優化(Adaptive Optimization):動態調整高斯點的分布和密度;智能分配計算資源,將更多資源用于視覺上重要的區域
2.3 技術優勢
MIP-Splatting相比傳統3DGS具有以下顯著優勢:
- 內存效率:在相同質量下,內存使用減少50-80%
- 訓練速度:訓練時間縮短40-60%
- 渲染質量:特別在遠距離場景中,質量顯著提升
- 可擴展性:能夠處理更大規模的復雜場景
2.4 優缺點分析
(1)優點
- 顯著降低內存需求,使大場景渲染更加實用
- 保持了實時渲染能力,同時提高了視覺質量
- 多分辨率表示使其更適合不同距離的渲染
- 完全開源,易于研究和擴展
(2)缺點
- 興趣點檢測可能需要額外的計算資源
- 多分辨率表示增加了實現的復雜性
- 對硬件要求仍然較高(需要現代GPU)
- 在極其復雜的場景中可能仍有優化空間
2.5 推薦測試數據集
MIP-Splatting作者推薦的測試數據集包括:
- NeRF 合成數據集:從 Google Drive 下載。
Google Drive 該地址貌似已經掛了,可以點擊以下鏈接從百度飛槳進行下載
https://aistudio.baidu.com/datasetdetail/136816下載并解壓縮nerf_synthetic.zip - Mip-NeRF 360 數據集:從 Mip-NeRF 360 下載,可能需額外請求某些場景。
- 自定義數據集:項目提供了處理自定義數據的工具
三、主要工作流程
3.1 初始化:從輸入圖像集合中重建初始點云(通常使用COLMAP)
3.2 興趣點檢測:分析場景,識別視覺上重要的區域
3.3 多分辨率構建:創建不同分辨率級別的高斯點表示
3.4 優化階段:
-
位置優化:調整高斯點的空間位置
-
外觀優化:優化顏色和不透明度
-
形狀優化:調整高斯點的形狀和方向
-
密度優化:根據場景復雜度動態調整高斯點密度
3.5 渲染:基于視點位置和方向,實時渲染場景
四、環境配置與安裝
2.1 硬件要求
在開始前,確保你的系統滿足以下硬件要求:
- CUDA兼容的GPU(建議至少8GB VRAM,理想為16GB+)
- 至少16GB系統RAM
- 充足的存儲空間(建議SSD)
我的測試環境是:
- 系統: Ubuntu 20.04 LTS
- RAM: 64GB
- GPU: NVIDIA GeForce RTX 4090(24GB VRAM)
2.1 環境配置
1、克隆倉庫
從 GitHub 克隆項目
git clone https://github.com/autonomousvision/mip-splatting.git
cd mip-splatting
2、創建虛擬環境
使用Conda創建獨立的虛擬環境是一個良好實踐,它可以避免依賴沖突并方便環境管理:
# 創建名為mip-splatting的conda環境
conda create -y -n mip-splatting python=3.8
conda activate mip-splatting
3、安裝依賴庫
安裝過程需要特別注意PyTorch與CUDA版本的匹配:
# 安裝PyTorch(確保與你的CUDA版本兼容)
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html
conda install cudatoolkit-dev=11.3 -c conda-forge# 安裝基本依賴
pip install -r requirements.txt# 安裝擴展庫
pip install submodules/diff-gaussian-rasterization
pip install submodules/simple-knn/
在安裝過程中,如果遇到PyTorch與CUDA版本不匹配的問題。解決方法是確認自己的CUDA版本(nvcc --version),然后安裝相應版本的PyTorch。
4 驗證安裝
安裝完成后,建議驗證環境是否正確配置:
python -c "import torch; print('CUDA available:', torch.cuda.is_available()); print('CUDA version:', torch.version.cuda); print('GPU count:', torch.cuda.device_count()); print('GPU name:', torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'None')"
如果一切正常,你應該能看到GPU信息和CUDA可用狀態。
還可以通過conda list 查看虛擬環境中所安裝的庫
環境配置完畢!!
五、數據集準備
5.1 準備NeRF合成數據集
為了初步測試系統功能,我首先使用了項目推薦的的數據集:
- NeRF 合成數據集:從 Google Drive 下載。
Google Drive 該地址貌似已經掛了,可以點擊以下鏈接從百度飛槳進行下載
https://aistudio.baidu.com/datasetdetail/136816下載并解壓縮nerf_synthetic.zip
tar -xvf nerf_synthetic.tar # 解壓文件
然后再項目目錄下新建一個data文件夾,將nerf_synthetic放在里面
mkdir -p data
mv nerf_synthetic data/
目錄結構如下圖所示:
mip-splatting/
├── data/
│ ├── nerf_synthetic/
│ │ ├── bonsai/
│ │ ├── chair/
│ │ └── …
│ ├── mipnerf360/ (可選)
└── …
5.2 NeRF合成數據集轉化
因為 mip-splatting 項目使用的是不同于 NeRF/Blender 的多尺度訓練數據格式,你必須先轉為它支持的目錄結構和 JSON 格式,否則訓練和渲染會出錯
5.2.1 原始 NeRF 數據集結構(如 nerf_synthetic/lego)
lego/
├── images/ ← 原始圖像
├── transforms_train.json
├── transforms_val.json
├── transforms_test.json
這種結構適用于 NeRF + instant-ngp + mip-NeRF 系列項目,但 mip-splatting 不能直接讀取
mip-splatting 不直接支持這種格式的原因是
它需要讀取:
-
多分辨率圖像(如 images_2, images_4)
-
metadata.json 中描述圖像 → 相機參數 → 分辨率
-
統一的路徑結構,如 d0/, d1/, d2/…
-
所以必須做格式轉換
5.2.2 數據集轉換
python convert_blender_data.py --blender_dir nerf_synthetic/ --out_dir multi-scale
- –blender_dir :nerf_synthetic/
指向原始 NeRF 數據所在的主目錄(例如 nerf_synthetic/lego) - –out_dir:multi-scale
指定輸出路徑,用于保存轉換后的 mip-splatting 格式數據
這行代碼可將NeRF 合成數據集(Blender 格式)轉換為 mip-splatting 所需的多尺度訓練格式。
將 nerf_synthetic/{scene} 下的數據(如 transforms_train.json, images/ 等),轉換為 multi-scale/{scene} 下的多尺度結構,包括 d0/, d1/, metadata.json 等。
如下圖所示:
六、訓練與評估
現在,可以使用官方數據集測試項目是否正常運行。
6.1 運行 NeRF 合成數據集(單尺度+多尺度訓練):
# single-scale training and multi-scale testing on NeRF-synthetic dataset
python scripts/run_nerf_synthetic_stmt.py
# multi-scale training and multi-scale testing on NeRF-synthetic dataset
python scripts/run_nerf_synthetic_mtmt.py
訓練結束后會分別生成單多尺度訓練文件夾,如下圖所示
七、在線查看
訓練后,可以將 3D 平滑濾波器與高斯參數融合在一起
python create_fused_ply.py -m {model_dir}/{scene} --output_ply fused/{scene}_fused.ply"
## 在這里我們使用了如下代碼
python create_fused_ply.py -m multi-scale/chair --output_ply fused/chair_fused.ply
會在fused目錄下生成chair_fused.ply文件
然后可以使用的在線3D查看器來可視化經過訓練的模型
八、自制數據集訓練【使用自制圖片數據集】
8.1 準備自己的圖片
(1)拍攝場景的多視角圖片:
- 拍攝 20-100 張照片,從不同角度覆蓋整個場景
- 保持適當的重疊度(相鄰圖片有約 60-70% 的重疊)
- 避免運動模糊和光照變化
- 使用高質量相機,保持固定焦距
(2)創建數據目錄結構:
# 創建目錄來存放圖片
mkdir -p data/3dgsdata/1/input
# 將您的圖片復制到這個目錄
cp /path/to/your/photos/*.jpg data/3dgsdata/1/input
8.2 使用 COLMAP 進行結構化數據處理
MIP-Splatting 需要使用 COLMAP 生成的相機參數和稀疏點云。以下是完整步驟:
(1) 安裝 COLMAP
#安裝依賴
sudo apt-get install git cmake ninja-build build-essential libboost-program-options-dev libboost-filesystem-dev libboost-graph-dev libboost-system-dev libeigen3-dev libflann-dev libfreeimage-dev libmetis-dev libgoogle-glog-dev libgtest-dev libsqlite3-dev libglew-dev qtbase5-dev libqt5opengl5-dev libcgal-dev libceres-dev# 下載colmap
git clone https://github.com/colmap/colmap.git
#進入文件夾
cd colmap
git checkout 3.7
#創建并進入build文件夾
mkdir build
cd build#構建安裝
cmake .. -GNinja #CMake預處理,生成Ninja構建系統所需的文件
ninja #默認使用系統最大可用cpu核心數進行編譯,如果系統cpu有32個核,等效與ninja -j32
sudo ninja install
(2)運行 COLMAP 處理
MIP-Splatting 提供了一個腳本來自動運行 COLMAP 并準備數據格式:
# 返回到 mip-splatting 目錄
cd /path/to/mip-splatting# 運行 COLMAP 數據處理腳本,為相機參數創建必要的文件
python convert.py -s data/3dgsdata/1 --resize# 參數說明:
# --s: 指定包含圖片的數據目錄
# --resize: 使用標志時,創建圖像的縮小版本(50%、25%、12.5%)
這個腳本會:
- 運行 COLMAP 的特征提取和匹配
- 執行增量式重建
- 轉換 COLMAP 輸出為 MIP-Splatting 所需的格式
- 生成訓練/測試分割
生成的文件夾目錄如圖所示
/path/to/your/images//input # Your original images/images # Original size images processed by COLMAP/images_2 # 50% scaled images/images_4 # 25% scaled images/images_8 # 12.5% scaled images/sparse # Camera parameters
8.3 訓練模型
1、單尺度訓練(STMT)
python train.py -s data/3dgsdata/1 -m output/1 --eval --kernel_size 0.1
## 參數意義
-s data/3dgsdata/1 設置輸入數據路徑。該目錄應包含 images/ 和轉換后的 transforms_train.json
-m output/1 設置模型輸出路徑。訓練中會將 checkpoint 和日志保存到該路徑下
--eval 每隔一段迭代自動執行一次測試(調用 render()),生成結果圖像和指標,如果不添加此參數,后續無法計算指標
--kernel_size 0.1 控制初始高斯點的半徑,影響點的體積。值越大表示點云分布越粗,越小越精細。推薦值 0.03~0.1
2、多尺度訓練
python train.py -s data/3dgsdata/1 -m output/1 --eval --load_allres --sample_more_highres --kernel_size 0.1
## 參數意義
-s data/3dgsdata/1 設置輸入數據路徑。該目錄應包含 images/ 和轉換后的 transforms_train.json
-m output/1 設置模型輸出路徑。訓練中會將 checkpoint 和日志保存到該路徑下
--eval 每隔一段迭代自動執行一次測試(調用 render()),生成結果圖像和指標,如果不添加此參數,后續無法計算指標
##額外多的參數
--load_allres 加載多分辨率圖像(如 images_2, images_4,這些來自 convert.py --resize)
--sample_more_highres 在訓練采樣中優先選擇更高分辨率的圖像,以增強高精細區域的學習效果--kernel_size 0.1 控制初始高斯點的半徑,影響點的體積。值越大表示點云分布越粗,越小越精細。推薦值 0.03~0.1
3、訓練效果對比
為了更大發揮模型性能,此處采用了多尺度訓練方式,如下圖所示:
Training progress: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 30000/30000 [14:50<00:00, 33.69it/s, Loss=0.0067375]
[ITER 30000] Evaluating test: L1 0.005026974682030933 PSNR 33.37032018389021 [14/04 19:31:06]
[ITER 30000] Evaluating train: L1 0.003797494899481535 PSNR 37.59125595092774 [14/04 19:31:06]
[ITER 30000] Saving Gaussians [14/04 19:31:06]
Training complete. [14/04 19:31:07]
real 15m2.915s
user 15m6.362s
sys 0m17.852s
8.4 模型渲染
# 渲染新視角,生成模型輸出圖像
python render.py -m output/1 --skip_train
## 參數介紹
python render.py 執行渲染腳本。該腳本讀取測試數據 + 已訓練模型,輸出渲染結果圖像
-m output/1 指定模型路徑
--skip_train 表示跳過訓練集圖像的渲染,僅對測試集進行渲染(節省時間和顯存)
no --skip_train 對訓練集和測試及都會進行渲染
## 代碼作用
使用路徑 output/1 下保存的模型,執行測試圖像的渲染過程,生成預測圖像(test_preds)和對應的 GT(ground truth)對齊圖像,用于后續評估(如 SSIM、PSNR、LPIPS)
會在 output/1/ 中生成如下內容:
output/1/
├── config.yml ← 模型配置文件
├── checkpoint_30000.pth ← 最終模型權重
└── test/└── ours_30000/├── test_preds_1/ ← 渲染預測圖像└── gt_1/ ← 對齊 ground truth 圖像(真實圖)
輸出圖像格式說明
每個測試視角圖像(如 00001.png, 00002.png)會保存兩份:
output/1/test/ours_30000/
├── test_preds_1/ ← 模型預測圖像
├── gt_1/ ← 對齊的 Ground Truth 圖像
這些將被 metrics.py 用于計算 SSIM / PSNR / LPIPS 等指標
運行代碼如下圖所示:
8.5 評估模型
# 指標評估
python metrics.py -m output/1
## 參數介紹
-m output/1 指定模型路徑
## 可選參數
-r 或 --resolution 默認-1 設置用于評估的分辨率等級:1 表示使用 images;2 表示 images_2;依此類推。-1 為自動匹配 默認優先選 test_preds_1/(即分辨率等級為 1 的圖像),會自動查找 ours_30000/ 目錄下的 test_preds_* 子文件夾,所以評估的是原始圖像分辨率下的結果,對應模型訓練時 d0
## 代碼作用
使用 output/1 中的測試結果圖像(test_preds 與 gt),計算圖像質量評估指標:SSIM、PSNR、LPIPS。
這是最終量化模型好壞的關鍵步驟,常用于論文報告與模型對比。
metrics.py 的工作流程
執行這條命令后會依次完成以下步驟:
(1)加載預測圖與 GT 圖:
-
從 output/1/test/ours_30000/test_preds_1/ 中讀取預測圖像
-
從 output/1/test/ours_30000/gt_1/ 中讀取對應的 GT 圖像
-
每對圖像都會被讀取為 tensor 并送入指標計算器
(2)計算三種指標:
-
SSIM(結構相似度)
-
PSNR(峰值信噪比)
-
LPIPS(感知圖像距離,加載 VGG 特征網絡)
各個指標含義詳解
輸出結果(控制臺 + 文件):
-
控制臺輸出:
Scene: output/1
Method: ours_30000
Metric evaluation progress: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:00<00:00, 11.17it/s]
SSIM : 0.9742036
PSNR : 33.3556633
LPIPS: 0.0743872 -
保存文件:
output/1/results.json:總體指標
output/1/per_view.json:每張圖像的指標值
8.6 后處理
(1)創建包含 3D 平滑參數的融合 PLY 文件:
2)使用在線查看器以交互方式瀏覽您的場景:
- 將融合 PLY 上傳到 [Mip-Splatting 在線查看器]
- 或者,如果已設置查看器,則在本地查看