Photo-SLAM论文理解、环境搭建、代码理解与实测效果
前言:第一个解耦式Photo-SLAM,亮点和效果。
参考:https://zhuanlan.zhihu.com/p/715311759
全网最细PhotoSLAM的conda环境配置教程,拒绝环境污染!!-CSDN博客
1. 环境搭建
硬件:RTX 4090D with 24 GB VRAM,i9 64 GB RAM。
系统:Ubuntu22.04,gcc11.4,cmake3.22.1;CUDA 11.8, CUDNN8.9.7。具体配置参考WIN11安装Ubuntu22.04双系统,驱动cuda,配置3D GS_535.230.02 最高支持cuda版本-CSDN博客
需要安装opencv及-contrib,libtorch。
1.0 依赖&源码下载
sudo apt-get update
sudo apt-get install libssl-dev
sudo apt install libeigen3-dev libboost-all-dev libjsoncpp-dev libopengl-dev mesa-utils libglfw3-dev libglm-dev
git clone https://github.com/HuajianUP/Photo-SLAM.git --recursive
1.1 OpenCV
从OpenCV realeases和
opencv_contrib下载4.8.0的压缩包,然后解压缩到同一文件夹下,比如 ~/opencv
,然后在终端中:
cd opencv
cd opencv-4.8.0
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=RELEASE -DWITH_CUDA=ON -DWITH_CUDNN=ON -DOPENCV_DNN_CUDA=ON -DWITH_NVCUVID=ON -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-11.8 -DOPENCV_EXTRA_MODULES_PATH="../../opencv_contrib-4.8.0/modules" -DBUILD_TIFF=ON -DBUILD_ZLIB=ON -DBUILD_JASPER=ON -DBUILD_CCALIB=ON -DBUILD_JPEG=ON -DWITH_FFMPEG=ON .. //注意要提供CUDA11.8和opencv-contrib的路径
但是可能会报错:
1.1.1 报错ippicv下载不了,网络连接的问题
首先下载报错处的ippicv版本,我的是2021.8;并解压,解压后包含文件夹ippicv_lnx。
链接: https://pan.baidu.com/s/1ZIsyONF21cw6NNFG9mcQkA 提取码: astz
然后修改opencv-4.8.0/3rdparty/ippicv/ippicv.cmake第42行,将下载地质从网址"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/“改为包含下载文件ippicv_lnx的路径
"/xxx path xxx/ippicv_2021.8_lnx_intel64_20230330_general/"
然后继续上述cmake。
1.1.2 报错找不到cudnn
我已经成功安装了cudnn,参考Ubuntu22.04安装视觉环境(CUDA CUDNN TensorRT realsense PCL OpenCV) _multiple kernel module types are available for thi-CSDN博客
在cmake指令中增加:
-D CUDNN_VERSION=8.9.7 \
-D CUDNN_INCLUDE_DIR=/usr/local/cuda/include \
-D CUDNN_LIBRARY=/usr/local/cuda-11.8/lib64/libcudnn.so.8.9.7
然后继续上述cmake。直至configure done。
然后:
make -j8 //这个过程比较长,尤其是97%-99%这一段,等一会直到完成。
sudo make install //将opencv安装到系统路径/usr/local/lib/cmake/opencv4。其中可执行文件在/usr/local/bin,库文件在/usr/local/lib,头文件在/usr/local/include。
1.2 安装 LibTorch <2.1.2
cxx11-abi-shared-with-deps-2.0.1+cu118, cxx11-abi 表示使用了 C++11 ABI, with-deps 表示该版本包含了所有的依赖项。
下载并解压:
wget https://download.pytorch.org/libtorch/cu118/libtorch-cxx11-abi-shared-with-deps-2.0.1%2Bcu118.zip -O libtorch-cu118.zip
unzip libtorch-cu118.zip -d ./the_path_to_where_you_extracted_LibTorch
rm libtorch-cu118.zip
修改Photo_SLAM的CMakeLists.txt,添加:
set(Torch_DIR ./LibTorch解压文件路径/libtorch/share/cmake/Torch)
1.3 编译Photo-SLAM
cd Photo-SLAM/
chmod +x ./build.sh
./build.sh
我是没有遇到编译问题。
1.4下载数据集
Photo_SLAM的作者使用了Replica(NICE-SLAM版)、TUM-RGBD、EUROC三个数据集进行评估,提供了scripts/对应数据集的下载脚本download_xxx.sh。
cd scripts
chmod +x ./*.sh
./download_replica.sh
./download_tum.sh
./download_euroc.sh
我选择手动下载到我创建的数据集路径下。
2. 效果评估
2.1 实际运行界面
以replica/office1为例,指令:./bin/replica_rgbd ./ORB-SLAM3/Vocabulary/ORBvoc.txt ./cfg/ORB_SLAM3/RGB-D/Replica/office1.yaml ./cfg/gaussian_mapper/RGB-D/Replica/replica_rgbd.yaml /your path to/Replica/office1 ./your path to/results/replica/office1。
最终保存的结果包括:相机位姿、关键帧位姿(按TUM、EUROC、KITTI格式);GPU使用峰值,每帧跟踪用时;渲染图像、点云;3D GS场的psnr dssim指标(每个关键帧)。
3. 论文&代码理解
3.1 论文摘要
目的:虽然目前基于隐式神经(NeRF)表征的SLAM系统相比传统SLAM增加了逼真视觉重建的能力,但是依赖于计算资源(违背了SLAM系统的应用需求)。作者将3DGS实时渲染能力与传统的基于稀疏特征的SLAM系统ORB-SLAM3结合,从而保证能在嵌入式平台上实时运行。
创新点:基于几何特征主动致密化超级基元(hyper primitive,参数除了高斯椭球自带的位置、协方差(旋转和缩放)、密度、SH系数以外,还有ORB特征,可以理解为传统地图点和高斯椭球的结合);用图像的高斯金字塔而不是单张图像渐进式训练高斯场。
方法:基于ORB-SLAM3的跟踪和局部建图。然后对每个新关键帧,ORB-SLAM3会检测特征点是否有匹配地图点,如果没有,Photo-SLAM定义为inactive不活跃特征,然后用来初始化新的超级基元。在高斯场优化时(学习率固定为0.2),除了上述几何引导的致密化技巧,作者先用图像高斯金字塔(3层)中最顶层,即分辨率最低/最模糊的观测图像训练参数,然后向下层遍历直至底层原始分辨率图像。
验证:指标包括定位准确性ATE的RMSE和STD统计值;图像重建质量的PSNR,SSIM,LPIPS;跟踪帧率、渲染帧率;GPU现存使用峰值。每个序列运行5次取均值。
总结:跟踪准确性和实时性最好,证明了传统方法ORB-SLAM3跨场景的鲁棒性和泛化能力(相比于DROID-SLAM);相比于nerf-based SLAM的图像重建质量也是最优的(当时没有发表过同期的3DGS-based SLAM工作),证明了所提出的致密化和高斯金字塔优化方法的效果;内存占据最少,说明本方法基于稀疏特征点初始化高斯球,并结合致密化和优化技巧,对场景表征高效,冗余度很少。