文章:High-Speed Stereo Visual SLAM for Low-Powered Computing Devices
作者:Ashish Kumar† , Jaesik Park‡ , Laxmidhar Behera
编辑:点云PCL
Code: https://github.com/ashishkumar822/Jetson-SLAM
摘要
本文提出了一种名为Jetson-SLAM的精确且GPU加速的双目视觉SLAM设计。它在NVIDIA低功耗的10W Jetson-NX嵌入式计算机上表现出每秒超过60帧的处理速度,并且在桌面级200W的GPU上,甚至在双目配置和多尺度设置下也能达到每秒超过200帧。贡献主要有三点:
(i) 一种有界校正技术,用于防止在FAST检测中将大量非角点误标为角点,从而提高SLAM的准确性。
(ii) 一种新颖的金字塔剪枝与聚合(PyCA)技术,通过利用GPU设备,在高速处理时提取鲁棒特征,同时抑制冗余特征。PyCA使用我们全新的“每线程多位置剪枝策略”(MLPT)和“线程高效的warp分配方案”(TEWA)来实现Jetson-SLAM在嵌入式设备上的高精度和高速度。
(iii) Jetson-SLAM库通过数据共享机制实现了资源效率,在三个具有挑战性的数据集(KITTI、EuRoC和KAIST-VIO)以及两个高度精确的SLAM后端(Full-BA和ICE-BA)上的实验表明,Jetson-SLAM是目前最快的准确且GPU加速的SLAM系统(如图1所示)。
图1:(a)Jetson-SLAM的GPU加速和资源高效的前端-中端设计的输出,(b)输出轨迹,(c)在Jetson-NX嵌入式计算机上的每秒帧数基准测试,(d)在KITTI序列上的SLAM性能。
主要贡献
在视觉SLAM中,速度主要由前端负载决定,这会随着图像分辨率变化而变化,并且在双目模式下加倍。此外,前端提取的特征数量会影响后端负载。因此,我们从头开始开发了一个GPU加速的前端,通过利用嵌入式计算机的片上GPU,以高速产生足够少量但具有影响力的特征。然而,在这一过程中,GPU核心的匮乏成为限制最高速度的瓶颈,而核心使用效率低下会降低GPU吞吐量。我们通过算法和系统开发贡献解决了这一问题,推出了一种高效、精确且资源高效的GPU加速SLAM系统,称为Jetson-SLAM。我们的贡献包括:
a) 有界校正:防止在FAST特征提取中将非角点误分类为角点,产生具有影响力的角点,从而提高SLAM的准确性。
b) 金字塔剪枝与聚合(PyCA):通过我们提出的“每线程多位置剪枝”(MLPT)和“线程高效的warp分配”(TEWA),即使在GPU核心匮乏的情况下,依然能以高达2000 FPS的速度提供高质量的多尺度特征和高计算效率。
c) Jetson-SLAM的前端-中端-后端设计:开发了一个名为中端的新SLAM组件,负责立体匹配、特征匹配、特征跟踪,并通过数据共享避免在不同SLAM组件之间进行中间结果的CPU-GPU内存传输开销。
尽管我们的贡献集中在前端和系统设计上,但中端和后端性能也得到了提升。Jetson-SLAM在Jetson-NX设备上,即使在VGG深度神经网络的支持下,在双目模式下的八个尺度下,仍能在432×240分辨率下实现每秒超过60帧的速度。这种高速减少了相机旋转时的跟踪失败(视频),并有助于开发仍依赖外部定位系统的自主无人机。
A. 角点检测中的有界校正
在FAST角点检测方法中,每个图像像素周围的一个被称为Bresenham圆的区域(半径为3,长度为16像素)被用于计算连续的暗像素(Nd)和亮像素(Nb)的数量。如果存在至少Pmin个较亮或较暗的像素,中心像素就会被标记为角点。
然而,这一过程会误将许多非角点标记为角点。这样的点实际上是统计上的异常值,类似于噪声或小斑点,它们虽然满足FAST算法的角点检测条件,但由于外观过于相似,无法被立体匹配器有效使用。例如,所有圆周上的像素都可能是亮的,而满足Nb > Pmin,但它们并不是角点。图2a展示了一个这样的例子,而图2b展示了一个实际图像中的类似情况。
问题及解决方案
误分类的角点会将错误传播到SLAM系统的其他部分,因此在检测阶段直接丢弃这些点至关重要。这不仅减少了送入立体匹配器的特征点数量,还降低了匹配时间。为了解决这个问题,作者提出了一种称为“有界校正”的方法,不仅提高了角点质量,还显著提升了Jetson-SLAM的精度。
有界校正的实施
该方法通过对角点检测的条件进行改进,增加了对亮暗像素数量的上下界限制,即修改了原有的规则,使得中心像素的周围像素不能同时全部过亮或过暗。具体来说,Nb和Nd的数量需要满足:Pmin ≤ Nb, Nd ≤ Pmax,其中Pmax被设置为13,保证了角点检测的多样性,同时有效地排除了类似图2a的非角点情况。
这一有界校正的FAST检测输出了一个角点响应矩阵(CRF矩阵),该矩阵随后被PyCA技术利用。
图2:(a)一个非角点,但其Bresenham圆上的所有像素都是亮的[11],(b)实际图像中被标记为角点的此类点的示例。
B. GPU 基础知识
NVIDIA GPU由流式多处理器(SM)组成,每个SM有多个GPU核心,并配备片上共享内存,具有较低的内存访问成本(MAC)。此外,GPU还具有片外的全局内存,但其内存访问成本较高。
GPU的计算是通过“warp”来执行的,每个warp由32个线程组成,这些线程在同一个SM上同时运行。一个block包含多个warp,这些warp都在同一个SM上执行,即使其他SM处于空闲状态。这是因为一个block内的线程可能需要彼此通信,而如果这些warp在不同的SM上执行,通信只能通过全局内存进行,但全局内存的内存访问成本较高。相比之下,片上共享内存的访问成本较低,但它不能被其他SM访问。
C. 金字塔式剔除与聚合 (PyCA)
PyCA通过特征剔除 (FC) 和金字塔式特征聚合 (PFA) 两个步骤在GPU上以高速度(微秒级)检测鲁棒的特征。FC通过抑制较弱的角点来提取最强的角点,模拟剔除行为;PFA则从多尺度应用FC的结果中提取鲁棒特征。PyCA充分考虑了GPU核心资源的稀缺性,确保不会降低吞吐量。
1. 特征剔除 (FC)
FC通过将角点响应矩阵 (CRF-matrix) 划分为非重叠的单元(像素大小为ch x cw),然后在每个单元内垂直和水平方向上剔除特征。
* 垂直特征剔除:通过遍历单元的每一列,记录每列的最大响应。为此,PyCA提出了"多位置每线程剔除"(MLPT),将单元的垂直尺寸划分为块,并由每个线程处理一部分,从而减少所需的线程数。这与其他方法相比更高效,特别是在核心资源有限的GPU设备上,如Jetson-NX。
* 水平特征剔除:在完成垂直剔除后,水平方向上的剔除使用与垂直剔除类似的MLPT方法。不同的是,水平剔除时由于内存布局的不同,无法实现内存合并,但通过减少内存事务的次数,仍能提高效率。
* 线程高效的warp分配 (TEWA):传统的线程分配方式会导致线程浪费,特别是在较小单元中。TEWA通过将多个单元分配给一个线程块来提高warp效率,从而减少线程浪费和内存开销,提高GPU的整体吞吐量。
2. 金字塔式特征聚合 (PFA)
PFA是PyCA的最终步骤,它在图像金字塔的每个尺度上处理通过FC检测到的特征。该步骤通过减少特征数量,降低特征匹配和立体匹配的计算量,从而降低整体运行时间,同时保持SLAM的准确性。
PFA的动机有两个:
* 多尺度设置:多尺度特征在SLAM中至关重要,因为它影响跟踪、定位和映射的精度。投影到原始尺度 (s0) 的特征因其跨尺度的一致性和独特性,需要优先处理。
* 特征匹配冲突:投影后的特征可能彼此接近,导致特征匹配器和立体匹配器出现混淆,同时增加计算时间。PFA通过消除这些冲突,减少了前端(特征提取)、中端(立体匹配、跟踪)和后端(优化)的计算量。
PFA包含三个步骤:
1. 将所有关键点投影到原始尺度,并在一个三维矩阵中存储它们的响应。
2. 为每个关键点计算两个指标:跨尺度的角点响应之和 (kr) 和检测到的尺度总数 (kl)。
3. 对这些指标进行非最大抑制 (NMS),仅在每个关键点附近的3x3窗口内稀疏地执行,以节省大量计算。
PFA在GPU上运行,避免了CPU和GPU之间的内存传输,提升了效率,特别是在核心资源有限的设备上如Jetson。
图3:Jetson-SLAM设计,重点展示了我们的贡献,包括边界修正、PyCA、同步共享内存 (SSM) 和中端 (Middle-end)。Jetson-SLAM通过利用这些技术,在多尺度立体场景下实现了高速和资源效率。
实验
总结
本文提出了一种面向低功耗计算设备的资源高效且精确的GPU加速Jetson-SLAM系统,提出了边界修正技术,以防止在FAST角点检测过程中将非角点误判为角点;同时提出了Pyramidal Culling and Aggregation (PyCA),该方法能够在多尺度和立体场景下以极高的速度提取高质量特征。PyCA基于我们的特征剔除 (FC)、金字塔特征聚合 (PFA)、**多位置单线程剔除 (MLPT)和线程高效的Warp分配 (TEWA)技术。我们还设计了视觉SLAM中的中端 (Middle-end)**模块,并开发了一个Jetson-SLAM库,该库利用同步共享内存来实现资源效率。Jetson-SLAM表现出极高的帧率,适合现代具有多个子系统的自主机器人系统。即使在多尺度和立体场景下,Jetson-SLAM在Jetson设备上也大幅超越了许多知名的SLAM方法。