视觉slam十四讲习题答案解析

https://www.cnblogs.com/bigmonkey/这个博主里的内容可以好好看一下,包含线性代数和概率论的知识,挺好的。

 

 

第一章

理解多纬高斯分布

https://blog.****.net/LoseInVain/article/details/80339201

 

Ax=b的通解

习题及答案-第一讲 https://blog.****.net/sinat_39416814/article/details/82744319

第七讲

1.除了本书的ORB特征点,你还能找到哪些特征点?请说说SIFT或SURF的原理,并对比它们与ORB之间的优劣。

 

除了ORB之外,一般还有还有SIFT、SURF、BRISK、AKAZE,这些都是在OpenCV中已经实现了的。

 

SIFT算法,又称为尺度不变特征转换(Scale-invariant feature transform),大致方法是首先搜索所有尺度下图像的位置,通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点,然后在候选位置通过拟合精细的模型来确定位置和尺度,再基于图像梯度,分配给关键点一个或多个方向,最后在每个关键点的周围邻域,在选定的尺度下测量图像局部梯度来描述关键点。

 

SURF算法,又称为加速稳健特征(Speeded Up Robust Features),其方法和构建图像金字塔的方法相反,其主要方法是通过修改滤波器的尺寸和模糊度从而得到不同层级的影像,但是寻找特征点的方法和SIFT类似。

 

SIFT和SURF能够比较稳定地提供较高的准确率,其中SIFT比SURF跟准确一点,但是二者都特别慢。相较而言ORB速度更快,但是更容易出现问题,而且错误率远比其他二者大。

 

3.我们发现OpenCV提供的ORB算法在图像中提取的特征点分布并不是很均匀,有没有让特征点分布均匀的方法?

 

百度一搜做的人还不少,比如2016年出的ORB_SLAM2中已经用四叉树实现的特征点均匀分布算法,然后有找到一篇2018年5月发表的论文,也是用四叉树的方法,不过略有不同。大家有兴趣可以去读一下刘硕士的《ORB特征四叉树均匀分布算法》。大部分都是将图层不停四叉树分割,然后取其中比较好的keypoint保留。

 

其运行结果如下图所示:第一张图是用了四叉树进行均匀划分的ORB算法,第二张则是直接用opencv自带的ORB算法:

视觉slam十四讲习题答案解析

 

视觉slam十四讲习题答案解析

四叉树均匀划分的方法跟经典ORB算法变化不大,一般还是:1.构建图像金字塔;2.将每层图像划分网格,FAST算法提取特征点;3.对网格内的特征点进行评估,选取质量最好的留下作为代表关键点;4.用强度质心法计算每个关键点的方向;5对金字塔图层进行高斯滤波;6.使用BRIEF计算各个关键点的描述子(包含论文中的启发式搜索算法得到的256对匹配对坐标进行优化);7.保留关键点和描述子。

ORB特征均匀提取策略对性能的提升有多大?

http://192.168.73.130/www.sohu.com/a/341157217_100007727

ORB-SLAM2中的ORB特征提取方法相对于OpenCV中的方法,提高了ORB-SLAM2的轨迹精度和鲁棒性。增加特征提取的均匀性可以提高系统精度,但是似乎会降低特征提取的重复性。

 

4.研究FLANN为何能够快速处理匹配问题。除了FLANN之外,还有哪些可以加速匹配的手段?

 

FLANN的全称为Fast Library for Approximate Nearest Neighbors,也就是快速最近领进搜索包。它是一个对大数据集和高维特征进行最近邻近的算法的集合。在面对大数据集时它的性能要好于BFMatcher。匹配问题实际上就是一个特征向量求相似度问题。对于最简单的办法,就是逐个匹配对计算距离。明显这种遍历的方式是效率极低的,对于大数据情况下不适用。因此经典kd-tree的搜索回溯的搜索办法在这里派上了用场,减少了不必要的计算过程,提高了效率,但是对于多维数据而言,其效果往往不升反降。在经典kd-tree算法上提出了随机kd-tree算法,随即选出方差较大的维度,建立kd-tree,再进行搜索回溯。还有一种分级k-means tree,与之前不同的是先通过k-means算法(之后回环检测时会用到)来进行先数据聚类,然后再进行kd-tree的建立。这些方法相交于传统的直接匹配法优势都比较大。kd-tree算法有一篇博客写的不错:https://www.cnblogs.com/lysuns/articles/4710712.html

一般加速匹配的算法都是在经典的SIFT算法中使用,常见的有主成分分析法,将SIFT描述子从128维降到36维,从而匹配速度增加3倍多;或者用GPU加速,可以使得匹配速度提高十多倍;再后来就是用FPGA加速,其匹配速度能提升10倍;再后来的VF-SIFT(very fast SIFT)算法,其核心思想是从SIFT特征中提取4个特征角,根据特征角区间的不同,避免了大量不必要的搜索,这样据说是普通搜索的1250倍。

5.把演示程序使用的EPnP改成其它PnP方法,并研究它们的工作原理。

 

目前除了EPnP外,OpenCV还提供了另外两种方法:迭代法和P3P法,其中,在OpenCV3中还另外提供了DLS法和UPnP法。首先,再明白一下PnP是啥。PnP,全称Perspective-n-Point,描述了当知道n个3D空间点及其投影位置时,如何估计相机的位姿的。EPnP(Efficient PnP)的思路是将空间中的任意3D点可以用4个不共面的3D点加权表示,然后通过n个3D点在相机平面的投影关系以及四个控制点的权重关系构建一个的矩阵,求这个矩阵的特征向量,就可以得到这个相机平面的坐标,再用POSIT正交投影变换算法得到相机位姿。迭代法实质是迭代求出重投影误差的最小解先用DLT直接线性变换求解,然后用LM算法进行优化,这个解显然不是正解,而且这个方法只能使用4个共面特征点才能求得。P3P法,它需要3对3D-2D的匹配点,然后通过三角形投影关系得到的方程组,然后将方程组进行变换得到两个二元二次方程进行求解。DLS(Direct Least-Squares)算法整体思路是首先对PnP非线性最小贰乘建模,重新定义LS模型以便于参数降维然后构造Maculy矩阵进行求解,将PnP问题重构为无约束LSM问题然后优化求解。UPnP(Uncalibrated PnP)算法跟EPnP差不了太多,仅仅是多估计了焦距。因此,比较适合未标定场合。

 

8.在特征点匹配过程中,不可避免地会遇到误匹配的情况。如果把误匹配的情况输入到PnP中或ICP中,会发生什么情况?有哪些能避免误匹配的方法?

 

目前书中用的是根据汉明距离的暴力匹配方法,然后根据经验参数(30或者是最小距离的两倍)对匹配子根据其距离进行筛选。如果误匹配情况输入到PnP或是ICP中,再加上迭代算法选择不正确,初值估计不准确,就很容易导致计算结果产生误差,更有甚者会让迭代过程不稳定,甚至报错。目前比较流行的避免误匹配方法有:交叉匹配(在暴力匹配的基础上再匹配一次,如果两次结果一致,则认为是个特征点,如果不一致则滤掉,BFMatcher XX (NORM_HAMMING, true) )、KNN匹配(K邻近匹配,匹配时候选择K个与特征点相似的点,一般K是2,如果区别足够大,则选择最相似的点作为匹配点,bfMatcher->knnMatch(descriptors1, descriptors2, knnMatches, 2) )、RANSAC(随机采样一致性,利用两个图像之间的单应矩阵,根据重投影误差判定某个匹配是不是正确匹配,findHomography)等等,一般可以跟觉已有的成熟框架如ORB_SLAM2等等观察其对于不同场景所采取的避免误匹配的方法。同样,对于后端,在优化时可以用Huber损失函数等等增强优化算法的鲁棒性。

 

 

 

第八讲

5.相比与RGB-D的直接法,单目直接法往往更加复杂。除了匹配未知之外,像素的距离也是待估计的,我们需要在优化时把像素深度也当作优化变量。阅读相关文献【57】,【59】,理解它的原理。

 

码够了一定的代码也该好好看看论文。文献【57】LSD-SLAM: Large-Scale Direct Monocular SLAM,文献【59】Semi-dense Visual Odometry for a Monocular Camera都是关于Jakob Engel大牛的LSD-SLAM算法的。单目SLAM,相较于其它SLAM算法,单目SLAM算法最大的问题就是尺度不确定。这样就容易出现尺度漂移等问题。但这又是一个双目以及RGB-D相机所不及的一个优点,由于尺度不确定,它对环境有着很强的适应性,可以实现室内室外环境的灵活切换,后两者往往对环境有着较大的限制性要求。接下来的是LSD-SLAM算法的流程结构。

视觉slam十四讲习题答案解析

 

LSD-SLAM算法主要创新点在于:

 

1.将深度噪声融入光度误差检测之中;

 

2.通过Sim(3)双向检测直接配准的方式实现了图优化中关键帧节点间边的构造。

 

但是这个算法存在着一些假设,甚至有些是强假设:

 

1.灰度不变性假设;(这个假设直接法都存在,属于强假设)

 

2.每一个像素的逆深度而不是深度服从高斯概率分布;(这个假设相较于假设深度服从高斯分布优越性较大,详细可以看我后续博客)

 

3.图像灰度噪声服从高斯分布;

 

4.像素的残差互相独立。(这个假设实际不成立,但是其在算法中保证了噪声在不同*度之间的相关性)

 

单目SLAM中LSD-SLAM算是一种比较具有代表性的系统,通过对其代码的详细学习可以让我们更加深刻地了解单目SLAM地基本设计思路以及一些瓶颈问题。

 

 

 

6.由于图像的非凸性,直接法目前还只能用于短距离、非自动曝光的相机。你能否提出增强直接法健壮性的方案?阅读文献【58,60】。

 

由文中图像三维化显示不难发现,一般图像并不具备明显的凹凸性,其灰度值所形成的三维表面也是极其粗糙的。文献【60】Direct-Visual-Inertial-Odometry-with-Stereo-Cameras和文献【58】Direct Sparse Odometry都是LSD-SLAM的作者Jakob Engel参与的。这些文章都对图像的非凸性缺点进行了改良。

 

其中文献【60】主要是通过外加IMU传感器与光度误差紧耦合来克服实际图像中的光度误差的非凸性,主要是从构建最小能量函数和将IMU数据参与因子图优化来实现。因为IMU对于基体的短期位姿运动测量能够达到很精确的程度,但是长时间测量容易发生偏移,刚好视觉图像能起到纠正的作用,所以在此机理下,二者紧耦合能够取到不错的效果。详细算法及代码可以自行查看论文。

 

文献【58】是介绍DSO算法的文章。DSO算法算是直接法单目SLAM思想上比较成熟的一种算法。其中有很多比较先进的思想相较于以往的SLAM,包括对相机光度的重新修正,而且对于图像的非凸性,其也有解决的办法。在算法梯度下降时需要用到雅可比矩阵,DSO算法的雅可比矩阵主要包含三块,分别是图像雅可比、几何雅可比以及光度雅可比。后两者的值作者认为其相较于像素坐标变量而言是光滑的,所以只计算一次,但是图像雅可比显然不够光滑,作者设计了一种名为First Estimate Jacobian(FEJ)的优化方式。由于在优化的过程中会出现零空间(null space),边缘化操作容易导致零空间降维,所以FEJ强制让每一个地图点在同一时刻线性化,从而避免了零空间降维的发生,同时也保证了计算算量。

 

对于直接法健壮性增强的方法还有很多,但是能不真正增加计算量的方法却很少(前面提到的块操作也是一种)。直接法属于一种直接数据关联的方法,这一点比特征点法强不少,但是其优化过程比BA问题复杂太多,而且如果初始值估计不好对后续算法收敛性有着很大的影响。对于直接法单目SLAM的学习还有待加强。