3D Gaussian Splatting 代码复现实战:Ubuntu 20.04 + RTX 4090 环境配置与 30 分钟训练指南
1. 环境准备与依赖安装
在开始3D Gaussian Splatting的代码复现之前,确保你的系统满足以下硬件和软件要求:
- 操作系统:Ubuntu 20.04 LTS
- GPU:NVIDIA RTX 4090(24GB显存)
- CUDA:11.8
- Python:3.8或更高版本
- PyTorch:2.0+
1.1 安装系统依赖
首先更新系统并安装基础开发工具:
sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential git cmake libopenexr-dev libxi-dev libglfw3-dev libglew-dev libomp-dev libxinerama-dev libxcursor-dev1.2 配置CUDA和cuDNN
对于RTX 4090显卡,推荐使用CUDA 11.8:
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run sudo sh cuda_11.8.0_520.61.05_linux.run安装完成后,将CUDA添加到环境变量:
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc验证CUDA安装:
nvcc --version1.3 安装Anaconda和Python环境
创建并激活conda环境:
wget https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh bash Anaconda3-2023.03-Linux-x86_64.sh source ~/.bashrc conda create -n gsplat python=3.8 -y conda activate gsplat2. 代码获取与编译
2.1 克隆仓库
git clone --recursive https://github.com/graphdeco-inria/gaussian-splatting.git cd gaussian-splatting2.2 安装Python依赖
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install plyfile tqdm pip install submodules/diff-gaussian-rasterization pip install submodules/simple-knn2.3 编译可视化工具
cd SIBR_viewers cmake -Bbuild . -DCMAKE_BUILD_TYPE=Release cmake --build build --target install --config Release cd ..3. 数据准备与预处理
3.1 下载示例数据集
mkdir -p data wget https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/datasets/input/tandt_db.zip -P data unzip data/tandt_db.zip -d data3.2 使用COLMAP进行场景重建
安装COLMAP:
sudo apt install -y colmap运行重建:
python convert.py -s data/tandt_db --colmap_executable /usr/bin/colmap4. 模型训练
4.1 训练脚本解析
核心训练命令如下:
python train.py -s data/tandt_db -m output/tandt_db关键参数说明:
-s: 输入场景路径-m: 模型输出路径--iterations: 训练迭代次数(默认30,000)--resolution: 图像分辨率缩放因子
4.2 快速训练配置
对于RTX 4090显卡,可以使用以下优化配置实现30分钟快速训练:
python train.py -s data/tandt_db -m output/tandt_db \ --iterations 7000 \ --resolution 2 \ --densification_interval 100 \ --opacity_reset_interval 300 \ --position_lr_init 0.00016 \ --position_lr_final 0.0000016 \ --scaling_lr 0.005 \ --rotation_lr 0.0014.3 训练过程监控
训练过程中会输出如下信息:
Iteration 1000: Loss=0.123, PSNR=25.6, SSIM=0.92 Densifying: Added 1242 gaussians, Removed 312 gaussians关键指标说明:
- Loss: 综合损失值(L1 + DSSIM)
- PSNR: 峰值信噪比(越高越好)
- SSIM: 结构相似性(越接近1越好)
5. 结果可视化与导出
5.1 实时可视化
./SIBR_viewers/install/bin/SIBR_gaussianViewer_app -m output/tandt_db可视化界面支持以下操作:
- 鼠标拖动旋转视角
- WASD键移动摄像机
- 空格键重置视角
5.2 导出为点云格式
import torch from scene import GaussianModel gaussians = GaussianModel(3) gaussians.load_ply("output/tandt_db/point_cloud/iteration_7000/point_cloud.ply") # 访问高斯参数 positions = gaussians.get_xyz() colors = gaussians.get_features() opacities = gaussians.get_opacity() scales = gaussians.get_scaling() rotations = gaussians.get_rotation()5.3 渲染视频序列
python render.py -m output/tandt_db --skip_train --skip_test6. 性能优化技巧
6.1 内存优化配置
针对RTX 4090的24GB显存:
# 在train.py中添加以下配置 pipe = PipelineParams( densify_prune_iter = [500, 3000, 7000], densify_grad_threshold = 0.0002, densify_size_threshold = 20, max_gaussians = 500000 # 控制最大高斯数量 )6.2 混合精度训练
修改训练循环以启用AMP:
scaler = torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): render_pkg = render(viewpoint_cam, gaussians, pipe, background) image = render_pkg["render"] loss = (1.0 - opt.lambda_dssim) * l1_loss(image, gt_image) + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()6.3 自定义数据加载
高效数据加载示例:
from torch.utils.data import Dataset, DataLoader class GaussianDataset(Dataset): def __init__(self, scene_path): self.cameras = scene.getTrainCameras() self.loaded_images = [None] * len(self.cameras) def __getitem__(self, idx): if self.loaded_images[idx] is None: cam = self.cameras[idx] img = load_image(cam.image_name) # 自定义图像加载函数 self.loaded_images[idx] = img return self.cameras[idx], self.loaded_images[idx] dataset = GaussianDataset("data/tandt_db") dataloader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=4)7. 常见问题解决
7.1 CUDA内存不足错误
解决方案:
- 减少
--resolution参数值 - 降低
--densification_interval - 设置
--max_gaussians限制最大高斯数量
7.2 COLMAP重建失败
检查要点:
- 确保图像EXIF信息完整
- 尝试手动运行COLMAP:
colmap automatic_reconstructor \ --image_path data/tandt_db/images \ --workspace_path data/tandt_db/colmap \ --camera_model SIMPLE_PINHOLE
7.3 渲染质量不佳
优化建议:
- 增加训练迭代次数
- 调整学习率参数:
--position_lr_init 0.00016 --position_lr_final 0.0000016 --feature_lr 0.0025 --opacity_lr 0.05 --scaling_lr 0.005 --rotation_lr 0.001
8. 高级应用与扩展
8.1 自定义数据集训练
数据目录结构要求:
custom_dataset/ ├── images/ # 原始图像 │ ├── 0001.jpg │ ├── 0002.jpg │ └── ... └── masks/ # 可选遮罩 ├── 0001.png ├── 0002.png └── ...8.2 实时SLAM集成
将3DGS与SLAM系统结合的伪代码:
class SLAMWith3DGS: def __init__(self): self.gaussians = GaussianModel(3) self.keyframes = [] def add_frame(self, image, pose): # 1. SLAM位姿估计 current_pose = self.estimate_pose(image) # 2. 关键帧选择 if self.is_keyframe(current_pose): self.keyframes.append((image, current_pose)) # 3. 增量式重建 self.update_gaussians(image, current_pose) def update_gaussians(self, image, pose): # 实现增量式高斯重建逻辑 pass8.3 动态场景处理
动态3DGS的修改要点:
- 为每个高斯添加时间维度参数
- 修改渲染方程以支持时间插值
- 实现运动估计和补偿
class DynamicGaussianModel(GaussianModel): def __init__(self, sh_degree): super().__init__(sh_degree) self._motion = torch.empty((0, 3), device="cuda") # 每个高斯的运动向量 def add_motion_parameters(self): # 实现运动参数初始化 pass def apply_motion(self, t): # 根据时间t应用运动 self._xyz += t * self._motion