CNN-SLAM: Real-time dense monocular SLAM with learned depth prediction
时间:2016年
关键字:单目、稠密、实时
本质:LSD-SLAM + CNN
优点:
- 估计绝对尺度
 - 应付纯旋转运动
 - 获得低纹理区域的深度
 
为什么单目slam无法估计绝对尺度(尺度不确定性)?
- 常识:
 
对轨迹和地图同时缩放一定的倍数,我们看到的图像是一样的。原因是透视投影,近大远小。一个很大但很远的物体,跟一个很小但很近的物体,看起来可能是一样的。
- 公式:
 
对极约束恒等于0,t的尺度不确定
本文如何确定绝对尺度?
单帧图片的能获得绝对深度,估计帧间pose时等效于双目相机,t的尺度是明确的。
为什么单目slam处理不了纯旋转?
相机发生纯旋转,t等于0,E和F也将等于0,无法通过对极约束计算出R。即使可以通过单应矩阵H计算出R,但是仅仅依靠旋转无法完成三角化,无法确定三维点的位置。
本文如何应付纯旋转运动?
本文直接通过CNN估计单帧深度,不需要通过三角化。
Pipeline
- 输入普通帧,与最近关键帧计算相对pose
 - 如果距离最近的关键帧太远,就建立一个新的关键帧
 - CNN在关键帧上做深度估计以及语义分割
 - 新的关键帧加入pose-graph,进行global optimization
 
GPU上运行CNN,包括深度估计和语义分割
CPU上运行两个线程:
第一个线程处理普通帧,包括pose估计和深度值微调
第二个线程处理关键帧,包括关键帧初始化、pose-graph、更新global-map、融合语义featrure
创新点:
- 如果slam用的相机和CNN采集训练数据用的相机内参不一样,那么实际使用的时候,深度估计会不准。本文不直接回归CNN的深度预测结果,而是回归深度值与相机焦距的比值
 - 每个深度值都有对应的置信度,即不确定性,整个深度估计是一个高斯分布。置信度初始化不是给一个很大的固定值,而是用当前关键帧的深度值与最近关键帧的深度值做差。表征深度传播的连续性。
 - CNN直接预测的深度值不确定性较高,本文没有直接使用。而是在slam过程中,通过帧间视差计算出一些深度,并对前一个关键帧的深度值不断进行微调。这个过程就是两个高斯分布融合的过程,减少不确定性。经过微调后的上一个关键帧的深度,又会传播到当前关键帧,对当前帧进行微调。
 
实验:
本框架与另外四个框架进行了对比,在多个数据集上的实验表明,本文的CNN-SLAM框架,比ORB和LSD等在轨迹精度和场景深度正确性,以及稠密程度上,表现都要好。
在应对纯旋转动作上,本文完胜LSD,而ORB压根初始化不了
解释:
ORB和LSD是稀疏或半稠密的,跟它们比稠密,没有意义。
Laina是本文CNN的基础,但是它的深度图没有经过refine,所以效果比不过本文
Remode虽然是稠密的,但是深度估计并不是用深度学习做的,所以在低纹理区域表现很差
思考:
为什么本文的轨迹精度要比LSD和ORB都要好?
因为更稠密,观测更多,更准。使得轨迹也能优化的更准确。
能够应付纯旋转,鲁棒性更好。
评价:
本文阅读难度并不大,但是实现细节解释得很少。
