自从17年MonoDepth系列论文问世, 单目自监督深度估计算法越来越受到研究者的重视。人们发现, 在自动驾驶场景中,原来单目自监督方法也能计算出不错的深度效果。但是单目深度估计方法的可解释性比较弱,从单张图片推测出深度的原因可能有:
- Perspective projection带来的近大远小关系(下图1);
- 景深变化带来的模糊感(下图2);
- 遮挡效应,被遮挡物应该距离更远(下图3);
以上种种原因很难具体解释单目深度估计的效果,因为单目深度估计本身就是一个ill-posed的问题,这也造成了单目深度的精度远远低于双目深度(Stereo Depth),多目深度(MVS)。
那么有没有一种方案可以大大提升单目深度估计的精度,并且增加其可解释性呢?答案就是“单目多帧深度估计”。单目多帧深度估计方案使用的仍然是单个相机,不过从原来的单帧(Frame )输入,变为了多帧(Frame , Frame , ...)输入。如下图所示,当相机在运动时,不同时刻拍摄的照片之间自然构成了多目立体几何的视觉关联,所以我们可以利用现有的几何技术(MVS), 来提升我们的单目深度估计精度。
值得一提的是,MVS只能应用在静态场景中(i.e., 上图时刻和时刻被拍摄物体object没有移动),对于自动驾驶场景,静态条件很难满足,因为大多数时刻路面上的车、行人都是在运动的。因此我们可以大致得出一个结论:多帧深度估计在静态区域的精度会比单帧深度估计准确,但是在动态区域(或者其他MVS会失效的情况,例如弱纹理区域、反光区域、相机静止(static frame)等),单帧深度估计的结果会比多帧深度估计准确许多。
在本篇Blog中,我们将分享2021-2022年的几篇多帧自监督深度估计方案,看看他们是如何结合单帧、多帧深度估计方案,去得到更加鲁邦、精确的深度结果。在开始之前,我们先回顾一下单帧自监督深度估计方案(MonoDepth)的基本pipeline:
- 通过encoder+decoder将输入的单帧图像编码成深度.
- 输入的图像,通过编码器得到他们之间的外参矩阵.
- 通过外参矩阵以及深度, 我们可以将把时刻的图像 warp到时刻,得到预测的时刻图像,然后与真实的时刻图像计算loss,从而完成自监督训练。
The Temporal Opportunist: Self-Supervised Multi-Frame Monocular Depth (CVPR2021)
本篇论文别名ManyDepth,它的网络结构图如下图所示,虽然看起来比较复杂,但是如果将红色框部分换成单帧图像的特征,那么就变成了上图MonoDepth的深度估计部分.所以本文的亮点就在于将单帧图像的输入拓展为多帧图像构建的cost volume作为输入。
本文使用MVS领域常用的Plane Sweep Stereo方案构建cost volume:
- 通过faeture extractor提取多帧图像(、)的特征(、);
- 利用PoseCNN计算至的相机外参;
- 进行逐像素的深度假设(depth candidates);
- 根据深度假设、相机外参,将 warp 至的图像平面,用二者之差的绝对值构建cost volume;
除了cost volume作为输入之外,本文还有很多“细节”:
- 将单目特征与cost volume结合在一起(Concatenation)作为输入:正如本Blog在绪论中提到的,单帧和多帧深度估计各有优缺点,这种特征结合的方案可以让网络自适应选择合适的特征来估计深度;
- Adaptive cost volume:在MVS领域,深度假设(depth candidates)的范围往往是利用COLMAP软件计算得到,但是在单目自监督深度估计的setting下,深度是没有尺度的,因此很难去人为计算深度范围。因此ManyDepth通过学习得到场景的深度范围,具体来说,通过指数滑动平均去更新场景的最小深度和最大深度。
- Addressing cost volume overfitting:正如本Blog开头提到的, MVS在动态区域,弱纹理区域会失效。ManyDepth也提到如果在训练过程中"all in" cost volume的学习会导致overfit问题,为了解决该问题,本文提出了teacher-student的学习结构,用单帧深度作为teacher,多帧深度作为student,student在不可信区域(动态区域、弱纹理、反光区域等)的输出应该像teacher学习。如果cost volume计算出来的深度()过分偏离单目深度():
那么这部分就视为student网络的不可信区域,在这部分有一致性loss来迫使student像teacher学习:
值得注意的是,此处的是cat[cost volume, 单目特征]经过decoder出来的深度结果,而是cost volume直接regress得到的深度结果。 - training-time augmentation: 为了强化上述提到的teacher-student学习,ManyDepth在输入数据时按照一定概率将cost volume全部置零,然后迫使多帧深度逼近单帧深度,这样可以有效防止网络overfit cost volume。这一点可以视为第三点的延伸。
结果:在KITTI数据集上ManDepth与单帧输入方法和之前的多帧输入方法相比,都有了显著的提升(Abs Rel)。更多的实验细节见paper。
总结一下:ManyDepth是第一篇使用多帧图像构建cost volume来改进单目深度估计的方法,实验部分可以看出显示的借鉴MVS区构建cost volume会对预测单目深度有很大的帮助。不过笔者认为还有以下几点值得思考的地方:
- 在MVS领域,一般直接从cost volume中regress得到深度估计,而ManyDepth依然使用单目深度估计的decoder来隐式地从cost volume中学习深度,这可能会抑制cost volume的几何性质。
- 为了从cost volume中decode出高精度深度,ManyDepth提出了很多technique contributions,包括和单目特征结合(1), 动态计算深度范围(2), teacher-student网络结构(3), trating-time augmentation(4)。这些方案固然能得到很不错的结果,但是也造成了网络训练结构偏向复杂和臃肿。
Multi-Frame Self-Supervised Depth with Transformers (CVPR2022)
本文别名DepthFormer(project page),主要结构与ManyDepth一致,但是提出了以下改进:
- ManyDepth使用绝对值误差构建cost volume,DepthFormer使用cross attention构建cost volume,如下图。
- ManyDepth在深度假设范围内等间距采样深度,而DepthFormer使用spatial-increasing discretization(SID)构建深度假设,SID在log space等监督采样深度,这样可以让采样点不要集中在深度值较大的区域。
- ManyDepth直接从cost volume中decode出深度,而DepthFormer使用以下techniques:
- self-attention & cross attention 交替优化cost volume;
- 使用high-response window解码深度,与传统的全局regress相比,这种方式可以避免multi-modal distributions对训练的干扰。
- context-adjust refinement:在最后的深度估计层,经过优化的cost volume特征与原图的RGB特征融合后一起解码深度信息。这可以增加深度的context信息。
- ManyDepth从cost volume中解码出的深度仅用于判断多帧深度的可信区域,但是DepthFormer对这部分的深度也用自监督的方式构建loss进行学习,进一步加强了对cost volume部分的学习。
结果:在KITTI上取得了SOTA效果,与ManyDepth相比,Abs Rel从0.098降到了0.090。更多实验细节见原文(DepthFormer在相当多的数据集上做了丰富的实验,感兴趣的研究人员可以参考)。
总结:DepthFormer是ManyDepth的follow up,本文使用了较多的技术细节全面提升了ManyDepth的性能,这些性能的提升主要来自于对cost volume的优化。笔者认为DepthFormer可能存在的问题有:
- 在ManyDepth较为的“复杂”的结构上,进一步提出了各种技术增量,并没有删繁就简,导致网络更加“沉重”,inference time和显存消耗也大大增加。这很难让后续研究者继续follow。
Disentangling Object Motion and Occlusion for Unsupervised Multi-frame Monocular Depth (ECCV2022)
本文别名DynamicDepth (github),如本文的名字所示,本文着重处理的就是动态场景下的多帧自监督深度估计问题。正如本篇Blog在开篇是描述的,MVS在动态场景下会失效,所以在动态区域的多帧深度并不可靠。现在的已有方法例如ManyDepth,利用teacher-student网络结构,让多帧部分的网络在不可信区域向单帧部分的网络学习,但是所谓不可信区域的判断准则仅仅是依靠多帧深度和单帧深度的差异来计算的,不一定准确。所以DynamicDepth提出的核心论点就是显示地构建动态区域的优化。
DynamicDepth的网络结构主体部分与ManyDepth一致,主要提出的改进点就是有两点:
- Dynamic Object Motion Disentanglement(DOMD):首先我们来回顾一下动态场景会对多帧深度学习造成什么样的影响,如下图所示,在MVS的静态假设下,我们认为被拍摄的物体没有移动,从时刻和时刻观察该物体,他们的位置都在,因此他们在图象上的对应区域是和。但是在实际场景中,物体已经从移动到,在图像上匹配的区域应该是 和。为了避免这种匹配错误,本文提出的DOMD模块先利用预训练的分割网络分割出人,车等动态区域,然后利用单目深度先验将动态区域给映射到静态场景下应该存在的位置(在上图的例子中就是将crop出, 并将其粘贴在区域)。
- Occlusion-aware的cost volume:在DOMD进行crop-粘贴的操作之后,图片中已不存在动态物体,但是新的问题又出现了,那就是遮挡区域,如下图的输入部分,我们可以看到crop后的部分区域是黑色的,因为该部分实际被遮挡了,因此本文在构建cost volume的时候需要考虑到被遮挡的情况。如下图所示,被遮挡部分的特征被临近部分的数据所填充,这样可以促进训练的梯度流向附近的non-occluded区域。
结果:和DepthFormer相比DynamicDepth在KITTI上的结果不算突出,但是在Cityscape上DynamicDepth有更强的性能。这是因为Cityscape存在更多的动态场景,DynamicDepth能从中受益。
总结:DynamicDepth在动态区域进行了理论分析,并提出了两大模块针对动态区域进行有效改进,并在动态场景丰富的Cityscape上验证了自己的方法。笔者认为Dynamic依然存在的问题是:
- 利用了预训练的分割网络,导致预测的深度结果和分割网络的性能密切相关。
Crafting Monocular Cues and Velocity Guidance for Self-Supervised Multi-Frame Depth Learning (arXiv 2022.8)
本文别名MOVEDepth (github),与前几篇不同的是,MOVEDepth不再使用MonoDepth的decoder直接从cost volume中解码出深度,而是follow MVS领域的范式,从cost volume中回归得到深度,MOVEDepth认为显示利用cost volume能够最大程度保留几何信息,得到更准确的深度估计结果。然而如ManyDepth和DepthFormer中提到的,直接从cost volume回归出深度结果并不理想,这是因为在单目多帧深度估计领域,有很多“不确定因素”,例如相机静止(static frame),弱纹理、反光区域,动态场景等。为了解决这些问题,MOVEDepth利用单帧深度先验以及预测的车身速度等信息,构建了一个轻量的cost volume以回归深度。
MOVEDepth的结构如下图所示:
- Pose branch利用posenet估计相机外参,这部分和之前的工作一致。
- Monocular branch利用单目深度估计网络预测出“粗糙”的先验深度,其中DepthNet可以是现在的任意一款单目模型,作者在实验部分给出了MonoDepth2和PackNet两种模型。
- MVS branch遵循了传统的MVSNet范式,唯一不同点在于在Homo-warp阶段,MOVEDepth不在再全局采样深度,而是在单目先验深度(monocular priority)附近进行采样,如下图所示。(注意到ManyDepth和DepthFormer分别使用了96和128个先验深度,而MOVEDepth由于有了先验深度,所以仅采样了16个depth candidates)
- Velocity guidance sampling,上文提到了MOVEDepth在深度先验附近采样16个深度点,但是并没有约束深度采样的范围。与ManyDepth不同的是,MOVEDepth不再使用学习的方案学习出要采样的范围,而是根据预测的车身速度(posenet估计得到)动态调整深度搜索范围。其Motivation是:如果相机移动速度大,那么前后两帧的stereo baseline就较大,这样比较符合MVS的triangulation prior,可以得到更准确的深度,也就是说MVS会更加的可靠,所以本文增加深度搜索范围。相反,如果相机移动速度较慢,甚至是静止的,那么前后两帧拍摄的场景并没有变化,也没有MVS的几何关联。所以MVS在此时并不可靠,我们要缩小深度搜索范围,让MVS的输出接近单目深度估计的结果,具体的深度搜索范围公式如下(值得一提的是,作者在附录部分给出了具体的几何推导,推导出前后两帧stereo basleine和相机运动速度是线性相关的):
为了解决动态场景等问题,MOVEDepth提出了Uncertainty-Based Depth Fusing,具体来说,从cost volume的熵函数中学习出MVS局部区域的可靠程度,然后作为权重将单帧深度先验和多帧深度进行融合:
从可视化可以看出,深度融合部分的网络从cost volume中学到的不确定区域在动态的车辆、行人上,这有助于缓解动态场景对多帧深度估计带来的问题:
实验:MOVEDepth在KITTI上取得了SOTA效果,值得注意的是,当单目深度先验网络从MonoDepth2变为PackNet时,MOVEDepth的性能也随之提高,可以看出MOVEDepth可以利用当前的单帧深度估计网络的一些研究进展,泛化出更好的结果。
总结:MOVEDepth利用单目深度先验和预测的车速信息,动态构建cost volume并按照MVS领域的范式回归出深度,并探究了如何更好的结合单帧深度估计和多帧深度估计得到更精准的预测结果。笔者认为MOVEDepth可能存在的问题有:
- 虽然在MVS部分只采用了16个深度假设点,但是依旧需要单目先验网络,这无疑增加了学习负担。
- 在处理动态部分,依旧是“曲线救国”,从cost volume的熵函数入手,学习动态物体带来的不可信区域,并不是直接处理动态物体,所以性能还有待提升。(值得一提的是,目前的处理动态物体的方法除了类似于这种“曲线救国”的方案,就是利用预训练的分割网络,并不“美观”,效果也不经验,所以如何elegent地处理动态物体将会是一个open problem)。