摘要
提出了一种基于网格的运动统计方法(GMS)以剔除特征误匹配,该方法将平滑性约束融入到分离的统计框架中,并使用网格进行快速计算。GMS对于各种具有挑战性的图像变化是鲁棒的,包括视点、比例和旋转。它的速度也很快,例如,处理了50K个匹配使用一个CPU线程只需要1或2毫秒。这对实时应用有重要的意义。使用c++和OpenCV库(Bradski 2000)来实现算法。代码已经集成到OpenCV库中。
图1 GMS匹配。尽管比率检验(RT)可以消除ORB产生的许多错误匹配,但在应用中,其结果仍然有噪声(a)。为了解决这个问题,提出了GMS,该GMS进一步消除了运动不一致的对应,从而实现了高精度匹配(b)
GMS在单个CPU线程中的运行时间。GMS- S和GMS- R表示使用不同的设置分别重复基本GMS 5次和8次,运行时间线性增加。图中没有显示的GMS- SR比基本的GMS消耗了40倍的计算成本。注意,多尺度和多旋转的解决方案可以通过使用多阈值编程来加速,因为在不同的重复中不存在数据依赖性
相关工作
1. 运动统计
图2.运动统计。真匹配通常比误匹配有更多的相似邻,所以我们计算相似邻的数量来识别更好的匹配。相似邻指的是两幅图像中与参考匹配接近的匹配。
设C为图像
I
1
I_1
I1和
I
2
I_2
I2之间的所有匹配,
c
i
c_i
ci为连接两个图像间的点
p
i
p_i
pi和
q
i
q_i
qi之间的匹配。将
c
i
c_i
ci的邻居定义为:
近似邻定义为:
其中 d ( ) d() d()为两点的欧氏距离, r 1 , r 2 r_1,r_2 r1,r2为阈值。根据 S i S_i Si中元素的数量( ∣ S i ∣ |S_i| ∣Si∣),表示对 c i c_i ci的运动支持。
- 对
∣
S
i
∣
|S_i|
∣Si∣的分布进行建模-二项分布,得到:
∣ N i ∣ |N_i| ∣Ni∣为 c i c_i ci的邻居数量。 t t t和 ϵ \epsilon ϵ分别是真、假匹配被它的邻居支持的概率。
-
∣ S i ∣ |S_i| ∣Si∣的期望和方差:
-
真、假匹配之间的可分性(正确匹配和误匹配之间的gap)定义为:
这意味着当特征数量足够大时,基于 ∣ S i ∣ |S_i| ∣Si∣的真、假匹配的可分性会越来越可靠,以使它有可能获得可靠的匹配。在困难的场景,只需增加检测特征的数量。此外,改进特征质量也可以提高可分性。我们的目标是设计使P最大化的算法。
- 通过简单的阈值化
∣
S
i
∣
|S_i|
∣Si∣来将
c
i
c_i
ci划分为真或假,给出:
α α α取4 - 6。实验中取4。
其中, t t t和 ϵ \epsilon ϵ的计算如下:
其中m是区域b中特征点的数量,M是整张图中的特征点的数量。
2. 基于网格的框架
将两个图像分别划分为不重叠的单元 G 1 G_1 G1和 G 2 G_2 G2(经验值:20*20)。假设 c i c_i ci是落在单元格 G a G_a Ga和 G b G_b Gb中的对应,如图3中的一个红色对应。
c
i
c_i
ci的邻居被重新定义为:
c
i
c_i
ci的相似邻被重新定义为:
把一个单元中的匹配看作是邻居,把一个单元对中的匹配看作是相似邻,这样就避免了匹配之间的显式比较。为了获得对所有匹配的运动支持,我们只需要将它们放入单元对中。通过这种方式,整体复杂度降低到O(N)。
此外,并没有确定所有可能的单元对,而是只检查第一张图像中每个单元中包含最多匹配的最佳的一个单元对。例如,在图3中,我们只检查 G a b G_{ab} Gab,抛弃 G a c G_{ac} Gac和 G a d G_{ad} Gad。这一操作大大减少了单元对的数量,并早期剔除了相当数量的误匹配。
图3基于网格的框架。我们使用预先计算的网格来寻找相似的邻居,而不是显式地比较点之间的距离
如果单元太小,近邻数目就会变少,这样会影响性能。但如果单元格很大,就会将误匹配包括在内。为了解决这一问题,将网格的大小设置为小的精度,并提出运动核来考虑更多的邻居。
图4显示了基本的运动核,考虑了额外的8个单元对( C a 1 b 1 , … , C a 9 b 9 C_{a^1b^1},…,C_{a^9b^9} Ca1b1,…,Ca9b9)用于对原始单元对( C a b C_{ab} Cab)进行分类。
3. Multi-scale and Multi-rotation
3.1 多旋转
基本内核假设两个图像之间的相对旋转很小。为了匹配具有显著旋转变化的图像对,我们可以旋转基本内核。
图5:旋转运动内核。我们将第一张图像中的图案固定,然后顺时针旋转第二张图像中的图案,总共产生8个运动核来模拟可能的相对旋转
通过旋转基本内核来模拟不同的相对旋转,总共得到8个运动内核,如图5所示。在现实问题中,旋转往往是未知的,所以我们使用所有的运动核来运行GMS算法,以检索到匹配最多的核。
3.2 多尺度
可以在网格框架中模拟两幅图像之间的相对比例,即固定一幅图像的单元格大小(单元格数),改变另一幅图像的单元格大小。
假设两幅图像被分成 n × n n×n n×n个单元格。我们将第二幅图像的单元格数改为 ( n ⋅ α ) × ( n ⋅ α ) (n · α) × (n · α) (n⋅α)×(n⋅α)。 α α α可选{ 1 2 , 2 2 , 1 , 2 , 2 \frac{1}{2} , \frac{\sqrt2}{2} , 1, \sqrt2, 2 21,22,1,2,2}。
类似地,使用所有预定义的相对尺度运行GMS并收集最佳结果。(仅提供了5个相对尺度来证明我们的解决方案对于解决尺度问题是有效的。)
4. 实验
4.1 尺度与旋转
图10:GMS可视化结果。在每个数据集的最具挑战性的一对上显示匹配结果,其中最多绘制了100个匹配,以获得清晰的可视化
4.2 精度和召回率
将GMS与传统的比率检验(阈值0.66)进行比较。精度、召回率和F-measure(Precision和Recall加权调和平均)如表8所示。GMS为红色,比率测试为蓝色。GMS的F-measure始终比比值检验高得多。
4.3 性能和速度
性能是量化的百分比准确估计姿态,而速度是衡量的log时间毫秒。CPU上的计算开销为1ms,与GMS完全匹配的速度为每秒27.8帧。
4.4 SLAM
在ORB-SLAM的初始化阶段,将原来的基于词袋的匹配替换为蛮力最近邻匹配,并应用GMS来选择好的匹配。选中的匹配用于恢复几何图形,并通过三角化创建3D地图。为了系统的稳定性,我们使用默认的特征检测参数,即检测4K分布良好的ORB特征点,以便在KITTI-like图像中进行初始化。
数据集的每个序列裁剪成不重叠的片段,每个片段包含20个连续的帧。在每个片段中报告所有片段的平均性能,测量(1)初始化是否成功;(2)系统初始化的速度;(3)生成多少三维点。(1)将估计出的相机位姿与地面真实值进行比较,旋转和平移的位姿误差均小于5度即认定为成功。对于(2),我们报告每个片段中第一个成功初始化的图像的顺序。
表6:与原始初始化器进行了比较。它表明,提出的初始化器可以显著提高成功率、更快的初始化速度和更密集的3D地图