读书笔记:回环检测
回环检测与词袋
回环检测的意义:
- VO和后端都存在误差
- SLAM的建图与定位是耦合的——误差将会累计
Loop Closing步骤:
- 检测到回环的发生
- 计算回环修选帧与当前帧的运动
- 验证回环是否成立
- 闭环
Word的形成:
- 聚类
- 经典的k-means聚类 N个特征点->k个类
- 随机选取k 个中心点: c 1 , ⋅ ⋅ ⋅ , c k ; c_1,···,c_k; c1,⋅⋅⋅,ck;
- 对每一个样本,计算与每个中心点之间的距离,取最小的作为它的归类;
- 重新计算每个类的中心点。
- 如果每个中心点都变化很小,则算法收敛,退出;否则返回1。
SLAM中的回环检测:
- 使用相对的评分而非绝对的评分
- 思路:相邻关键帧是相似的,而回环的相似度应该约等于相邻关键帧
检测成功以后:
- 根据PnP等算法计算运动关系
- 根据重投影关系验证回环是否成立
- 利用全局BA或Pose Graph进行优化
与机器学习的关系:
从前边的论述中可以看出,回环检测与机器学习有着千丝万缕的关联。回环检测本身非常像是一个分类问题。与传统模式识别的区别在于,回环中的类别数量很大,而每类的样本很少——极端情况下,当机器人发生运动后,图像发生变化,就产生了新的类别,我们甚至可以把类别当成连续变量而非离散变量;而回环检测,相当于两个图像落入同一类,则是很少出现的。从另一个角度,回环检测也相当于对“图像间相似性”概念的一个学习。既然人类能够掌握图像是否相似的判断,让机器学习到这样的概念也是非常有可能的。
从词袋模型来说,它本身是一个非监督的机器学习过程——构建词典相当于对特征描述子进行聚类,而树只是对所聚的类的一个快速查找的数据结构而已。既然是聚类,结合机器学习里的知识,我们至少可以问:
- 是否能对机器学习的图像特征进行聚类,而不是SURF、ORB 这样的人工设计特征进行聚类?
- 是否有更好的方式进行聚类,而不是用树结构加上K-means 这些较朴素的方式?
结合目前机器学习的发展,二进制描述子的学习和无监督的聚类,都是很有望在深度学习框架中得以解决的问题。我们也陆续看到利用机器学习进行回环检测的工作。尽管目前词袋方法仍是主流,但我个人是相信未来深度学习方法很有希望打败这些人工设计特征的,“传统”的机器学习方法。毕竟词袋方法在物体识别问题上已经明显不如神经网络了,而回环检测又是非常相似的一个问题。
实践部分
本章需要用到BoW库,这里选用的是DBoW3,因为它对OpenCV的兼容性较好 。由于它也是个cmake的工程,所以安装方法如之前所述,按照cmake的方法安装即可。
feature_training:
编译出现错误:
====================[ Build | feature_training | Debug ]========================
/opt/clion-2019.2.5/bin/cmake/linux/bin/cmake --build /home/wh/shenlan/slambook2/ch11/cmake-build-debug --target feature_training -- -j 6
make[3]: *** No rule to make target '/usr/local/lib/libDBoW3.a', needed by 'feature_training'。 停止。
CMakeFiles/Makefile2:106: recipe for target 'CMakeFiles/feature_training.dir/all' failed
make[2]: *** [CMakeFiles/feature_training.dir/all] Error 2
CMakeFiles/Makefile2:113: recipe for target 'CMakeFiles/feature_training.dir/rule' failed
make[1]: *** [CMakeFiles/feature_training.dir/rule] Error 2
Makefile:131: recipe for target 'feature_training' failed
make: *** [feature_training] Error 2
看错误是缺少libDBoW3.a
静态库,重新安装了一下,发现果然没有,看了对应的文件夹,也是果然没有。安装的文件如下:
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/lib/cmake/FindDBoW3.cmake
-- Installing: /usr/local/lib/cmake/DBoW3/DBoW3Config.cmake
-- Installing: /usr/local/lib/libDBoW3.so.0.0.1
-- Up-to-date: /usr/local/lib/libDBoW3.so.0.0
-- Up-to-date: /usr/local/lib/libDBoW3.so
-- Set runtime path of "/usr/local/lib/libDBoW3.so.0.0.1" to ""
-- Up-to-date: /usr/local/include/DBoW3/DescManip.h
-- Up-to-date: /usr/local/include/DBoW3/timers.h
-- Up-to-date: /usr/local/include/DBoW3/DBoW3.h
-- Up-to-date: /usr/local/include/</