参考
一. DBoW2词典里面存储的是什么数据
可以通过DBow2的源码进行解读,这也不是太难。
只要熟悉DBoW 里面k叉树的意义,就不难理解上表。
关系如上所示,其中的描述子是根据kmeans++算法进行依次选取,并且最后迭代收敛的结果。
二. ORB词典的理论依据
2.1 ORB词典主要用于回环检测
回环检测的目的:构建全局一致的轨迹和地图,减小累积误差
回环检测是一个独立的模块,主流视觉slam中检测回环的方式:词袋模型
依赖的库:DBow库
2.2 回环检测的方法
有以下两类:
(1)基于里程计的几何关系(odometry based)
仍然存在累积误差较大的问题,除非使用高精度传感器
(2)基于外观(Appearance based)
核心问题:计算图像之间的相似性
实现手段:设计一种方法,计算它们之间相似性评分:
评价相似程度的好与不好,对于图像来说是非常困难的,下面先引入感知偏差和感知变异的概念
2.3 准确率和回召率
False Positive称为感知偏差
False Negative称为感知变异
准确率:(算法检测出来的所有回环是真实回环的概率)
召回率:(所有真实回环被检测出来的概率)
二者是矛盾的,例如,某个阈值提高,使得算法检测变严格,那么准确率变高,但是同时检测出来的数量变少,也意味着漏掉了许多真实的回环,召回率变低了;算法更宽松,那么就与之相反。
以上另一种理解手段是,如下,无叉红框是回环,有叉红框不是回环,蓝色勾叉代表算法对回环的判断,算法严格,勾很少,基本都集中在无叉红框,准确率高,但是召回率低;算法宽松,勾很多,基本把无叉红框都覆盖了,但是也包含了许多有叉红框,召回率高,但是准确率也低了。
但在slam中,对准确率的要求高一点,对召回率反而还没那么高。
经过以上分析,我们要明确我们的目标是寻求一种方式来描述两幅图像的相似性,要考虑效率和合理性等因素。接下来就来说明为什么词袋模型是合理的。
2.4 词袋(bag of Words(BoW))模型
以一张图片来说,涉及的基础概念:单词(图片中的人、车、狗),字典(单词组合在一起形成字典),向量(描述一张图片,用单词出现的数量组成的vector)
强调单词的有无,无关其顺序;
接下来引申出来的问题:
(1)字典怎么来
(2)以上面的向量来描述图像,然后通过向量之差的范数,是否足够判断回环
2.5 字典
(1)字典的生成
聚类问题(clustering),使用经典的K-means算法解决。
字典的通用性是一个很重要的点,要保证当前环境中的图像特征都曾在字典里面出现过。
描述字典的方式有很多:k叉树,chou-liu tree
这里只介绍k叉树
(2)k叉树的定义(更具体的方式待详细书写)
分支为k,深度为d的树,第一层是k,第二层是,第三层是,依次类推,第d层是
中间的节点供快速查找使用
(3)具体的字典创建方式(结合代码)
总结起来就是:
1)把需要经历的所有环境图像,提取ORB特征点
2)再计算对应的描述子
3)使用DBoW3::Vocabulary中的create函数,利用2)中的描述子,生成词典(保存为.yml.zip文件)
(4)具体的对比图像相似度的方式(结合代码的总结)
总结起来就是:
1)计算两幅图像的ORB特征点和描述子
2)利用DBoW3::Vocabulary中的transform,针对上文的ORB描述子,在字典里面查找并计算Bow向量
3)通过score函数进行打分(即计算相似度)
3. DBoW2的使用
3.1 下载代码
GitHub - dorian3d/DBoW2: Enhanced hierarchical bag-of-word library for C++
这不是一个ros包,而仅仅是一个cmake工程包
mkdir build cd build cmake .. make
以上即可编译完成,运行demo即可。