FAST (Features from Accelerated Segment Test)

FAST(Rosten & Drummond, 2006)是一种专为一件事而设计的角点检测器:速度。它不像Harris/Shi-Tomasi那样计算图像梯度和结构张量,也不像SIFT那样构建尺度空间,而是通过对候选像素周围一个小圆上若干像素的强度比较来判定是否为角点——足够廉价,可以在高帧率下对每一帧的每个像素运行,这使它成为实时SLAM前端(PTAM、SVO,以及通过ORB衍生出的ORB-SLAM系列)默认使用的检测器。

分段测试(segment test)

考虑一个强度为 IpI_p 的候选像素 pp,以及以其为中心、半径为3的Bresenham圆上的16个像素。如果在该圆上存在一段至少 nn 个像素组成的连续弧,且这些像素相对于阈值 tt 都明显比 pp 更亮或都明显比 pp 更暗,则将 pp 判定为角点:

xarc:Ix>Ip+txarc:Ix<Ipt\forall x \in \text{arc}: \quad I_x > I_p + t \qquad \text{或} \qquad \forall x \in \text{arc}: \quad I_x < I_p - t

经典的选择是 n=12n = 12(FAST-12:16个像素中的12个),这允许一个非常有效的高速测试:只检查四个罗盘方向的像素(上、右、下、左——位置1、5、9、13)。如果存在一段12像素的连续弧,那么这四个像素中至少三个必须比 Ip+tI_p + t 更亮或比 IptI_p - t 更暗;如果通过的少于三个,pp 在仅仅四次比较之后就会被拒绝。由于绝大多数图像像素都不是角点,这种早退机制主导了平均开销。

机器学习变体

手工编码的罗盘测试有两个弱点:它不能推广到 n<12n < 12 的情形,且固定的提问顺序对真实图像统计而言并非最优。因此Rosten和Drummond学习了这个检测器:圆上的16个像素相对于 IpI_p 各自被分类为更亮/更暗/相似,并用一棵决策树(用ID3算法构建,最大化信息增益)学习出能以最少期望比较次数在训练图像上分类角点的像素查询顺序。这棵树被编译为嵌套的if语句。正是这种方式让FAST-9(n=9n = 9)——通常是最具可重复性的变体——变得实用,也正是OpenCV的cv::FastFeatureDetector所实现的内容。

非极大值抑制

分段测试会在单个角点周围的许多相邻像素上都触发响应。为了让每个角点只保留一个响应,需要为每个检测点计算一个角点分数

V=max ⁣(xSbright(IxIp)t,    xSdark(IpIx)t),V = \max\!\left( \sum_{x \in S_{\text{bright}}} (I_x - I_p) - t,\;\; \sum_{x \in S_{\text{dark}}} (I_p - I_x) - t \right),

即支持弧的最大总对比度,然后非极大值抑制只保留 VV 在3×3邻域内的局部极大值。在SLAM前端中,检测结果还会额外在图像网格上分桶,使特征覆盖整个画面,而不是聚集在某一块纹理丰富的区域。

变体

FAST能给你的东西

对SLAM的意义

特征检测在跟踪循环中对每一帧都要运行,因此其开销直接限制了嵌入式硬件上可达到的帧率。FAST让完整的检测-描述-匹配流水线在CPU上实现了实时运行——PTAM在跟踪中使用FAST,SVO用FAST角点作为深度滤波器的种子点,VIO前端(VINS-Mono、多种MSCKF实现)检测FAST角点并用KLT跟踪它们,而ORB(oFAST + rBRIEF)把它变成了ORB-SLAM系列的完整特征方案。理解分段测试同样能解释你在实践中会观察到的FAST的失效模式:在噪声下边缘处产生响应、在高对比度纹理上聚集,以及对运动模糊的敏感性(当梯度被模糊涂抹时,圆上的对比度会崩溃)。

动手实践

相关条目