VOOM 阅读笔记和复现,采用 opencv4
论文阅读
原始题目 | VOOM: Robust Visual Object Odometry and Mapping using Hierarchical Landmarks |
---|---|
中文名称 | 使用分层landmarks 的 Robust 视觉目标里程计和建图 |
发表时间 | 2024 年 2 月 21 日 |
平台 | ICRA 2024 |
来源 | 北京理工大学 |
文章链接 | https://arxiv.org/abs/2402.13609 |
开源代码 | https://github.com/yutongwangBIT/VOOM |
VOOM 是一个实时视觉同步定位与地图构建(SLAM)库,它使用高级物体和低级点作为分层 landmarks,以粗到细的方式进行处理。它计算摄像头的轨迹和稀疏的三维重建。
摘要
近年来,面向对象的同步定位与地图构建(SLAM)因其在保持计算效率的同时提供高级语义信息的能力而受到越来越多的关注。
一些研究人员试图通过将 the modeled object residuals 集成到 bundle adjustment 中来提高定位精度。然而,很少有表现出比基于特征的视觉 SLAM 系统更好的结果,因为通用的粗糙对象模型(如长方体或椭球体)不如特征点准确。
在本文中,我们提出了一种视觉对象里程计和建图框架 VOOM(Visual Object Odometry and Mapping ),该框架使用高级对象和低级点作为分层 landmarks,从粗到细的方式,而不是直接使用 object residuals 进行 bundle adjustment。
- 首先,介绍了一种改进的 观测模型( observation model)和一种新的双二次函数 数据关联方法( data association method),用于表示物理对象。它有助于创建紧密反映现实的 3D 地图。
- 接下来,我们使用 对象信息 来增强 特征点的数据关联,从而更新地图。
- 在视觉对象里程计后端,使用更新的地图来进一步优化相机姿势和对象。
- 同时,在我们的 视觉对象建图过程中,利用对象和基于点的可视性图执行 local bundle adjustment。
- 实验表明,VOOM 在定位方面优于面向对象的 SLAM 和特征点 SLAM 系统,如 ORB-SLAM2。
1. 引言
准确的定位和建图在各种应用中至关重要,包括自主导航、机器人操作和增强现实。
相机具有成本效益且易于集成,同时提供丰富的几何形状和语义信息,使其适用于真实场景。因此,视觉里程计 或 同步定位和建图(SLAM)引起了研究人员的日益关注。
然而,传统视觉里程计或SLAM框架 map points as landmarks 缺乏 高级信息,导致鲁棒性和适用性有限[1]–[3],这导致人们对 对象级里程计和建图算法[4]–[6]的兴趣日益浓厚,尤其是在一些使用长方体或双二次体作为 landmarks 的轻量级方法[7],[8]。
目前的算法主要集中在构建更准确的物体 landmarks [9]、[10],以及利用物体信息[11]–[13]提高定位精度。尽管这些方法将对象残差纳入 bundle adjustment 中,但它们依赖于 基于特征的技术(如ORB-SLAM2)[2])对相机姿势的准确初始猜测。它们的定位结果与基于特征的方法相似,有时甚至更差。这表明当前基于对象的方法尚未充分利用有价值的对象信息来提高定位精度。如何进一步利用对象信息来改善视觉SLAM结果仍然具有挑战性。
在本文中,我们提出了一种名为 VOOM 的新颖的视觉对象里程计和建图框架,它同时应用 低级特征点和高级对象 到 里程计和建图的整个过程,如图1所示。
图 1:顶部: Groundtruth map.。中间:ORB SLAM2 with loop closure disabled。底部:VOOM。彩色椭球体表示 3D 对象,蓝色圆锥体表示摄像机姿势,绿线表示关键帧之间的可视性关系。ORB-SLAM2 生成的地图具有冗余的点云和模糊的边界,而我们的 VOOM 构建了更轻量级但语义增强的地图,从而实现更准确的相机姿态估计。
- 在里程计中,我们将 基于 Wasserstein 距离[14]的双二次曲线残差模型 与 基于归一化 Wasserstein 距离的对象数据关联方法 相结合,构建了精确的对象级地图。通过利用对象级信息,当前帧的关键点与先前的地图点更好地匹配,从而增强了帧的姿态估计。
- 在视觉对象建图方面,我们 基于关键帧和对象之间的观察关系,建立了一个基于对象的可视性图。更新与图中当前邻域对应的地图点,从而更新基于点的可视性图和局部地图。
- 通过 bundle adjustment,优化了局部关键帧的姿态和地图点的位置。
在实验中,我们已经证明,在大多数序列中,仅使用里程计和建图组件的所提出的 VOOM 甚至优于具有 loop closure 的 ORB-SLAM2。据我们所知,这是第一篇实现并证明使用双二次曲面和特征点的面向对象 SLAM 系统的论文,可以比最先进的基于特征的视觉 SLAM 系统实现更好的定位精度。
总而言之,我们的主要贡献有三点:
- 开发一种新颖的视觉对象里程计和建图框架,使用特征点和双二次曲线作为landmarks;
- 设计有效的对象优化算法、对象关联和基于对象的地图点关联,以构建具有分层landmarks的地图;
- 广泛的实验验证证明了所提出的方法与最先进的方法相比的优越性。
相关工作
A. 视觉里程计和建图
视觉里程计和地图通常分为 直接方法和基于特征的方法,具体取决于它们如何从图像中提取信息以估计相机运动和重建地图。
- 直接方法,如 LSD-SLAM [1]和 直接稀疏里程计 Direct Sparse Odometry (DSO)[15],通过直接利用图像中的像素强度信息来估计相机运动并重建地图。Direct Sparse Mapping (DSM) [16]通过重用现有地图信息来扩展 DSO。虽然直接方法可以处理低纹理和模糊的图像,但它们对相机参数和曝光很敏感。
- 相比之下,基于特征的方法通过跟踪提取的特征(如 SIFT、BRIEF 和 ORB)在可变照明条件下更加稳健。在早期的视觉 SLAM中,基于滤波的方法被广泛使用[17],[18]来跟踪特征,这要归功于其较低的计算成本。然而,随着计算能力的提高,像 PTAM[19]这样的系统开始使用 bundle adjustment 来优化关键帧姿势,并将整个过程划分为 跟踪和建图,这比滤波方法更准确。基于这些想法,单目 ORB-SLAM[20]跟踪了更强大的 ORB 特征,并通过构建 a covisibility 图来限制姿态优化和建图的复杂性。ORB-SLAM2 [2] 进一步扩展了 stereo 和 RGB-D 相机的系统。ORB-SLAM2 在实践中已被证明用途广泛、高效且相对准确。因此,在我们的工作中,我们采用 ORB-SLAM2 的 points-level 处理方法。在此基础上,我们引入了 the object-level landmarks,并将它们无缝集成到整个里程计和建图过程中。
B. Object-oriented SLAM
语义 SLAM 可以表示对复杂环境的高级理解。在不同的视觉语义 SLAM 方法中,面向对象的 SLAM 提供了一种轻量级的解决方案,可以通过利用对象关系和几何约束来增强定位和建图性能。
- SLAM++ [21] 是早期提出的面向对象建图系统,在不牺牲描述性的情况下,与密集语义建图相比,它在建图容量上表现出优势。SLAM++ 不是通用的,因为它只能跟踪具有已知几何形状的特定域对象。
- 在[22]中,使用边界框检测和 3D分割 将任意对象构建为点云模型。
- 基于这些建图系统,Fusion++[5]进一步探索了利用重建对象来提高定位精度的方法。仅使用存储在 6DoF 姿态图中的 3D 对象信息,Fusion++ 实现了更高的精度。
- 随着CubeSLAM [7]和QuadricSLAM [11]的出现,研究人员有动力使用紧凑的几何形状来表示物体,而不是提供物体表面的详细描述。
- 与[7]中使用的长方体相比,在面向对象 SLAM中 使用双二次曲面在射影几何[8]中具有数学完备性的优势。
- 基于二次曲面的方法的一些变体侧重于构建用于建图的精确观测模型[9]、[10]、[23]、[24]。
- 其他研究人员也试图通过在优化的成本函数中添加残差对象来提高定位性能[11]-[13],但与基于特征的方法相比,改进可以忽略不计。
- OA-SLAM[25]提出了一种对象辅助重新定位方法,该方法使用对象模型进行粗略的姿态估计,并使用基于点的方法来优化定位性能。在 OA-SLAM 中指出,对象擅长提供高级语义信息并具有很强的辨别能力,而点在空间定位方面具有更高的准确性。
受 OA-SLAM 从粗到细的思想的启发,我们提出了一种更合乎逻辑的策略来增强里程计和建图。我们没有直接将对象残差引入优化,而是将 3D 对象紧密结合为 landmarks,以帮助特征点关联。这使我们能够重复利用 3D 地图点,不仅用于时间相邻的帧,还用于空间相邻的帧。因此,我们可以减少里程计中误差的积累。
3. VOOM
A. 系统概述
所提出的 VOOM 以 RGB-D 图像为输入,输出由 地图点和3D对象组成的3D地图。
整个过程分为两个主要部分:
视觉对象里程计和视觉对象建图,如 图2 所示。
- 在里程计部分,
前端处理来自 YOLOv8 [26] 实现的实例分割结果的特征点和信息。我们在 ORB-SLAM2 中使用该方法来处理 ORB 特征点和姿态预测。在 object-level 前端,we estimate ellipses using the direct least squares method [27] based on a set of counter points obtained from instance segmentation。我们根据 the estimated ellipse 和 the projection of the 3D ellipsoid onto the image plane 之间的 the Wasserstein distance 来确定对象是否相关,我们在 III-B 和 III-C 节中详细介绍了这一点。
在里程计后端,我们使用 associated objects 基于优化的帧姿态 来更新 the data association of map points ,在第 III-D 节的第一部分中介绍。一旦帧被确定为关键帧,它就会被传递到 the Visual Object Mapping 线程,在第 III-D 节的第二部分中介绍。
B. 目标的观测模型
我们执行 instance segmentation 以检测每个传入图像中的目标。QISOSLAM [13]已经证明,与使用边界框相比, 使用实例分割的轮廓可以在 object-oriented 的建图和定位方面实现更高的精度。与此一致,我们 在第 f 帧 的 第 k 个目标 估计一个观测椭圆 E ,通过 minimizing the sum distance between each segmentation contour point and the ellipse outline。
C. 对象级数据关联
在基于双二次曲线的 面向对象SLAM 的研究中,将 reprojected boxes and detected bounding boxes 之间的 IoU 作为 the criterion for object data association。但是,使用这样的标准存在多个问题。
- 首先,a bounding box enclosing an ellipse has a larger area than the ellipse itself, which increases the overlap among irrelevant objects
- 其次,我们观察到 the data association performance of tiny objects 受到 camera pose error 的严重影响,因为基于 IoU 的指标对它高度敏感。由于我们使用 Wasserstein 距离来构建 残差模型 (the
residual model),它也可以用作 measurement for object data association 。在[14]中提出了用于微小物体检测的 归一化Wasserstein距离。基于(3),归一化的 Wasserstein距离写为:
在这里,C 是一个常数。该指标包含椭圆的中心点、长度轴和方向信息,比 IoU 更全面。
D. 从粗到细的里程计和建图
我们以从粗到细的方式介绍了我们的视觉对象里程计和建图方法。主要思想是利用 3D object-level landmarks 的鲁棒性来增强 基于特征的地图点的效率和准确性,以提高里程计和建图性能。
1)从粗到细的视觉对象里程计后端:
给定来自 特征级前端的运动模型预测的粗略姿态(a coarse pose predicted by the motion model from the feature-level frontend ) 和 来自对象级前端的关联对象(the associated objects from
the object-level frontend),我们搜索 与每个对象对应的所有 map points (在 图3a 中 标记为每个椭球体内的彩色大点)之间的匹配,并根据 ORB描述符的距离[20]提取属于关联实例的特征关键点(标记为图3b中每个边界框内的彩色矩形)。这使我们能够通过缩小搜索区域来实现更有效、更精确的地图点关联,并从早期帧(而不是最近的帧)中检索更多地图点。使用 3D 地图点之间的匹配和关键点,可以通过最小化重投影误差来首次细化帧姿态。接下来,我们通过搜索观察关联地图点的先前关键帧以及与这些关键帧相关的所有地图点来更新当前帧的本地地图,以匹配当前关键点。然后我们第二次执行更精细的姿态优化,以获得当前的帧姿态。使用与 ORB-SLAM2 相同的条件,决定创建关键帧并将其传递给 visual object mapping thread。
- Coarse-to-fine Visual Object Mapping:
After obtaining a reliable pose estimation and map points association for the current keyframe, we update the local map based on the object covisibility graph in visual object mapping. 对象可视性图记录了不同关键帧中不同对象之间的可视性关系,如 图4a 所示。它可以帮助我们选择与当前帧最相关的关键帧子集。与传统的基于地图点的共能见度图(如图4b所示)相比,我们的对象共能见度图具有更小的数据量和更高的鲁棒性。通过基于对象的可行性图,我们可以检索之前观察到对象的早期关键帧,以构建用于局部束调整的局部映射。由于对象的鲁棒性,即使只有局部映射,它也能隐式实现循环检测的一些效果。在本地 BA 中,我们使用检索到的关键帧和相应的映射点,与 [2] 中相同。对象的残差不参与BA,因为对象模型本身不如基于特征的模型准确,正如以前的许多工作[11]–[13]所示。在 BA 之后,对地图点的关键帧姿势和位置进行细化,并处理异常值。每个对象的参数根据其观察到的关键帧的姿势分别进行优化。
实践
测试环境: ubuntu 20.04
1. 安装
1.1 Pangolin 0.6
参考: https://blog.csdn.net/weixin_43592742/article/details/134415646
1.2 Eigen3 3.3.7
https://gitlab.com/libeigen/eigen/-/tree/3.3.7?ref_type=tags
#安装
cd eigen-git-mirror
mkdir build
cd build
cmake ..
sudo make install
安装后,头文件安装在/usr/local/include/eigen3/
注意!!!
不要采用下面这个指令安装eigen3,
sudo apt-get install libeigen3-dev
如果采用这个指令安装,默认是安装到了/usr/include/eigen3,ORB-SLAM3检测不到,导致编译会报错。利用源码安装,安装好的路径是 /usr/local/include/eigen3/>
1.3 dlib
https://blog.csdn.net/weixin_64612422/article/details/133913442
git clone https://github.com/davisking/dlib.git
cd dlib
mkdir buid
cd build
cmake .. -DDLIB_USE_CUDA=0 -DUSE_AVX_INSTRUCTIONS=1
cmake --build .
cd ..
sudo python3 setup.py install
最后检验 dlib 是否成功安装 pip list
查看是否有dlib即可
dlib 19.24.99
1.4 安装 Protocol Buffers
https://www.cnblogs.com/odesey/p/17619240.html
2 编译
git clone https://github.com/yutongwangBIT/VOOM.git VOOM
cd VOOM/
sh build.sh
错误1: opencv 版本问题
我安装的 opencv 是 4.9, 因此需要修改 cmake 文件:
find_package(OpenCV REQUIRED)
if(NOT OpenCV_FOUND)
message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
else()
if(NOT "${OpenCV_VERSION_MAJOR}" STREQUAL "4")
message(WARNING "OpenCV 4 is required for dnn module. Object detector will not be available.")
else()
message("OpenCV 4 found. Make sure OpenCV is built with dnn module and CUDA.")
add_definitions(-DUSE_DNN)
endif()
endif()
#find_package(OpenCV 3.0 QUIET)
#if(NOT OpenCV_FOUND)
# find_package(OpenCV 2.4.3 QUIET)
# if(NOT OpenCV_FOUND)
# message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
# endif()
#endif()
错误2:
# Dlib
find_package(dlib REQUIRED)
Could not find a package configuration file provided by "DLib" with any of
the following names:
DLibConfig.cmake
dlib-config.cmake
解决:
在安装 dlib 的路径下,进行:
sudo make install
sudo ldconfig
错误:
VOOM/Examples/rgbd_tum_with_ellipse.cc:137:73: error: ‘CV_LOAD_IMAGE_UNCHANGED’ was not declared in this scope
137 | imD = cv::imread(path_to_images + '/' + vstrImageFilenamesD[ni],CV_LOAD_IMAGE_UNCHANGED);
imD = cv::imread(path_to_images + '/' + vstrImageFilenamesD[ni],CV_LOAD_IMAGE_UNCHANGED);
改为:
imD = cv::imread(path_to_images + '/' + vstrImageFilenamesD[ni],cv::IMREAD_UNCHANGED);
3 运行
cd bin/
./rgbd_tum_with_ellipse ../Vocabulary/ORBvoc.txt ../Cameras/TUM2.yaml PATH_TO_DATASET ../Data/fr2_desk/fr2_desk.txt ../Data/fr2_desk/detections_yolov8x_seg_tum_rgbd_fr2_desk_with_ellipse.json points fr2_desk
报错:
Failed to load image: PATH_TO_DATASET/rgb/1311868164.363181.png
X Error of failed request: GLXBadFBConfig
Major opcode of failed request: 152 (GLX)
Minor opcode of failed request: 21 (X_GLXGetFBConfigs)
Serial number of failed request: 41
Current serial number in output stream: 41
Segmentation fault (core dumped)
解决:
这是因为没有下载数据集:
链接:https://cvg.cit.tum.de/data/datasets/rgbd-dataset/download
https://cvg.cit.tum.de/rgbd/dataset/freiburg2/rgbd_dataset_freiburg2_desk.tgz
在 VOOM 路径下组织数据集为这种格式,rgbd_dataset_freiburg2_desk 为下载的解压文件。
├── Datasets
│ └── TUM-RGBD
│ └── rgbd_dataset_freiburg2_desk
│ ├── depth
│ └── rgb
./rgbd_tum_with_ellipse ../Vocabulary/ORBvoc.txt ../Cameras/TUM2.yaml ../Datasets/TUM-RGBD/rgbd_dataset_freiburg2_desk ../Data/fr2_desk/fr2_desk.txt ../Data/fr2_desk/detections_yolov8x_seg_tum_rgbd_fr2_desk_with_ellipse.json points fr2_desk
结果:
UMA 数据集:https://mapir.isa.uma.es/mapirwebsite/?p=2108&page=2