SLAM BOW词袋重定位

本文介绍了SLAM中的BOW(Bag of Words)技术用于快速地方识别,重点讨论了DBOW和ORBSLAM2中的重定位方法。通过提取图像的二进制特征,构建词汇库,实现图像数据库和循环检测。DBOW使用二进制特征和词袋模型进行数据匹配和群组,确保时间一致性并进行几何验证。ORBSLAM2的重定位过程涉及根据词袋计算候选位姿,并进行PnP RANSAC优化。同时,VINS的重定位模块利用FBOW匹配特征点,进行回环检测。文章还探讨了如何将新图像添加到数据库以及VINS中FBOW的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。然后选择适当的创建参数,最后开始创建。整个过程需要一段时间完成。但是这是一个一次性的工作,一旦建立完成,就不需要再重复了。
这一步的图片数据库选择(图片的分布,数据量大小等),会影响之后的匹配结果,所以一定要仔细思考慎重选择。

    // vSIFTdescritpors is a set of sift feature points
    std::vector<cv::Mat> vSIFTdescritpors;

    // the vocabulary creation options
    fbow::VocabularyCreator::Params params;
    params.k = 10;
    params.L = 6;
    params.nthreads = 4;
    params.maxIters = 11;
    params.verbose = true;

    // create the creator
    fbow::VocabularyCreator voc_creator;
    std::cout << "Creating a " << params.k << "^" << params.L << " vocabulary..." << std::endl;

    // record time
    auto t_start=std::chrono::high_resolution_clock::now();
  
    // create the sift feature vocabulary
    try{
        voc_creator.create(voc,vSIFTdescritpors,"sift", params);
    }catch(std::exception &ex){
        std::cerr << ex.what() << std::endl;
    }

    // end of creation
    auto t_end = std::chrono::high_resolution_clock::now();
    std::cout << "time = " << double(std::chrono::duration_cast<std::chrono::milliseconds>(t_end-t_start).count()) << " msecs ";
    std::cout << " nblocks = " << voc.size() << std::endl;
    std::cerr << "Saving " << save_path << std::endl;
  
    // save the created vocabulary to file for further use
    voc.saveToFile(save_path);

3. 新图像匹配

同样,先提取新图片的特征点,转换为FBOW需要的格式,再调用 

<think>好的,我现在需要回答用户关于ORB-SLAM2中如何利用模型进行相似度计算的问题。首先,我需要回顾一下ORB-SLAM2的基本结构,特别是模型(Bag of Words, BoW)的应用部分。根据用户提供的引用内容,特别是引用[2]和引用[3],模型在ORB-SLAM2中用于重定位和闭环检测,其中向量存储了描述子对应的单ID和权重。 用户的问题主要集中在帧间相似度的计算方法。我需要分步骤解释这一过程。首先,模型的构建,可能涉及训练过程,使用大量的ORB特征描述子生成汇树,每个叶子节点代表一个单。然后,当新的帧进入系统时,提取其ORB特征,并通过汇树将每个特征映射到对应的单,形成该帧的向量。这个过程应该涉及到TF-IDF权重的计算,以衡量每个单的重要性。 接下来是相似度计算部分。根据引用[2]中的描述,向量是std::map类型,存储WordId和WordValue。相似度计算可能采用向量之间的余弦相似度,或者基于向量的交集或其他方法。需要查阅ORB-SLAM2的具体实现,可能发现其使用了L1范数或某种加权得分方式。例如,对于两帧的向量,遍历它们的共同单,累加权重乘积,然后归一化处理,得到最终的相似度分数。 此外,还需要考虑如何高效地计算这些相似度,尤其是在实时系统中。汇树的结构可能允许快速查找和匹配,减少计算量。同时,可能需要排除当前帧附近的关键帧,以避免重复匹配,提高闭环检测的准确性。 用户提供的引用[3]提到ORB-SLAM2处理单目、双目和RGB-D数据时,特征点的表示方式不同,但模型的应用应该是统一的,因为无论输入类型如何,都需要提取ORB特征并转换为向量。因此,相似度计算方法是独立于传感器类型的。 可能还需要提到一些优化措施,比如使用倒排索引来加速相似帧的检索,或者通过分组策略来减少比较次数。此外,权重计算中的TF-IDF部分,逆向文档频率(IDF)可能是在训练阶段预先计算好的,以反映单的区分能力。 最后,确保回答结构清晰,分点说明步骤,并正确引用提供的资料。例如,在解释向量时引用[2],在讨论特征点处理时引用[3]。同时,生成的相关问题需要与主题相关,如询问具体实现细节、优化方法或与其他SLAM系统的比较。</think>### ORB-SLAM2中模型计算帧间相似度的实现方法 #### 1. **模型构建** ORB-SLAM2通过离线训练的模型(基于DBoW2库)对ORB特征进行编码。训练时使用大量ORB描述子构建**汇树**,每个叶子节点对应一个“单”(视觉单)。汇树的层级结构允许高效的特征匹配和相似度计算[^2]。 #### 2. **特征编码为向量** 对于输入帧的每个ORB特征: - 提取描述子后,通过汇树逐层匹配,最终映射到叶子节点对应的**单ID**。 - 根据TF-IDF(频-逆向文档频率)计算每个单的权重,生成帧的**向量**,格式为`std::map<WordId, WordValue>`。 #### 3. **相似度计算步骤** 帧间相似度通过以下步骤计算: 1. **共同单筛选**:遍历两帧向量,找到共有的单ID。 2. **权重乘积累加**:对共有单的权重(WordValue)进行乘积累加,公式为: $$S(A,B) = \sum_{w \in A \cap B} \text{weight}_A(w) \cdot \text{text{weight}_B(w)}$$ 3. **归一化处理**:除以两帧向量的L1范数之和,防止偏向特征数量多的帧: $$S_{\text{norm}} = \frac{S(A,B)}{||A||_1 + ||B||_1}$$ 其中$||A||_1 = \sum_{w \in A} \text{weight}_A(w)$[^2]。 #### 4. **应用场景与优化** - **重定位**:当跟踪丢失时,用当前帧的向量与关键帧数据库快速匹配,找到相似候选帧[^1]。 - **闭环检测**:通过相似度阈值判断是否可能闭环,结合几何验证(如RANSAC)提高准确性。 - **优化技巧**:使用倒排索引加速检索,仅比较包含相同单的帧;通过分组策略减少计算量。 #### 示例代码片段 ```cpp // 向量生成(简化示例) DBoW2::BowVector bow_vec; pFeatureExtractor->computeBow(descriptors, bow_vec); // 相似度计算 float score = mpVocab->score(bow_vec1, bow_vec2); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值