本文主要是介绍SLAM BOW词袋重定位,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
visual bag of words 词袋用于SLAM重定位
- DBOW
- Binary features
- Image database
- Loop detection
- A. Data base query
- B. Matching grouping
- C. Temporal consistency
- D. Efficient geometrical consistency
- 结果分析
- ORBSLAM2 中的Relocalization
- 根据词袋计算得到候选
- 下一步计算位姿
- 使用方法
- 1. 创建图像数据集并且提取对应的特征点数据
- 2. 创建Vocabulary
- 3. 新图像匹配
- 4. 增加新图片进数据库
- VINS 的重定位模块
- 使用FBOW匹配特征点
- 1. 首先整理关键帧图像数据库
- 2. 提取新输入图片的向量
- 3. 从数据库中匹配得到匹配值最高的图片
- 4. 选取candidate进行特征点匹配
- ORBSLAM2 implementation DOW2
DBOW
bags of binary words for fast place recognition in image sequence (https://ieeexplore.ieee.org/document/6202705) 这篇文章参考了前文,是ORBSLAM2中重定位模块的基础。首先按照文章的结构介绍这一篇文章。
Binary features
- 文章中使用FAST特征点和BRIEF描述子。
- FAST和BRIEF特征点计算速度快。
- 使用二进制的BRIEF描述子计算二进制距离可以使用位运算符(xor),计算hamming距离。
Image database
- 预先离线收集图像,建立vocabulary。主要包括Inverse index 和Direct index。Inverse index是针对每一个词袋的单词,并且记录每个单词在每个关键帧的权重。Direct index是对每个层的记录,记录了在一张图片在当前层有哪些节点包含了图片中的特征word。
- 使用k means和k medians clustering。使用tf-idf作为权重。
- Inverse index是为了以后计算中更快的访问每个单词的权重。
- Direct index是为了更加方便的存储每张图片的每个节点的特征信息。
- 对于一张新图片,对每个特征点在词袋中寻找hamming距离最近的word。最终encoding成一个t维的向量(t为单词的数量)。
Loop detection
A. Data base query
- 简单的来说就是寻找队列中距离最近的一个关键帧。
- 文章中使用一个归一化的score。具体定义可以参见原文章。
B. Matching grouping
- 如果当前的图片和候选人X很“接近”,那么当前图片和X邻近的的一些关键帧也会同样接近。这不是我们想要的。
- 所以文章提出讲候选图片先grouping据类成一个个island。每个island中只会有一个最终的结果。
C. Temporal consistency
- 如果当前图片和某一个候选人很接近,那么上一帧应该和这个候选人很接近才对。
- 所以下一步的检验是候选人帧和上一帧的匹配检测。
- 最终得到最终候选人。
D. Efficient geometrical consistency
- 在获取最终的候选人之后要进行几何验证。
- 首先是使用之前的Direct index找到可能相似的特征匹配候选。
- 使用RANSAC fundament matrix匹配。
结果分析
- BRIEF特征点找到的匹配大多数是中距离和远距离的。因为BRIEF没有scale信息。
- SURF特征点点对近距离的特征效果更好。
ORBSLAM2 中的Relocalization
根据词袋计算得到候选
- 这一个流程基本和前面的ABC思想一致。
- 在所有关键帧中找与当前帧有公用单词的帧。
- 提取中存在足够过共有单词的关键帧。
- 计算相似分数,并且根据co-visibility累积分数。
- 返回所有高分的候选。
下一步计算位姿
- 类似上面的C步骤,使用Direct Index寻找特征点匹配。
- 使用PnP RANSAC,寻找更加准确的匹配点,并且设置位姿初始值。
- Pose optimization (bundle adjustment)优化位姿,得到最终结果。
使用方法
下面以FBOW为例子,介绍BOW的整个使用步骤。
1. 创建图像数据集并且提取对应的特征点数据
提取方式有很多,这里就不赘述了。
2. 创建Vocabulary
根据上面提取的特征点数据,将描述子的格式转变为一个vector。然后选择适当的创建参数,最后开始创建。整个过程需要一段
这篇关于SLAM BOW词袋重定位的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!