这篇文章的核心内容是介绍了一种名为“RGB-Only Gaussian Splatting SLAM for Unbounded Outdoor Scenes”的SLAM(Simultaneous Localization and Mapping,即同时定位与建图)方法,该方法专注于仅使用RGB图像进行无边界户外场景的高斯点绘制(Gaussian Splatting)SLAM。
项目信息
项目名称:RGB-Only Gaussian Splatting SLAM for Unbounded Outdoor Scenes
作者:Sicheng Yu、Chong Cheng(共同第一作者)、Yifan Zhou、Xiaojun Yang、Hao Wang(通讯作者)
所属机构:香港科技大学(广州)
发表会议:ICRA 2025
项目主页:https://3dagentworld.github.io/opengs-slam/
论文链接:[2502.15633] RGB-Only Gaussian Splatting SLAM for Unbounded Outdoor Scenes
方法概述
核心思想:该方法仅依赖RGB图像,利用高斯点绘制技术实现无边界户外场景的SLAM。高斯点绘制是一种将点云表示为高斯分布的技术,能够高效地处理大规模场景。
技术特点:
RGB-only:不依赖深度信息,仅使用RGB图像进行建图和定位。
无边界场景:适用于大规模户外场景,能够处理无边界环境。
高斯点绘制:通过高斯分布表示点云,提高计算效率和建图质量。
安装与运行
1、安装步骤:
(1)克隆项目代码库:
git clone https://github.com/3DAgentWorld/OpenGS-SLAM.git --recursive
(2)设置环境:
conda env create -f environment.yml
激活环境:
conda activate opengs-slam
(3)编译子模块:
pip install submodules/simple-knn
pip install submodules/diff-gaussian-rasterization
(4)编译CUDA内核:
cd croco/models/curope/
运行:
python setup.py build_ext --inplace
2、检查点
在机器学习和计算机视觉领域,检查点(Checkpoint)是指在模型训练过程中保存的模型参数和状态信息。检查点通常用于以下目的:
模型恢复:在训练过程中,如果训练中断(例如,由于硬件故障、手动停止等),可以使用检查点恢复模型,继续从上次保存的状态开始训练,无需而从头开始。
模型评估:检查点包含了模型的参数,可以直接加载这些参数来评估模型在测试数据上的性能。
模型部署:在实际应用中,可以直接加载检查点中的模型参数,用于推理(inference)任务。
代码复现:在研究中,检查点可以用于复现他人的工作,验证模型的有效性。
在本项目中,检查点是指预训练的模型参数文件,具体是
DUSt3R_ViTLarge_BaseDecoder_512_dpt.pth
。这个文件包含了模型的权重和参数,用于在SLAM任务中进行深度估计或其他相关任务。以下是关于这个检查点的详细信息:检查点的作用
预训练模型:
DUSt3R_ViTLarge_BaseDecoder_512_dpt.pth
是一个预训练的深度模型估计的检查点。它可能是在大规模数据集上训练得到的,包含了模型的权重和参数。深度估计:在SLAM任务中,即使仅使用RGB图像,深度信息也是重要的。这个检查点可能用于从RGB图像中估计深度信息,从而辅助SLAM系统的建图和定位。
如何使用检查点
(1)下载检查点
1)可以从DUSt3R代码库下载。
2)或者使用以下命令直接下载:
mkdir -p checkpoints/
wget https://download.europe.naverlabs.com/ComputerVision/DUSt3R/DUSt3R_ViTLarge_BaseDecoder_512_dpt.pth -P checkpoints/
(2)加载检查点:
1)将下载的检查点文件保存到项目的checkpoints
目录下。
2)在代码中,加载这个检查点文件,使用其参数初始化深度估计模型。
3、数据集下载:(根据Github主页的百度网盘地址或谷歌进行下载)
(9 个Waymo数据段的处理数据)数据保存路径:datasets/waymo
4、运行示例:
(1)单个场景运行:
CUDA_VISIBLE_DEVICES=0 python slam.py --config configs/mono/waymo/100613.yaml
报错1:
解决方法:是因为数据集没有解压。 需要把数据集解压缩放到指定的路径。
报错2:
GUI 显示崩溃(OpenCV 报错)
cv2.flip(img, 0, img)
这行代码在原地写入 img,但 img 是 只读的 NumPy 数组(readonly),所以 OpenCV 无法写入,抛出错误。
解决方法:
修改
slam_gui.py
第 636 行:cv2.flip(img, 0, img)
改为:
img = img.copy() # 解除只读标志 cv2.flip(img, 0, img)
或者更保险地用返回值:
img = cv2.flip(img, 0)
报错3:
evo 错误导致评估失败。因为之前手动下载了一些库,没有制定版本,导致安装的最新版与之不兼容。
新版 evo
库(v1.20.0+)中已 移除了 align_trajectory()
方法。
解决方法:
回退安装旧版 evo
pip install evo==1.11.0
然后再次运行即可。
(2)批量运行所有Waymo场景:
bash run_waymo.sh
5、实时交互式SLAM窗口:
修改base_config.yaml
中的Results-use_gui
为True
,在Ubuntu系统上运行时会弹出GUI窗口。
CUDA_VISIBLE_DEVICES=0 python slam.py --config configs/mono/waymo/100613.yaml
截了一些图,基本上是初始化的,5,10,15...后面由于CUDA显存不够就退出了。。。(我再想想要不要删掉,先放着吧)
扩展应用:
其他数据集:
需要将数据格式组织为项目要求的格式,并修改
utils/dataset.py
中的代码。尽管代码中保留了深度图输入接口,但该方法并未在SLAM中使用深度信息。
后面也遇到了一些报错,直接贴了gpt的解决方法,可供参考
报错:
ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by ... libLerc.so.4)
(opengs-slam) huang@huang-System-Product-Name:~/Code/Open/OpenGS-SLAM$ strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.4.3 GLIBCXX_3.4.4 GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.7 GLIBCXX_3.4.8 GLIBCXX_3.4.9 GLIBCXX_3.4.10 GLIBCXX_3.4.11 GLIBCXX_3.4.12 GLIBCXX_3.4.13 GLIBCXX_3.4.14 GLIBCXX_3.4.15 GLIBCXX_3.4.16 GLIBCXX_3.4.17 GLIBCXX_3.4.18 GLIBCXX_3.4.19 GLIBCXX_3.4.20 GLIBCXX_3.4.21 GLIBCXX_3.4.22 GLIBCXX_3.4.23 GLIBCXX_3.4.24 GLIBCXX_3.4.25 GLIBCXX_3.4.26 GLIBCXX_3.4.27 GLIBCXX_3.4.28 GLIBCXX_DEBUG_MESSAGE_LENGTH
Python 运行时链接的是系统的
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
,它的版本太旧(只有到GLIBCXX_3.4.28
),而我 Anaconda 环境里已经有新版的libstdc++
,但系统没有自动用它。
解决方法:强制 Python 使用 Anaconda 的 libstdc++
方式一:设置
LD_PRELOAD
(推荐临时测试)<暂时用这个是ok的>LD_PRELOAD=/home/huang/anaconda3/envs/opengs-slam/lib/libstdc++.so.6 CUDA_VISIBLE_DEVICES=0 python slam.py --config configs/mono/waymo/100613.yaml
这个命令的意思是:优先加载 Anaconda 环境中那个新版的 libstdc++.so.6,避开系统老版本的冲突。
方式二:修改环境变量(长期有效)
你也可以在你的环境中添加如下变量(比如
.bashrc
或.zshrc
):export LD_LIBRARY_PATH=/home/huang/anaconda3/envs/opengs-slam/lib:$LD_LIBRARY_PATH
然后:
source ~/.bashrc conda activate opengs-slam python slam.py --config configs/mono/waymo/100613.yaml
验证方式(可选)
确认链接到的
libstdc++
是新的:ldd $(which python) | grep libstdc++
你应该看到类似:
libstdc++.so.6 => /home/huang/anaconda3/envs/opengs-slam/lib/libstdc++.so.6
如还有报错、程序依旧报同样错误,确认:
你用的是 当前环境的 Python
LD_PRELOAD
设置路径完全正确(指向libstdc++.so.6.0.34
并建立有软链)
❗问题描述:(有时候运行着突然CUDA显存不够就报错退出了)
PyTorch 有时即使你 ctrl+C 停止程序,显卡显存仍然没有释放。
解决方案:
方法一:手动清除显存残留
nvidia-smi # 找出占用显存的进程PID kill -9 <PID>
或者使用快捷指令:<用的这个>
kill -9 $(nvidia-smi | grep python | awk '{ print $5 }')
方法二:自动释放脚本(推荐放在 run.sh 前)
#!/bin/bash # safe_kill_cuda.sh PIDS=$(nvidia-smi | grep python | awk '{print $5}') if [ -z "$PIDS" ]; then echo "No CUDA processes to kill." else echo "Killing stale CUDA processes: $PIDS" kill -9 $PIDS fi
方法三:PyTorch 内部释放机制(代码级)
每次使用完模型后手动清理 GPU:
python import torch torch.cuda.empty_cache() del model
大约耗时半个小时
小总结:OpenGS-SLAM 在 Waymo_100613 数据集上的重建测试
验证 OpenGS-SLAM 系统在真实自动驾驶数据集(Waymo_100613)上的单目重建性能,评估其在轨迹精度、渲染质量和关键帧管理方面的表现。
一、实验配置
平台环境:
Ubuntu 20.04.6 LTS
Python 3.11(conda 环境)
CUDA 11.x + PyTorch(支持 GPU 加速)
GPU:16GB 显存
模型与参数:
预训练模型:DUSt3R_ViTLarge_BaseDecoder_512_dpt.pth
图像尺寸:512 × 512
模型结构:AsymmetricCroCo3DStereo
输入图像帧数:约 200 帧
二、系统运行过程
初始化阶段:
成功完成系统重置与模型加载,初始化地图构建完成。关键帧选取:
系统在第 5 帧起开始选择关键帧,关键帧编号如下所示:5, 10, 15, 20, ..., 最后为197
共选取约 30 个关键帧,平均间隔 6~7 帧,体现出系统对场景动态变化的有效响应。
SLAM 执行流程:
初始 BA(Bundle Adjustment)在关键帧 30 后开始。
在帧编号 44、112、174 处分别进行了 ATE(Absolute Trajectory Error) 评估。
三、评估结果
项目 评估位置 RMSE ATE [m] 初始阶段 第 44 帧 0.0973 中段阶段 第 112 帧 0.2468 后段阶段 第 174 帧 0.6212 全局结果 最终帧 0.7556
从结果可见,系统在初始阶段定位精度较高,随着视角复杂化,误差有所增加,但整体轨迹重建仍维持在可接受范围内。
四、渲染与重建质量
系统在 SLAM 阶段后进行了完整的 颜色重建与优化,共执行 26,000 步 refinement,历时约 9 分钟。
指标 优化前 优化后 PSNR 19.49 21.64 SSIM 0.739 0.767 LPIPS 0.537 0.445 说明颜色一致性与细节保真度有显著提升,图像重建效果可视化质量较好。
五、运行性能
总运行时间:598.9 秒
平均处理帧率:0.33 FPS(包含渲染与优化)
平均渲染时间(每帧):约 0.77 秒
六、结论与后续
OpenGS-SLAM 在该序列上运行稳定,系统成功完成从图像输入到三维建图、重建与颜色优化的全流程。初期轨迹重建精度较高,后期因场景复杂及视角切换导致误差上升,但整体重建结果仍具参考价值。
后续可从以下方面优化:
调整关键帧策略或增加鲁棒初始化策略;
引入 loop closure(回环检测)以抑制误差累积;
针对特定场景配置更合适的图像尺寸或模型结构,以降低显存压力并提升速度。