Brute-Force Matching

暴力(brute-force, BF)匹配是描述子匹配中精确、穷举式的方法:将图像1中的每个描述子与图像2中的每个描述子逐一比较,保留最近邻(或前 kk 个最近邻)。对于 nnmm 个特征点、描述子维度为 dd 的情况,代价为 O(nmd)O(n \cdot m \cdot d)。它是每一种近似方法(FLANN、kd-树、LSH)用来衡量自身的基准——而对于逐帧SLAM中典型的描述子数量而言,暴力匹配往往就是正确的选择。

距离度量

d(a,b)=ab2d(\mathbf{a}, \mathbf{b}) = \lVert \mathbf{a} - \mathbf{b} \rVert_2

dH(a,b)=popcount(ab)d_H(\mathbf{a}, \mathbf{b}) = \mathrm{popcount}(\mathbf{a} \oplus \mathbf{b})

一个256位的ORB描述子只占32字节,而XOR加popcount都是单条机器指令,因此一次完整的Hamming比较只需寥寥几个周期。这正是二值描述子让暴力匹配从瓶颈变成CPU上可以日常穷举执行、在GPU上更是轻而易举的原因。

过滤原始匹配结果

仅凭最近邻距离本身是一个较差的接受准则;几种标准过滤方法可以剔除歧义和错误的匹配:

d1d2<τ(τ0.8)\frac{d_1}{d_2} < \tau \qquad (\tau \approx 0.8)

时才接受该匹配。一个有区分度、正确的匹配应当比次优候选明显更近;如果两个候选几乎等距,那么该匹配是有歧义的(例如重复纹理),应予以丢弃。仅这一项检验就能消除很大一部分错误匹配。

何时暴力匹配胜出——何时不然

暴力匹配是精确的,没有构建时间或调参参数,并且极易并行化(SIMD、GPU)。对于两帧图像各含几千个特征点的匹配场景,它已经足够简单和快速。当数据库端规模很大且要被多次查询重复使用时——场景识别数据库、针对大地图的重定位、拥有数万张图像的离线SfM——近似最近邻结构才会真正带来收益。

在一个正在运行的SLAM系统内部,甚至暴力匹配也常常被完全避免:一旦有运动预测可用,特征就通过投影引导搜索来匹配——将地图点投影到当前帧,只在预测位置周围的一个小窗口内比较描述子。这将候选集合从”所有特征”缩小到”少数邻近的特征”,比任何全局匹配都更快、歧义也更少。

对SLAM的意义

数据关联(data association)是前端的核心任务,而结合比值检验或交叉检验的暴力匹配是获得初始化、宽基线关键帧匹配以及回环检测验证所需的候选对应关系的经典方式。理解它的开销结构——以及二值描述子加Hamming距离如何让穷举搜索变得廉价——能解释ORB-SLAM等系统中的重大设计选择,也能让我们清楚地判断近似搜索(FLANN、LSH、词汇树查找)所增加的复杂度在何时才是值得的。

相关条目