第一节 为 gsplat 官方文档:Render a Large Scene 介绍。
第二节起 为本机 COLMAP 实验:训练、日志、指标与渲染相对 GT 的对照。工作区根目录默认为/home/ray/default。

1. 渲染大场景
原文链接: https://docs.gsplat.studio/main/examples/large_scale.html
gsplat 在设计上注重效率,因此非常适合渲染大场景。例如,这里我们将 Garden 场景复制成 9×9 的网格来模拟大场景,总共有 3000 万(30M) 个高斯,而 gsplat 仍允许对其进行实时渲染。
实现上述效果的主要「魔法」是一个非常简单的技巧:我们对投影后的高斯半径 施加一个较小的阈值(例如 3 像素 ),据此忽略 离相机较远的高斯;该阈值可在我们的 rasterization() API 中通过参数 radius_clip 配置。
以 gsplat 作为 CUDA 后端时:
(与官网一致的内嵌视频;若渲染器不支持 iframe,请打开:https://www.youtube.com/watch?v=rXyJwL7uJFQ)
以 diff-gaussian-rasterization 作为 CUDA 后端时:
(同上:https://www.youtube.com/watch?v=kk3G3P68rkc)
注意: 与 nerfstudio 的 viewer 类似,当渲染较慢时,我们的 viewer 会自动切换到较低分辨率。
此示例的代码位于 examples/ 目录下:
bash
# First train a 3DGS model
CUDA_VISIBLE_DEVICES=0 python simple_trainer.py default \
--data_dir data/360_v2/garden/ --data_factor 4 \
--result_dir ./results/garden
# View it in a viewer with gsplat
python simple_viewer.py --scene_grid 5 --ckpt results/garden/ckpts/ckpt_6999.pt --backend gsplat
# Or, view it with inria's backend (requires to insteall `diff-gaussian-rasterization`)
python simple_viewer.py --scene_grid 5 --ckpt results/garden/ckpts/ckpt_6999.pt --backend inria
# Warning: a large `--scene_grid` might blow up your GPU memory.
2. 本地实践日志
官方示例强调:已训练好的权重 + viewer 里 scene_grid 放大场景 + 渲染时的 radius_clip 。
在本项目中,我们还区分了两种「大场景」相关用法(详见工作区 WORKSPACE_PROJECT_SUMMARY.md):
| 策略 | 含义 | 权重是否变化 |
|---|---|---|
| 仅轨迹 / viewer 侧 culling | traj_radius_clip 或 viewer 中的 radius_clip,用于生成 MP4 或交互预览 |
否(同一 checkpoint) |
| 训练每一步光栅化也 culling | train_radius_clip 传入训练与验证的 rasterize_splats |
是(需单独目录保存新 checkpoint) |
下面给出训练过程、配置快照、日志位置、定量指标与图像对比。
3. 训练环境与一键脚本
- Conda 环境 :
gsplat_run(与train_roomimages_myscene_radius_clip.sh一致)。 - 脚本 :
gsplat/examples/train_roomimages_myscene_radius_clip.sh- 通过环境变量
TRAIN_RADIUS_CLIP(默认3.0)设置--train-radius-clip与--traj-radius-clip。 - 输出到新目录 ,不覆盖原有
gsplat_results/roomimages、gsplat_results/my_scene。
- 通过环境变量
等价核心命令(单场景示意):
bash
cd /home/ray/default/gsplat/examples
conda activate gsplat_run
export PYTHONPATH="/home/ray/default/gsplat:/home/ray/default/gsplat/examples:${PYTHONPATH}"
python simple_trainer.py default \
--data-dir /home/ray/default/data/roomimages \
--result-dir /home/ray/default/gsplat_results/roomimages_train_rclip3 \
--data-factor 1 \
--max-steps 3000 \
--eval-steps 3000 \
--save-steps 3000 \
--train-radius-clip 3.0 \
--traj-radius-clip 3.0 \
--disable-viewer
my_scene 将 --max-steps / --eval-steps / --save-steps 设为 2000 ,--result-dir 为 gsplat_results/my_scene_train_rclip3。
4. 训练过程:保存了哪些「日志」
每次运行会在 result_dir 下写入至少:
| 类型 | 路径示例 | 说明 |
|---|---|---|
| 配置快照 | .../cfg.yml |
训练时的完整 Config(含 train_radius_clip、traj_radius_clip 等) |
| 步末统计(JSON) | .../stats/train_step2999_rank0.json、.../stats/val_step2999.json |
训练段耗时/显存/高斯数;验证段 PSNR、SSIM、LPIPS 等 |
| TensorBoard | .../tb/events.out.tfevents.* |
tb_every: 100 时记录 train/loss、train/num_GS、train/mem 等 |
查看 TensorBoard 示例:
bash
tensorboard --logdir /home/ray/default/gsplat_results/roomimages/tb
# 或
tensorboard --logdir /home/ray/default/gsplat_results/roomimages_train_rclip3/tb
4.1 配置快照摘录(train_radius_clip 重训)
自 roomimages_train_rclip3/cfg.yml 抽取与「大场景」相关的项:
yaml
train_radius_clip: 3.0
traj_radius_clip: 3.0
max_steps: 3000
eval_steps: [3000]
save_steps: [3000]
data_dir: /home/ray/default/data/roomimages
result_dir: /home/ray/default/gsplat_results/roomimages_train_rclip3
disable_viewer: true
tb_every: 100
4.2 统计 JSON 摘录(验证集)
roomimages --- baseline (gsplat_results/roomimages/stats/val_step2999.json):
json
{"psnr": 13.60782241821289, "ssim": 0.6638185977935791, "lpips": 0.6336232423782349, "ellipse_time": 0.08137485384941101, "num_GS": 436087}
roomimages --- train_radius_clip=3 重训 (gsplat_results/roomimages_train_rclip3/stats/val_step2999.json):
json
{"psnr": 5.495437145233154, "ssim": 0.5251569747924805, "lpips": 0.8455857634544373, "ellipse_time": 0.004726707935333252, "num_GS": 770717}
my_scene --- baseline (gsplat_results/my_scene/stats/val_step1999.json):
json
{"psnr": 25.201412200927734, "ssim": 0.9248239398002625, "lpips": 0.37743473052978516, "ellipse_time": 0.003070274988810221, "num_GS": 95672}
my_scene --- train_radius_clip=3 重训 (gsplat_results/my_scene_train_rclip3/stats/val_step1999.json):
json
{"psnr": 6.146676063537598, "ssim": 0.7319830656051636, "lpips": 0.7573891878128052, "ellipse_time": 0.0043875475724538164, "num_GS": 787251}
说明: 官方文档中的 radius_clip 主要用于海量高斯下的实时渲染 ;在 训练阶段 持续开启 train_radius_clip 会改变参与梯度的集合,本工作区这两组实验中 验证 PSNR 明显低于 baseline ,属于「策略与质量的权衡」------若追求拟合质量,可优先采用 baseline 训练 + 仅推理/轨迹侧 culling,与文档中「先训练再大规模查看」的叙事一致。
5. 渲染图与真实照片(GT)对比
验证集划分与 simple_trainer / COLMAP 数据集一致:test_every: 8,即按排序后的图像下标 每 8 张取 1 张 作为验证视角。
下面 同一验证索引 0004 下,对比 baseline 渲染 、train_radius_clip=3 重训渲染 、以及 对应 GT 图像(路径均相对于工作区根目录)。
5.1 roomimages
数据集验证视角 val_step*_0004 对应全局排序后第 32 张图(test_every=8 时:4 × 8 = 32),即 data/roomimages/images/frame_0033.jpg。
| 类型 | 图像 |
|---|---|
| Baseline 渲染 | ![]() |
train_rclip3 渲染 |
![]() |
| 真实照片 GT | ![]() |
5.2 my_scene
图像位于子目录 images/front_stereo_camera_left/,按 COLMAP 使用的排序,验证索引 0004 对应的 GT 文件为:
data/my_scene/images/front_stereo_camera_left/1760584535304523168.jpeg
| 类型 | 图像 |
|---|---|
| Baseline 渲染 | ![]() |
train_rclip3 渲染 |
![]() |
| 真实照片 GT | ![]() |
5.3 轨迹视频(可选)
| 场景 | 路径 |
|---|---|
roomimages,仅轨迹 radius_clip(baseline ckpt) |
gsplat_results/roomimages/videos_largescale_rclip3/traj_2999.mp4 |
roomimages,train_rclip3 |
gsplat_results/roomimages_train_rclip3/videos/traj_2999.mp4 |
| my_scene,同上两类 | gsplat_results/my_scene/videos_largescale_rclip3/traj_1999.mp4、gsplat_results/my_scene_train_rclip3/videos/traj_1999.mp4 |





