一、项目简介
GO-SLAM是ICCV 2023的优秀开源的SLAM文章。GO-SLAM是基于深度学习的密集视觉SLAM框架,实现了对姿势和三维重建的实时全局优化。通过整合强健的姿势估计、高效的闭环检测以及持续表面表示更新,GO-SLAM有效地解决了与神经隐式表示相关的误差累积和畸变挑战。通过利用输入历史中学习到的全局几何信息,GO-SLAM在合成和真实世界数据集上设定了新的跟踪鲁棒性和重建准确性标准。其灵活性涵盖了单目、立体和RGB-D输入。
GO-SLAM的主要贡献:
-
一种新颖的基于深度学习的实时全局姿势优化系统,考虑了所有输入帧的完整历史并持续对齐所有姿势。
-
一种高效的对齐策略,实现即时闭环和全局结构校正,既节约内存又高效利用时间。
-
一种即时的三维隐式重建方法,实现了最新全局姿势估计的即时和连续3D模型更新。这种策略促进了实时三维重建。
-
第一个适用于任何设置(单目、立体或RGB-D相机)的联合鲁棒姿势估计和密集三维重建的深度学习架构。
二、项目安装
我的环境:
ubuntu22.04
NVIDIA RTX-3090
直接使用conda创建虚拟环境并安装
git clone --recursive https://github.com/youmi-zym/GO-SLAM
sudo apt-get install libopenexr-dev
conda env create -f environment.yaml
conda activate go-slampip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
pip install evo --upgrade --no-binary evopython setup.py install
之前在用conda创建虚拟环境的时候,经常出现channel错误。但是这个项目,用conda 安装没有任何错误,只是时间慢了点(不的说,GO-SLAM用到的包太多了)
可能出现的问题:
1. 在执行:pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch的时候,可能会出现如下错误:
Processing /home/XXX/VSLAM/GO-SLAM/tiny-cuda-nn-master/bindings/torch
Preparing metadata (setup.py) ... error
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [6 lines of output]
Traceback (most recent call last):
File "<string>", line 2, in <module>
File "<pip-setuptools-caller>", line 34, in <module>
File "/home/XXX/VSLAM/GO-SLAM/tiny-cuda-nn-master/bindings/torch/setup.py", line 2, in <module>
import torch
ModuleNotFoundError: No module named 'torch'
分析问题:原因是自己电脑cuda版本和torch版本不兼容,重新安装pytorch:
mamba install pytorch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 pytorch-cuda=12.1 -c pytorch -c nvidia
tiny-cuda-nn-master的安装非常麻烦(我前前后后尝试了不止10次,主要是tiny-cuda-nn-master和cuda、torch的版本高度依赖),如果安装出现问题,可以参考这里:
三、数据集下载
数据集 | 下载地址 | 备注 |
Replica | https://drive.google.com/drive/folders/1RJr38jvmuIV717PCEcBkzV2qkqUua-Fx?usp=sharing | 直接Google Drive下载 |
ScanNet | ScanNet | Richly-annotated 3D Reconstructions of Indoor Scenes | 由于版权问题,需要自己申请下载。然后使用code从.sens文件中提取color/depth数据 |
EuRoC | 下载脚本:code DATA_ROOT=path/to/folder mkdir $DATA_ROOT ./scripts/download_euroc.sh $DATA_ROOT | GT 轨迹需要从Google Drive下载 |
四、运行
所有的数据集的运行命令都是:
XX.sh MODE EXP_NAME
XX.sh:数据集运行脚本
MODE:[rgbd, mono]
EXP_NAME:自己取名(实验的名称)
数据集 | 运行命令(示例) | 备注 |
Replica | ./evaluate_on_replica.sh rgbd first_try | |
ScanNet | ./evaluate_on_scannet.sh rgbd first_try | 由于ScanNet自带渲染数据集,所以可以执行如下命令,查看重现效果: ./generate_video_on_scannet.sh rgbd first_try_on_video |
EuRoC | ./evaluate_on_euroc.sh stereo first_try |
可能遇到的问题:
1. 运行的时候出现问题:OSError: Could not find compatible tinycudann extension for compute capability 75
解决方法参考:OSError: Could not find compatible tinycudann extension for compute capability 75 · Issue #330 · NVlabs/tiny-cuda-nn · GitHub
在终端运行下面代码,重新安装tinycudann,再次运行之后终于不报这个错啦!
export TCNN_CUDA_ARCHITECTURES=75
pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
2.运行的时候出现问题:
RuntimeError: CUDA error: an illegal memory access was encountered
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
Compile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.
解决方法参考:
可以设置环境变量export CUDA_LAUNCH_BLOCKING=1表示阻塞式执行,即一个算子在device执行完成后,host才会下发一个算子到device上执行,这种完全同步执行方式下如果还是报此错误(非法内存访问)的话,配合算子执行日志就可以初步确定是当前执行算子的问题了。
五、实验结果分析
在Replica room0序列上面进行测试:
./evaluate_on_replica.sh rgbd first_try
我们发现./evaluate_on_replica.sh中运行的实际命令:
python run.py configs/Replica/room0.yaml --device cuda:0 --mode $MODE --output ${OUT_DIR}/${sc}/$EXPNAME
实验结果:
GO-SLAM使用6个线程,总体运行速度还是挺快滴。Replica room0上面也就5分钟左右。