课程Github地址:https://github.com/wrk666/VSLAM-Course/tree/master
最后一次课了,加油!
0. 内容
1. 回环检测与词袋
回顾视觉SLAM流程图
重点讲解如何检测到回环的发生。
- 任意两个关键帧进行特征匹配,显然这样的计算量非常大。
- 基于里程计的方法:找里程计里面相临的帧
- 基于外观的方法(是主流):核心在于如何衡量图相间的相似性,灰度,特征点或者其它方式?
基于外观的方法:有词袋和ML方法,多用词袋(现在ML方法很多性能比词袋更好,ML是以后的一个趋势)。
词袋就是把特征进行聚类形成word,如鼻子类,自行车坐类
很多word组成dictionary
图像的相似性就是word的相似性,看一张图片中的word的相似性,不管顺序。
字典实际上就是特征集,可以使用聚类算法(如k-means)对特征点进行聚类,每一个类就是一个特征集
遍历比较是O(n)的复杂度。建立kd树,将相似的类进行聚类,比较的时候先比较大类,在进入到某个大类中进行进一步比较,能够加速,时间复杂度是O(log n)的。
对词进行加权,不同的词的权重不一样,比如常见词的权重就较小:是,我…
不常见的可能权重较大:足球…
上面的相似度使用了
L
1
L_1
L1范数的形式。
比如n-1和n帧的相似度为0.5,那么你的阈值也差不多设置为大于0.5,要比相邻的帧的相似度大才行,这里是一些工程上的问题。
检测出来之后可以重投影,将回环临近几帧的图像进行重投影,验证是否是回环。
或者检测到回环之后不立马去闭,而是再多检测几帧,如果仍然是回环的话,那么真回环的概率就会较大。
闭了之后就可以全局BA或者Pose Graph进行优化。
根据《SLAM14讲》上对于回环检测部分的讨论,此部分还存在以下一些细节性的问题:
- 相似性评分的处理:可以使用先验相似度进行归一化。
- 关键帧的处理:回环检测的关键帧通常是稀疏地选择的,否则相邻的帧总是被检测为平凡的回环,没有意义。
- 检测之后的验证:由于词袋的word没有顺序,检测出来的回环容易出现假阳性。可以使用缓存机制(连续几帧回环才闭)或者空间上的一致性检测(估计与检测出来的回环的位姿,跟之前的位姿图进行对比)。
2. 建图(教材12讲)
前面讲到的都是特征点地图,但实际应用中往往需要根据具体需求在特征点地图上进行一些处理,比如导航(红绿灯,车道线等),避障(需要知道障碍物在哪里),重建,交互等。
单目的稠密深度估计等
上述的都是各种地图的形式。
点云地图实际上比较松散,不是很高效。
在描述这个地图时,我们需要一个紧凑的,抽象化之后的表达。
我们现在的地图只是在特征点层面的地图,比如说房间中桌子上的图案,椅子的纹理等,实际应用中我们是需要更抽象的一些描述,比如桌子的面是方的还是圆的,有几条腿,椅子在哪放着,怎么摆放的等等这些信息,而从特征点地图往这中语义地图上进行转换也是值得研究的一个方向。
3. 展望(教材14讲)
一些2016年时的展望,如果深入了解过其中某个开源方案的话会对了解SLAM有很大帮助。
下面可能进行VIO的学习。
最后一次课的结语不是下次课再见了,多少有些伤感,但是无论如何,课程完结,完成了大作业之后就算是算是稍微入了个门。
4. 实践环节
在使用feature_training.cpp
生成字典的时候注意data的路径,否则生成的字典可能是空的,
在调用loop_closure.cpp
时会报错Vocabulary does not exist
可以看出比较相似的图像相对于其他图像的评分不是很明显,原因可能是使用的字典太小,只是从这些图片中构建的字典,使用大的字典评分的差别可能会更明显。
使用了提供的vocab_larger.yml.gz
,但没有什么效果,甚至9的分数还下降了,
更换了字典,使用了ORB-SLAM2的字典,字典地址,区分度好了一些: