比FAST更快!TX2上跑1000FPS!高速VIO特征 | 基于GPU前端加速的增强型特征检测器

2020 年 4 月 11 日 CVer

点击上方“CVer”,选择加"星标"或“置顶”

重磅干货,第一时间送达

本文转载 自:AI深度视线
本文提出一种选择 局部最大响应 方法,并提出一种 增强的FAST特征检测器 ,在Jetson TX2上特征检测和跟踪速度高达 1000 FPS! 代码刚刚开源
作者团队:苏黎世大学& ETH Zurich
论文:https://arxiv.org/abs/2003.13493

代码:https://github.com/uzh-rpg/vilib



1

引言




本文提出一种选择 局部最大响应 方法,并提出一种 增强的FAST特征检测器 ,在Jetson TX2上特征检测和跟踪速度高达 1000 FPS!代码刚刚开源!VIO pipeline的大多数步骤都在视觉特征上起作用,它们依赖于 图像数据进行检测和跟踪 这两个步骤都非常适合并行化 。特别是非最大值抑制和随后的特征选择是整个图像处理延迟的主要来源。

本文贡献
  • 首先回顾了专门针对GPU进行特征检测的非极大值抑制问题,并提出了一种选择局部最大响应,施加空间特征分布并同时提取特征的解决方案


  • 第二个贡献是引入了一种增强的FAST特征检测器,该检测器应用了上述非极大值抑制方法

  • 最后,与其他最新的CPU和GPU实现进行了比较,在特征跟踪和检测方面始终优于所有其他实现,从而在嵌入式Jetson TX2平台上实现了超过1000 FPS。此外,我们展示了我们的工作已集成到VIO管道中,以约200fps的速度实现了姿态评估



2

问题


  • 延迟
尽管视觉惯性里程表(VIO)成本低,通用性强,并且成熟度和健壮性提高,但它在计算上仍然很昂贵,并有显着的延迟。该等待时间影响例如引入晕动病的VR/AR应用程序,或成为通过其控制机器人系统性能的限制。
  • 计算能力
可用的传感器功能(视觉和惯性器件)与移动系统的实际信息处理功能之间存在脱节。现成的相机能够捕获100fps以上的图像,但许多算法和实现方式都无法以这种速率处理视觉信息。
目前流行的异构体系结构有三种:
  • 第一种使用带有数字信号处理器(DSP)的中央处理器(CPU),因此限制了任务集;
  • 第二个结合了一个CPU和可编程序逻辑(e.g.FPGA),这是多才多艺但增加开发时间;
  • 第三种解决方案是一个CPU与GPU的结合,这不仅是合算的,还擅长图像处理任务由于GPU为高度并行的建造任务。
在此基础上作者研究了第三种 ——结合CPU-GPU平台的特征检测和跟踪 从GPU硬件的角度构建图像处理,提出了在CPU和GPU之间可行的工作共享,以显着降低总体处理时间



3

主要思路




3.1 并行化简介


Compute Unified Device Architecture(简称CUDA),是NVIDIA专有的并行计算平台和编程模型。
  • CUDA允许开发人员卸载中央处理单元,将任务传给GPU,甚至用于非图像相关计算。
  • NVIDIA GPU体系结构是围绕可扩展的多线程流式多处理器(SM)阵列构建的。每个SM都有大量的流处理器(SP),又称为CUDA内核。
  • GPU通常每个SM具有1-20个流多处理器和128-256个流处理器。
  • 除了处理核心之外,还有各种类型的可用内存(按与处理核心的接近程度排序):寄存器文件,共享内存,各种高速缓存,片外设备和主机内存。

NVIDIA的GPGPU执行模型引入计算单元的层次结构:
线程,线程束,线程块和线程网格
  • 最小执行单位是线程。
  • 多个线程组成线程束:每个线程束包含32个线程。
  • 线程束进一步组成线程块。
  • 最后是线程网格,线程网格是线程块的数组。线程网格中的线程块彼此独立执行。
GPU上的指令执行需要强调:线程束中的每个线程都以锁定步骤执行同一条指令, NVIDIA将此执行模型称为单指令多线程(SIMT)。在表I中,总结了可用于在GPU上的执行块之间交换数据的最快内存。


3.2 特征检测器概述


GPU特别适合特征检测,每个计算单元都以并行方式访问输入元素(例如,像素)及其近邻。因此,可以在可用的CUDA核心之间有效地划分图像,从而使存储器访问合并在一起,从而实现高效的并行化。

为了进行特征检测:

(1) 对输入图像进行子采样以获取图像金字塔。

(2) 对于每种图像分辨率,通常在每个像素处评估两个函数:粗角响应函数(CCRF)角响应函数(CRF)

注:CCRF是一种快速评估,可以迅速排除大多数候选者,因此速度较慢的CRF功能仅接收通过首次验证的候选者。一旦在ROI内评估了每个像素,便会应用非最大值抑制来仅选择局部最大值。

算法1总结了特征检测器算法的一般执行方案。图像帧上均匀的特征分布能够提高VIO流程的稳定性。

为了满足这一要求,引入了二维网格单元的概念

  • 将图像划分为具有固定宽度和高度的矩形

  • 在每个单元中,只有一个特征被选中-该特征的CRF得分在该单元中最高

这种方法不仅将特征均匀地分布在图像上,而且还对提取的特征计数施加了上限



3.3 CUDA的非极大值抑制


单元内的特征选择可以理解为归约操作,其中仅选择具有最大分数的特征。此外,邻域内的非最大值抑制也可以视为一种归约操作,可以减少对有限邻域内的单个像素位置的角点响应。

作者将角点响应图分为规则的单元格网格。为了简化说明,在32x32单元中使用了1:1的warp-to-cell映射。

  • wrap读取单元格的第一行 时,wrap内的每个线程都获得了一个像素响应。
  • 整个wrap开始邻域抑制 :每个线程都验证其响应是否在其摩尔邻域内达到最大值。邻域验证完成后,一些线程可能会抑制其响应。
  • wrap继续到下一行,并重复之前的操作 。线程将在所有单元格中继续执行此操作,直到处理完整个单元格为止。

为了加快还原速度,多个warp处理一个单元,因此,在warp级别减少之后,共享内存中的最大值将减少。一旦线程块中的所有warp将其最大结果(分数,x-y位置)写入其指定的共享内存区域,则该块中的第一个线程将为每个单元选择最大值并将其写入全局内存,从而完成该单元的处理。


3.4 FAST特征检测器


FAST角点检测方法比较基础,这里不再赘述,可以归结为下式:


  • FAST中避免计算散度


如果每个线程在NVIDIA单指令多线程(SIMT)执行模型中执行(1)的比较,则if/else指令中的比较将执行不同的代码块。由于所有线程都在wrap中执行同一条指令,因此某些线程在if分支期间处于非活动状态,而其他线程在else分支期间处于非活动状态。这称为代码发散,会显著降低并行化的吞吐量


作者的方法是将16个比较的结果存储为一个位数组,用作查找表的索引。预先计算了所有可能的16位向量。由于所有2^16个向量的结果都是二进制的,因此结果可以存储在2^16位(即8KB)中。可以使用4字节整数存储这些结果,每个整数存储32个组合。该表的缓存命中率高于以前的方法,改善了延迟问题



3.5 Lucas-Kanade特征跟踪器


作者的方法是将金字塔逆合成Lucas-Kanade算法部署为特征跟踪器。逆合成算法是一种扩展,通过允许预先计算海森矩阵并在每次迭代中重用它,改进了每次迭代的计算复杂度。同时逆合成的Lucas-Kanade增加了仿射光照变化的估计。

该算法能够将多个金字塔级别上每个要素周围的矩形邻域中的光度学误差最小化。但是,

(1) 如果warp中的线程处理了不同的功能,则内存访问将无法处理,
(2) 如果某些功能轨迹未收敛或同一级别的迭代次数不同,则warp中的某些线程将处于空闲状态。
为了解决这两个问题, 启动了整个warp来处理一个特征。另外还选择了可以通过warp协同处理的矩形补丁尺寸 :在高分辨率16x16上,和低分辨率8x8像素上。

该方法的新颖之处在于线程到功能的分配。以前提出的方法使用的是一对一分配,这意味着只有较大的特征数才能使用大量线程。这会对功能计数较小的GPU上的延迟隐藏产生不利影响,这通常适用于VIO。作者的方法通过使wrap协同解决特征补丁来加快算法的速度,减少了每个线程的工作量,同时使用了最快的通信介质



4

实验及结果



  • 硬件


  • 非极大抑制


  • 特征检测器




  • 特征跟踪


  • 视觉里程计 VIO

在嵌入式Jetson TX2平台的多个数据集上实现∼200fps。


重磅!CVer-SLAM 微信交流群已成立


扫码添加CVer助手,可申请加入CVer-SLAM 微信交流群,目前已汇集750人!涵盖SLAM、VSLAM、视觉里程计等。互相交流,一起进步!


同时也可申请加入CVer大群和细分方向技术群,细分方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索、论文投稿&交流、PyTorch和TensorFlow等群。


一定要备注:研究方向+地点+学校/公司+昵称(如SLAM+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群

▲长按加群


▲长按关注我们

麻烦给我一个在看!


登录查看更多
0

相关内容

基于改进卷积神经网络的短文本分类模型
专知会员服务
25+阅读 · 2020年7月22日
专知会员服务
31+阅读 · 2020年4月24日
【Google】利用AUTOML实现加速感知神经网络设计
专知会员服务
29+阅读 · 2020年3月5日
专知会员服务
86+阅读 · 2019年12月13日
深度神经网络模型压缩与加速综述
专知会员服务
128+阅读 · 2019年10月12日
【泡泡图灵智库】GCNv2:高效关联预测实时SLAM(arXiv)
泡泡机器人SLAM
44+阅读 · 2019年4月15日
1500+ FPS!目前最快的CNN人脸检测算法开源
极市平台
25+阅读 · 2019年3月15日
基于手机系统的实时目标检测
计算机视觉战队
8+阅读 · 2018年12月5日
Maplab:研究视觉惯性建图和定位的开源框架
泡泡机器人SLAM
16+阅读 · 2018年4月4日
【泡泡一分钟】基于CNN特征的SeqSLAM闭环实时性检测
泡泡机器人SLAM
10+阅读 · 2018年4月4日
Arxiv
4+阅读 · 2020年3月27日
SlowFast Networks for Video Recognition
Arxiv
4+阅读 · 2019年4月18日
Arxiv
3+阅读 · 2018年5月20日
Arxiv
8+阅读 · 2018年5月17日
Arxiv
8+阅读 · 2018年4月8日
VIP会员
相关VIP内容
相关资讯
Top
微信扫码咨询专知VIP会员