https://blog.csdn.net/qq_24893115/article/details/52629248
将会从以下四个方面进行展开
关于词袋模型的基本理解
算法简介
开源代码库DBoW2库的简单介绍
关于DBoW的一些总结
关于词袋模型的基本理解
BoW基本简介
Bag of words模型最初被用在文本分类中,将文档表示成特征矢量。它的基本思想是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。
如果文档中猪、马、牛、羊、山谷、土地、拖拉机这样的词汇多些,而银行、大厦、汽车、公园这样的词汇少些,我们就倾向于判断它是一篇描绘乡村的文档,而不是描述城镇的。
举例说明
文档一:Bob likes to play basketball, Jim likes too.
文档二:Bob also likes to play football games.
基于这两个文本文档,构造一个词典:Dictionary = {1:”Bob”, 2. “like”, 3. “to”, 4. “play”, 5. “basketball”, 6. “also”, 7. “football”,8. “games”, 9. “Jim”, 10. “too”}。
基于上述的词典可以构造出一个两个直方图向量
1:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
2:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0]
这两个向量共包含10个元素, 其中第i个元素表示字典中第i个单词在句子中出现的次数. 因此BoW模型可认为是一种统计直方图 (histogram).
应用词袋模型的图像处理
这是一个万能的词袋模型示意图
其实整个过程是这样实现的
算法简介
应用在视觉SLAM中的回环检测
在SLAM过程中,回环检测显得尤为重要,当失去回环检测时,整个SLAM过程就会退化成一个视觉里程计。
在回环的过程中,如何确定什么时候回环,需要比较当前图像信息与先前图像的相似性。
但并不是每次回环都会这么友好,还会受到各种影响,有天气、阴影等带来的,所以往往就会识别错误,错误情况分为两种,在应该回环的时候没有识别出来;在不应该回环的时候认为是回环了。
介绍词袋模型
1、特征提取与描述
2、词袋组成与结构
3、回环检测流程
4、实验评估
参考论文:
Galvez-Lopez D, Tardos J D. Real-time loop detection with bags of binary words[C]// IEEE/RSJ International Conference on Intelligent Robots & Systems. 2011:51-58.
Galvez-López D, Tardos J D. Bags of Binary Words for Fast Place Recognition in Image Sequences[J]. IEEE Transactions on Robotics, 2012, 28(5):1188-1197.
特征提取与描述
这里主要按照参考论文进行关于词袋的讲解,所以主要以FAST+Brief为主,读者可以根据需要选择ORB、surf等。
FAST特征点:
FAST特征点的提取比较简单,遍历图像各个像素点,以当前像素点为中心,3为半径选择16个周围像素,依次进行比较,灰度差异值大于给定阈值的就标记一下,若大于12,则当前点为特征点。
论文的特色在于使用了Brief描述子(二进制),可以满足内存、运算速度等实际需要
最后的描述子是一个256bit的向量,在比较特征点相似性的时候可以使用汉明距离,所以有点比较明显。当然没有具备旋转以及尺度的不变性。在ORB_SLAM2中则使用多尺度的ORB描述子,有兴趣可以去看一下。
言归正传,接下来要进入正题了!!
词袋组成与结构
1、词典生成流程
在目前流行的SLAM过程中,但凡用了回环检测的,基本上都使用了BoW,包括号称鲁棒与效果兼备的ORB_SLAM;使用词袋模型分为两个步骤,产生一个词典,然后利用这个词典,前者是离线生成的,注意是离线生成的(就像小时候看书的时候还没认识那么多字,但是想看书,怎么办,去书店买一本词典吧,一遍读,一遍看;可能这个比方不是很恰当);在后面的步骤中,需要产生一个数据库,用了记录一下查词典时所用到的单词,方便回来看的时候能快速找到,不用辛辛苦苦的再去找一遍。
在实际使用的过程中,第一步我们得训练产生一本词典,就像前面提到的那样,单词就是一些特征聚类的结果。摆在我们面前的可能是几十万甚至几百万张训练的图片,我们需要依次提取特征,这真是个浩大的工程,然后在特征空间中就会有n多个特征信息,接下来我们要用这些特征聚类产生单词了,聚类成多少?这是个问题,这取决于我们选择的树形结构(后面会提到),整个过程就像下面图一样
黑色的就是最原始的,提取到的特征,为了简单,把这些特征放在二维空间了,实际上应该256维的,所以上面这张中,这些特征点和他们在实际图片中的位置信息没有任何关系。
黑色—>红色—>绿色—>蓝色,这就是聚类的步骤,黑色的特征聚类成红色节点,红色节点聚类成绿色节点,然后绿色节点再聚类成根节点(蓝色)
Vocabulary branch factor:kw
Vocabulary depth levels :Lw
整个步骤流程如下图
:产生词典树形结构的步骤:
所有特征描述子分布在特征空间->
根据设定好的树形结构参数,进行kmean++聚类,产生叶子结点->
对产生的节点依次进行kmean++聚类,直至产生根节点。
结点个数(等比数列):
2、inverse index word
1、逆序索引单词涵盖了所有出现的单词
2、每一个单词指向包含它的一系列图像
3、采用投票机制选取候选者,加速搜索
加快搜索示意图
3、direct index image
主要用途:
在回环检测的最后阶段——几何结构验证阶段,可以加速匹配候选图像与当前图像之间的特征点对
结构如下图所示,左图是2011会议论文所采用的存储结构,以word为单位,右图是2012在TRO期刊上使用的存储结构,以node为单元。
回环检测流程
1、基础知识介绍
2、数据库查询
3、组匹配
4、时间一致性校验
5、结构一致性校验
1、基础知识介绍
这时候要要利用了训练之后的词典了。BoW模型主要就是利用了训练词典产生了高度差异型模型,因此每一张图片通过词典检索,都会得到一个独一无二的直方图向量,向量的维度就是词典个数(一般都是100万)。在具体写程序的时候不会产生这么大一个维度的链表,可以有一个等效的模型。
从图像—>BoW向量流程:
1、输入一张图像I,进行特征检测与特征描述,特征点数量最多不超过约定值(300)。
2、将每个特征通过树形结构的字典,得到BoW向量v,该向量的维度为特征数量(程序中),论文中认为维度为叶节点(words)数量。
其中向量v的数据单元结构为map—>(index , value)即(word index,weight)
Word index解释如下:
将每个特征从树形字典的根节点叶节点(words),依次与当前所在节点的子节点进行比较,选取汉明距离最小的节点作为中继节点,以此类推,直到所在节点为叶节点
Weight解释如下:
每个单词的权重有一个归一化过程,权重的组成由tf和idf两部分构成,对于前者,分子为当前图片中出现单词i的个数,分母为总共包含的单词个数,这是在线得到的;后者是词典的属性,已经离线生成,不会发生改变,分子为生成词典时所包含的训练图片数量,分母为出现单词i的图片个数,这个比重分量主要为了凸显差异型,认为在训练时经常出现的单词差异性较小,权重赋予的小一些,举例:如果一个单词在每一张图片都能出现,那么词典所给予的权重分量应该是0,因为太常见了,所以会忽略它。
在得到了两张图片的BoW向量之后,需要比较两者的相似性:
给出公式:
在实际程序中公式如下:
注:L1-score指的是一范数得分,后面的绝对值也指的是求取一范数,最后得到的是一个标量
实际中不可能存一个100万维的BoW向量,向量是稀疏的,只存下出现某个单词的索引及权重
论文和实际公式等效:
一些需要用的基础知识和结构已经介绍完了,接下就是回环检测了
回环检测:数据库查询
查询的数据库就是上述在线更新和维护的inverse index word
利用inverse index words 数据库简化检索过程;不采用暴力匹配,只匹配包含相同单词的个别图像信息, 加快检索过程。
得到归一化得分函数如下:
1、防止因分母过小,而引起的得分过大,需要对分母增加条件(有特征点数要求或者得分要求)
2、需要对最后得分设立阈值,过滤得分较少的候选图像,保留符合要求的候选图像进入组匹配进行校验
回环检测流程——组匹配
当图像 It,It′It,It′,表示了一个真正的回环,则ItIt 同样也和It±Δt,It±2ΔtIt±Δt,It±2Δt 有着较高的相似性,定义相似得分和函数如下:
其中VTiVTi 表示候选图像所在集合从VtniVtni 到 VtmiVtmi
1、防止连续图像在数据库查询时存在的竞争关系,但是不会考虑同一地点,不同时间的关键帧。
2、防止误匹配
回环检测流程——时间一致性校验
在经过组匹配之后,得到了最佳组匹配VT′VT′,此时需要检验该组匹配的时间一致性。
一般来说,对于组匹配
在经过时间一致性校验之后,只保留一组匹配
回环检测流程——结构一致性校验
词袋是一个无序的模型,好比我打了小明,小明打了我这两句话,意思正好相反,但是词袋的模型却是同一个,这就很要命,会带来误匹配。所以需要增加约束,该约束就是几何结构上的约束,即各个特征点在空间中的位置是唯一不变的,以基础矩阵建立约束。
1、在使用词袋进行回环检测的过程中,并未考虑特征之间的结构约束;
2、在检测的最后一个流程中,在得到对应特征点的基础上,通过使用RANSAC和基础矩阵解算,计算满足要求的特征点对数目(12)。
过程关键点:
1、使用direct image index,加速校验前特征点对的获取
2、同时为了获取足够数量的特征点,不能直接选取words作为匹配
索引;同时凸显特征之间的区分度,也不能采用采用较高层数
的节点(词袋树形结构)。
所需要的结构就是已经介绍过的
至此,整个回环检测的流程已经结束了
论文还给出了实验评估,评估的标准就是精度—召回曲线,如下:
评价标准
精度:正确回环检测占总检测回环数目的比率
召回:正确回环检测占测试样本总回环的比率
实验评估
这里简单涉及一下,论文中所涉及的参数和实验结果
参数设置:
数据集(前三个作为训练,后两个作为测试)
与FAB-MAP 的实验结果比较(貌似Magaga6L的训练集数目不对等)
有兴趣可以去看一下08年的FAB-MAP,程序也是开源的。
Cummins M, Newman P. FAB-MAP: Probabilistic Localization and Mapping in the Space of Appearance[J]. International Journal of Robotics Research, 2008, 27(6):647-665.
开源代码库DBoW的简单介绍
整个开源的DBoW2程序如下图分布:
整个结构非常紧凑,写的也很好,给用户的选择比较多,可以使用各种特征描述方式,遗憾的是,论文作者并未把所涉及到的算法全部开源,只是框架开源,所以无法重现结果。
demo
程序中有一个简单的demo,可以帮助了解整个框架,包括建立词典到测试词典
demo程序和结果:
demo数据集
因为是由四张图片产生的词典(差异度不够),用来测试图片,所以效果并不十分凸显,可以使用ORB_SLAM2开源的词库进行测试。
关于DBoW的总结
1、理解词袋模型:
在理解论文的基础上,需要结合开源代码,对算法有一个更为深入的了解;需要加强对数据结构的使用和操作,词袋模型大量使用了list、map、vector及自定义的数据结构。
2、需要客观看待:
在回环准确性和时间开销,需要一个取舍,虽然在文中FAST+Brief取得了一个不错的结果;但是这样的特征检测和描述方式,没有对尺度和旋转的不变性,在平面移动机器人+前置(侧置)摄像头中尚能取得较好的效果。
3、使用开源程序:
ORB_SLAM2,也同样使用了开源库DBoW2。
整体而言,离线产生的词典对于回环检测时有帮助的,因为有一个差异度足够高的模型,这一点是在线所无法比拟的,但是总有一种作弊的感觉,也有很多关于online visual vocabulary的论文,但是并不十分流行。
---------------------
作者:辜鸿铭
来源:CSDN
原文:https://blog.csdn.net/qq_24893115/article/details/52629248
版权声明:本文为博主原创文章,转载请附上博文链接!