参考代码:MonoRec
1. 概述
介绍:这篇提出了一种纯视觉的自监督深度估计算法,它结合现有实例分割、视觉里程计等视觉相关领域中相关技术,构造出这篇提出的MonoRec单目深度估计方法(在做训练的时候也采用了双目的图像作为输入)。在自监督单目深度估计网络中,一个很大的困难便是需要区分哪些像素相对相机参考系是存在运用的,这是文章引入实例分割方法得到的mask去引导并构建MaskModule去解决存在“运动”的目标。对于深度估计部分,这里是使用”运动“目标mask和由输入图片构建的cost volume去预测对应的深度结果,相比MonoDepth系列少了pose预测部分(pose参数是通过加载数据集实现的)。此外,对于上述的mask和depth两个任务训练,文章的方法比较繁琐了(为多阶段训练策略),首先需要分别完成mask和depth的bootstrapping训练,之后再在depth和mask网络预训练基础上对应网络的进一步优化工作。
这篇文章主要工作体现在使用一个MaskModule去预测“运动”目标,从而避免这类目标在深度估计结果中存在的”空洞”问题,并使用视觉里程计方法产生的稀疏深度监督点进行深度估计约束,从而构建了一个对摄像头视野中“运动”比较鲁棒的自监督深度估计方法。只不过这里是使用Mask RCNN去完成可能存在“运动”的目标,但是在自然条件下该方法也是有较大限制的,毕竟可运动的物体太多了,而且还在训练的过程中假设了pose是已知的。整体上来讲文章方法在KITTI数据及上深度估计表现的结果还是不错的,如下图所示 :
2. 方法设计
2.1 整体pipeline
文章的整体pipeline见下图所示:
从上图可知输入的视频序列会在先期深度假设条件下生成Cost Volume C ( d ) C(d) C(d),之后送入MaskModule得到“运动”物体的mask结果 M t M_t Mt,最后结合之前的输出得到最后的深度估计结果 D t D_t Dt。对于输入的单目视频序列 { I 1 , … , I N } \{I_1,\dots,I_N\} {
I1,…,IN}(一般 N = 3 N=3 N=3),扣留关键帧 t t t之后的额外帧为 I t ′ ( t ′ ∈ { 1 , … , N } / t ) I_{t^{'}}(t^{'}\in\{1,\dots,N\}/ t) It′(t′∈{
1,…,N}/t)。则在上述给定深度估计结果和pose参数( T t ′ t T_{t^{'}}^t Tt′t)的情况下可以实现帧间映射:
I t ′ t = I t ′ ⟨ p r o j ( D t , T t ′ t ) ⟩ I_{t^{'}}^t=I_{t^{'}}\langle proj(D_t,T_{t^{'}}^t)\rangle It′t=It′⟨proj(Dt,Tt′t)⟩
此外,在文章算法的训练过程中除了单目的时序序列 T T T(temporal frames)之外还是用了双目视觉中的另外一个视角图像 S S S(static stereo),从而引入更多信息以帮助生成更好的深度估计结果。
2.2 子模块
2.2.1 Cost Volume构建
在构建Cost Volume过程中是将帧 I t ′ I_{t^{'}} It′在不同深度参数 d d d(该参数通过最小最大深度进行线性划分确定)投影到关键帧 I t I_t It下构建的,这里对于Cost Volume在不同深度参数下的重构度量表示为:
p e ( x , d ) = 1 − S S I M ( I t ′ ( x , d ) , I t ( x ) ) 2 pe(x,d)=\frac{1-SSIM(I_{t^{'}}(x,d),I_t(x))}{2}