ORB (Oriented FAST and Rotated BRIEF)

ORB(Rublee 等,2011)是驱动 ORB-SLAM 和许多实时视觉 SLAM 系统的关键点检测器 + 二值描述子组合。它被设计为 SIFT/SURF 的一种快速、无专利限制的替代方案:比 SIFT 快两个数量级,同时匹配质量足以胜任跟踪、重定位和回环检测的需求。正如其名字所暗示的,它是由两项改进拼接而成的:oFAST(带方向的 FAST)和 rBRIEF(带旋转感知的 BRIEF)。

oFAST:带方向的 FAST 关键点

FAST 通过检测候选点周围一圈 16 个像素来发现角点,但它既不提供尺度信息也不提供方向信息,其角点响应值在不同检测之间也无法比较。ORB 对这三个问题都作了修正:

mpq=x,ypatchxpyqI(x,y),θ=atan2(m01,m10)m_{pq} = \sum_{x, y \in \text{patch}} x^p y^q\, I(x, y), \qquad \theta = \operatorname{atan2}(m_{01},\, m_{10})

从角点中心指向图像块强度质心的向量给出了一个可重复的角度 θ\theta:旋转图像,θ\theta 也随之旋转。正是这一个角度使得描述子具有旋转不变性。

rBRIEF:经过引导且去相关的二值描述子

BRIEF 通过 nn 次二值强度比较来描述一个平滑后的图像块:对于一组预先定义的偏移对 (ai,bi)(\mathbf{a}_i, \mathbf{b}_i),第 ii 位为

τi={1I(ai)<I(bi)0otherwise\tau_i = \begin{cases} 1 & I(\mathbf{a}_i) < I(\mathbf{b}_i) \\ 0 & \text{otherwise} \end{cases}

从而给出一个 nn 位的比特串(ORB 中 n=256n = 256,即 32 字节)。普通的 BRIEF 在旋转下会失效,因此 ORB 会**引导(steer)**测试模式:在采样之前,所有点对都按关键点的方向 θ\theta 进行旋转(离散化到查找表中)。

然而,引导操作会破坏 BRIEF 一部分统计上的优良性质——经过旋转的测试变得更加相关,判别力也随之下降。ORB 的解决方案是rBRIEF:对大量候选测试对进行贪心的离线搜索,选出 256 个测试,使其同时具有高方差(均值接近 0.5,因此每一位都是有信息量的)和与已选测试低相关的特性。这样得到的结果在保留二值格式的同时,恢复了大部分损失掉的判别力。

匹配 ORB 描述子

二值描述子通过Hamming 距离(即不同位的数量)进行比较,其计算方式为 popcount(x XOR y),每对描述子只需几条机器指令。这使得对成千上万个描述子进行暴力匹配在实时场景下也可行,而 LSH 或基于词袋的倒排索引则用于处理地图规模的搜索。常规的过滤手段同样适用:最优与次优距离之间的 Lowe 比值检验、交叉检查,以及用 RANSAC 进行几何验证。

实践中

OpenCV 将 ORB 作为 cv::ORB::create() 提供,并直接暴露了那些重要的可调参数:要保留的特征数量、金字塔缩放因子和层数,以及 FAST 阈值。ORB-SLAM 中有两个实用的习惯值得借鉴:

对SLAM的意义

ORB 恰好命中了那个甜蜜点,使得基于特征的 SLAM 在 CPU 和嵌入式硬件上变得实用:在 30 fps 的预算内,轻松完成每帧约 1000 个特征的检测、描述与匹配,同时具备足够的不变性(金字塔带来的尺度不变性,oFAST/rBRIEF 带来的旋转不变性),足以支持宽基线匹配。ORB-SLAM 将其整个架构都建立在这一种特征之上——同一套 ORB 描述子既服务于帧间跟踪,也服务于局部地图匹配、重定位,以及通过视觉词袋词典进行的回环检测——这在很大程度上解释了该系统为何如此连贯而稳健。即便在深度学习时代,ORB 仍然是衡量学习型特征(SuperPoint 及其同类方法)的默认基线,在计算资源紧张时仍是务实的选择。

动手实践

相关条目