留个笔记自用
DeepSFM: Structure From Motion Via Deep Bundle Adjustment
做什么
首先是最基础的,Structure-from-Motion(SFM),SFM可以简单翻译成运动估计,是一种基于dui8序列图片进行三维重建的算法。简单来说就是是从运动中不同角度拍摄一个物体,这样就有多张物体不同时间的照片,使用这种照片来恢复物体的三维结构。跟SLAM里的visual odometry一样,需要估计出每帧图片到世界坐标系的R,t,然后根据图片重建点云。
算法的关键是就是特征匹配,求两张图片之间的R,T,然后反投影得到物体的三维点,最后将多个稀疏点云融合在一起。
然后是SFM常用的一种算法Bundle Adjustment(BA),光束调整,也就是这篇文章所做的
省去复杂的公式,BA做的也是特征匹配的工作,在不同视角的图像中选取特征点,然后将这些特征点之间进行匹配,理论上来说,在整个空间上,这些匹配点如果投影到世界坐标系应该尽可能的接近,比如两张图片中的特征点都是某个桌子的左下角,那么就算在图片上位置不同,经过R,t转回去也应该在空间上位置接近。这就是重投影误差,使用这种方式来优化R,t,同时也会优化特征点的位置。
BA往往做的是精细化建图(空间建图)的工作。
做了什么
这张图展示了DeepSFM和其他方法的区别,a是传统的回归方式,就是分别用depth模块和pose模块分别估计深度图和pose,它文章里说的这种方法会存在泛化性问题,就是在不同场景下效果会差距很大。b是常规的深度估计方法,这里的意思就是已经通过某些设备(动捕、IMU之类的东西)知道了GT的pose,然后就可以通过这个pose作为一种正则化或者约束得到depth。c图就是它这里说的受BA框架启发而设计的模式,使用当前camera的pose优化像素的深度值,同样又使用深度值优化pose,说白了,就是传统BA的设计方式,同时优化深度图和pose。
除此之外,这里可以说上比较特殊的就是不需要一个良好的初始化值,因为在计算过程中它采样了多个虚拟可能值,然后对这些虚拟可能值打分,得到质量最高的那种可能
怎么做
整个框架的overwivew↑,输入是一个图像序列,输出是每帧的深度图和到世界坐标系的pose,值得注意的是这里也假设的是又一个效果还可以的深度图和pose的初始化的值,可以说是完全作为一个slam的后处理来做。整体框架上,首先用一个encoder提取feature,然后利用这个feature进行depth估计和pose估计。
首先是这里的feature extraction模块,这里构造的方式是先构造N个CNN,然后最后接一层spatial pyramid pooling层使输出变成一个固定的维度,方式看起来和SPP原文设计的很类似,说白了就是一个多尺度的特征聚合方式。
然后是第二个模块,DCV模块,深度估计模块
DCV模块由三个部分构成,目标图像特征,变换之后的源图像特征和深度性一致图。其实从名字上就很好理解,这里监督的就是变化图像(利用pose)的每个像素特征和目标图像特征之间的一致性误差。
具体来说,为了将源图像的特征和深度图投影到目标图像的3D空间,先是在逆深度空间中均匀采样一组垂直于目标图像z轴的虚拟平面,就是在源图像的深度图对着目标图的方向进行采样出多个平面,目的就是为了判断每个平面的质量。逆深度空间是近年来SLAM研究中出现的一种广泛使用的参数化技巧。它使用深度的倒数(也就是逆深度)来进行参数化,因为逆深度的分布更贴近高斯分布。
然后就是将feature转换到前面采样出来的所有虚拟平面上
在这里,u是目标图像上每个像素的坐标,ul是源图像上相应点的坐标,F~值得就是变换之后的整体特征,这里的生成方式是双线性插值。
至此,就完成了前两步,目标图像特征和源图像特征,这两个就是特征层次的一致性。接下来还构造了另外一个就是深度层次的一致性,来判断深度预测的质量,或者说给每个虚拟平面打分。这里的方式其实跟特征差不多,对源图像的深度图进行采样,然后也变换到目标图像坐标系下,还有另一个,这里用了个函数
简单来说,就是将这些虚拟深度图转换为源图像的坐标系,至此,就完成了两个一致性目标,特征层次的一致性和深度层次的一致性,然后就用这俩特征进行后续的decode
之后是第三模块,PCV模块,这里的方式也跟DCV类似,也是使用的采样的方法
从图上就能更好地理解,给定一个初始的pose,在保证一个不变的情况下对另外一个进行采样,获得N个虚拟pose,接下来就是给这些虚拟pose打分。
之后,像DCV一样,构造深度层次的一致性和特征层次的一致性,就是直接将源图像的这两个通过虚拟pose转换到目标坐标系下,同样的,特征层次的转换也使用的插值,深度层次的转换使用的最近邻方法。最后,也通过一序列3D卷积回归出pose
最后是训练方式,既然是同时优化深度和pose,那么loss就很简单了,经典的Lrotation和Ltranslation还有Ldepth
效果
scannet上配准效果的对比,demon是一个同时进行深度估计和运动估计的baseline《DeMoN: Depth and Motion Network for Learning Monocular Stereo》,和BANet一样都是把它作为的baseline,当前网络作为后处理
同样的,也在ETH3D做了轨迹精度上的对比
总结
1.框架构造的方式就是按BA那样进行的设计,加入了光度一致性(目标特征图和转换后的源特征图的一致性)、几何一致性(深度图一致性)和相机约束(初始化一个pose,然后迭代更新)
2.一个很有趣的采样方式,可以让它在初始值不太理想的情况下进行空间采样,获得更多值的可能,但其实这种方式应该也只是在局部进行小改动,而且感觉会有点影响时间复杂性