单目深度估计【02】优化 SfMLearner——18年,CVPR做了哪些努力?
SfMLearner 通过最小化单目视频数据集中的视图重建误差,分别训练了姿态预测网络和深度预测网络。尽管取得了令人印象深刻的结果,但这种策略与使用校准后的双目图像对进行训练的 MonoDepth 相比,仍有明显差距。
但我们上次也说到,基于双目图像的方法依赖于校准过的双目图像对,这限制了其应用场景,无法利用获取更容易、内容更丰富的单目视频。因此在后续两三年的研究中,如何让 SfMLearner 取得相当于 MonoDepth 的结果是一大研究方向。
本文将介绍在接下来的一年内,一些学者在这个方向上做出的努力。
一、预备知识 Ⅰ
2018年,LKVOLearner(Wang et al.—“Learning Depth from Monocular Videos Using Direct Methods”—CVPR 2018)这篇文章指出 SfMLearner 与 MonoDepth 两者的关键差别在于:
- 帧与帧之间的相机位姿未知;
- 尺度(scale)存在不确定性。
其中的第一点,显然我们在上一篇文章中就已经讨论过,这里我们将重点关注第二点。在此之前,我们需要先详细了解尺度空间的概念。
1.1 数字图像的尺度空间(scale space)
图像的尺度是指图像内容的粗细程度(模糊尺度)。尺度的概念是用来模拟观察者距离物体的远近的程度。具体来说,观察者距离物体远,看到物体可能只有大概的轮廓;观察者距离物体近,更可能看到物体的细节,比如纹理,表面的粗糙等等。
图像的尺度空间是指同一张图像不同尺度的集合。在该集合中,细尺度图像通过 filter 形成粗尺度图像,即粗尺度图像的形成过程是高频信息被过滤的过程。这个过程不会引入新的杂质信息,因此任何存在于粗尺度图像下的内容都能在细尺度图像下找到。例如,如果你想看一颗树而不是叶子,可以故意删除图像中的某些细节(例如树叶树枝等),在摆脱这些细节时,必须确保不引入新的虚假细节。有证明可知,做到这一点的唯一方法是使用高斯模糊。
综上,图像的尺度空间是一幅图像经过几个不同高斯核后形成的模糊图片的集合,用来模拟人眼看到物体的远近程度以及模糊程度。 注意!图像尺度的改变不等于图像分辨率的改变。如下图所示,通过对原图像进行不同程度的高斯滤波得到不同尺度上的图像,但是4张图像的分辨率是相同的。

数字图像的多尺度分析是至关重要的。举一个例子,对于一座房屋 AAA 和与其完全一致的房屋模型 A′A'A′ ,尽管在三维场景中我们可知 AAA 的尺寸远大于 A′A'A′ ,但我们仍可以通过移动其与镜头的距离来拍摄出尺寸一模一样的照片。而当我们仅仅通过照片来分辨 AAA 与 A′A'A′ 时,我们很难得知它们的真实大小,因为缺少物体的深度信息。
对于计算机视觉而言,我们通过模糊图像来模拟图像中的物体离镜头越来越远的感觉:图像越模糊,代表图像中的物体离镜头越远,所蕴含的细节信息也就越少。
1.2 数字图像的分辨率
图像的分辨率(Image Resolution)本质上是图像在水平和垂直方向的量化程度,直观上理解是指图像能展现的细节程度。 量化的过程是模拟信号转变成数字信号的过程,这一过程是不可逆的信息损失过程。因此,量化级别的高低决定了该数字信号能否更好的表示原本的模拟信号。图像是二维数组,水平像素和垂直像素的数量便是图像量化的级别,多像素图像更能展示图像的细节。下图即为一张图像的多分辨率版本:

分辨率的概念使得空间离散化。具有一定长度(宽度)的对象可以通过对其物理空间进行一定的采样来重新表示,即每个长度(宽度)具有多少个像素。采样会引起连续空间的损失,但如果先进行平滑操作,则可以得到更好的低分辨率图像。
多分辨率可以视为某种多尺度表示的离散化。但实际上,由于我们所处理的数据始终是离散的,并且多分辨率可以以不同的尺度重建图像,所以一般来说这两个概念在某种程度上等价。
1.3 图像金字塔与高斯金字塔
图像金字塔(Image Pyramid)是一种多尺度图像表示结构,其基本思想是将图像逐层缩小(通常缩小为原来的一半尺寸),构建一个从高分辨率到低分辨率的图像序列。其中每一层都是前一层的下采样版本。如下图所示:

而高斯金字塔是最常用的图像金字塔,它通过在下采样之前,对图像额外进行一次或若干次高斯模糊所得到,表示从高分辨率到低分辨率的图像序列。
二、尺度模糊(Scale Ambiguity)
2.1 尺度模糊灾难
LKVOLearner 这篇文章中有提到:“与使用已标定、基线已知的双目图像进行训练不同,从单目序列中估计深度和相机位姿存在尺度模糊问题。”如何理解这句话呢?说直白一点就是:SfMLearner 没有关于物体与镜头间距离(即深度)的先验知识。如果 SfMLearner 将 D^t\hat{D}_tD^t 估计得很大,例如 nnn 倍大小:
D^t′=nD^t
\hat{D}'_t = n \hat{D}_t
D^t′=nD^t
那在重建过程中,只需将估计得到的变换矩阵 T^t→s\hat{T}_{t \to s}T^t→s 缩小相同的倍数,即可使得重建过程中深度估计的误差被消解:
ps=KT^’t→sD^t′(pt)K−1pt=K(1nT^t→s)(nD^t(pt))K−1pt=KT^t→sD^t(pt)K−1pt
\begin{align}
p_s=& K \hat{T}’_{t \to s} \hat{D}'_t(p_t) K^{-1} p_t \\
=& K \left(\frac{1}{n}\hat{T}_{t \to s}\right) \left( n\hat{D}_t(p_t)\right) K^{-1} p_t \\
= &K \hat{T}_{t \to s} \hat{D}_t(p_t) K^{-1} p_t
\end{align}
ps===KT^’t→sD^t′(pt)K−1ptK(n1T^t→s)(nD^t(pt))K−1ptKT^t→sD^t(pt)K−1pt
因此,尽管 SfMLearner 不太清楚物体距离镜头到底有多远,但是这种图像重建方式及其相关的损失函数——视图合成损失 Lvs\mathcal{L}_{vs}Lvs 并不受影响。也即,这种视图重建方法具有尺度不变性。
然而在此前介绍 SfMLearner 时,我们给出的 SfMlearner 的损失函数除了包含视图重建误差 Lvs\mathcal{L}_{vs}Lvs 这一项之外,还包含一项深度平滑损失 Lsmooth\mathcal{L}_{smooth}Lsmooth :
Lsmooth=∑p(∣∂xx2D^t(p)∣+∣∂yy2D^t(p)∣)
\mathcal{L}_{\text{smooth}} = \sum_{p} \left( \left| \partial^2_{xx} \hat{D}_t(p) \right| + \left| \partial^2_{yy} \hat{D}_t(p) \right| \right)
Lsmooth=p∑(∂xx2D^t(p)+∂yy2D^t(p))
我们通过一个例子来模拟一下尺度模糊对于这个损失函数的影响:假设某一次的训练过程中分裂出两个平行宇宙,其中一个宇宙得到的深度图为 D^1\hat{D}_1D^1 ,而另一个宇宙中得到的深度图为 D^2\hat{D}_2D^2 :
D^1=[476858923], D^2=[407060805080902030]
\hat{D}_1 =
\begin{bmatrix}
4 &7 &6 \\
8 &5 &8 \\
9 &2 &3
\end{bmatrix} , \ \
\hat{D}_2 =
\begin{bmatrix}
40 &70 &60 \\
80 &50 &80 \\
90 &20 &30
\end{bmatrix}
D^1=489752683, D^2=408090705020608030
显然 D^2\hat{D}_2D^2 是 D^1\hat{D}_1D^1 的10倍。我们采用以下卷积核来求解离散图像中心点 ppp 的二阶导数:
Kernelxx=[0001−21000], Kernelyy=[0100−20010]
\text{Kernel}_{xx} =
\begin{bmatrix}
0 &0 &0 \\
1 &-2 &1 \\
0 &0 &0
\end{bmatrix} , \ \
\text{Kernel}_{yy} =
\begin{bmatrix}
0 &1 &0 \\
0 &-2 &0 \\
0 &1 &0
\end{bmatrix}
Kernelxx=0100−20010, Kernelyy=0001−21000
得到在第一个平行宇宙中,∂xx2D^1(p)=6\partial^2_{xx} \hat{D}_1(p)=6∂xx2D^1(p)=6,∂yy2D^1(p)=−1\partial^2_{yy} \hat{D}_1(p)=-1∂yy2D^1(p)=−1 ;而在第二个平行宇宙中,∂xx2D^1(p)=60\partial^2_{xx} \hat{D}_1(p)=60∂xx2D^1(p)=60,∂yy2D^1(p)=−10\partial^2_{yy} \hat{D}_1(p)=-10∂yy2D^1(p)=−10。因此在**计算深度平滑损失 Lsmooth\mathcal{L}_{smooth}Lsmooth 时,第二个平行宇宙的结果足足是第一个平行宇宙中的10倍!**也就是说,Lsmooth\mathcal{L}_{smooth}Lsmooth 的结果对尺度变化高度敏感。显然,Lsmooth\mathcal{L}_{smooth}Lsmooth 的优化趋势是使得深度图的尺度尽可能减小,尽管因为视图合成损失 Lvs\mathcal{L}_{vs}Lvs 的约束不至于使得深度估计得到几乎全为0的结果,但也使得训练的成果大打折扣。
2.2 深度归一化
为了解决这一问题,LKVOLearner 提出了一种简单又有效的策略:在将 Depth CNN 的输出送入损失函数之前,先应用一个非线性操作对其进行归一化。LKVOLearner 使用的这个操作记作 η(⋅)\eta(\cdot)η(⋅),其形式是将输出结果 did_idi除以其均值:
η(di)=di1N∑j=1Ndj
\eta(d_i) = \frac{d_i}{\frac{1}{N}\sum_{j=1}^{N} d_j}
η(di)=N1∑j=1Ndjdi
这个归一化技巧曾在 LSD-SLAM 领域中用于关键帧选择,但在单目视频深度估计的学习场景中尚未使用过。DDVO 通过这一简单的归一化策略显著提升了结果。
不过为什么使用已标定、基线已知的双目图像进行训练的 MonoDepth 不存在尺度模糊灾难呢?答案很简单:基线已知使得 MonoDepth 拥有对深度信息的先验知识。
三、 LKVOLearner 的创新与不足
除了解决尺度模糊给 SfMLearner 带来的灾难以外,LKVOLearner 还试图在网络结构以及损失函数两方面进行优化,以期待从单目视频中学习到能和 MonoDepth 相接近的成果。
本章将简要介绍一些 LKVOLearner 在性能优化方面做出的努力。
3.1 DDVO 模块引入
在以往的研究中,位姿预测器通常被简化为一个前馈的卷积神经网络(CNN),它只从一系列帧中提取输入信息。这种方法的优点在于其使用“黑箱模型”的简洁性,并且易于集成进端到端的训练流程。不过,LKVOLearner 认为 Pose Net 忽略了相机位姿与深度之间的几何关系。
LKVOLearner 提出了一种 Pose Net 的替代方案:将一类已被深入研究的几何方法,例如直接视觉里程计(DVO,Direct Visual Odometry)直接引入该架构。在给定由 Depth CNN 输出的当前深度估计的条件下,DVO 通过最小化参考图像与源图像之间的光度重投影误差来求解相机位姿。通过用 DVO 来替代 Pose Net ,模型的收敛速度以及计算效率都有望得到优化,并且在几何上耦合了位姿估计以及深度估计两个任务
为了将 DVO作为端到端训练中的位姿预测模块集成进去,该团队提出了一个可导的 DVO 实现。通过这种方法,估计深度关于损失 Lvs\mathcal{L}_{vs}Lvs 的梯度来自两个部分:
dLvsdfd=∂Lvs∂fd+∂Lvs∂fp⋅∂fp∂fd
\frac{d\mathcal{L}_{vs}}{df_d} = \frac{\partial \mathcal{L}_{vs}}{\partial f_d} + \frac{\partial \mathcal{L}_{vs}}{\partial f_p} \cdot \frac{\partial f_p}{\partial f_d}
dfddLvs=∂fd∂Lvs+∂fp∂Lvs⋅∂fd∂fp
式(9)表明:LKVOLearner 方法与 SfMLearner 方法在理论上有一个主要差异 —— LKVOLearner 的 DepthNet 可以从位姿预测模块中获得额外的反向传播信号。该团队在训练中尝试了两种使用训练 DDVO 模块的方法:
- 直接使用 DDVO 从头开始训练 Depth-CNN;
- 先用 Pose-CNN 预训练 Depth-CNN,再使用 DDVO 对其进行微调,并将 Pose-CNN 的输出作为 DDVO 的初始化。
第二种策略的动机可以从两个角度理解:
- 相较于从单位矩阵初始化位姿,Pose-CNN 提供了更好的起始点;
- DDVO 又可以利用几何关系进一步优化 Pose-CNN 的输出。
两种不同策略的网络结构示意图如下:

除了引入 DDVO 模块替代/优化原本的 Pose Net 之外,LKVOLearner 还摒弃了 SfMLearner 中的可解释性网络。
3.2 损失函数的修改
LKVOLearner 的训练损失与 SfMLearner 的训练损失大致相同,由视图合成损失 Lvs\mathcal{L}_{vs}Lvs 和先验平滑损失 $ \mathcal{L}_{smooth}$ 两部分组成,并在 4 个尺度上进行汇总。在第 kkk 个尺度上的损失表达如下:
L(k)=∑i=13Lvs+λ∑i=13Lsmooth(Di(k))
\mathcal{L}^{(k)} = \sum^3_{i =1} \mathcal{L}_{vs} + \lambda \sum_{i=1}^{3} \mathcal{L}_{smooth}(D^{(k)}_i)
L(k)=i=1∑3Lvs+λi=1∑3Lsmooth(Di(k))
其中,权重参数 λ\lambdaλ 控制来自平滑先验的惩罚强度。由于摒弃了 SfMLearner 中的可解释性网络,损失函数不再有对 E^\hat EE^ 的正则项。LKVOLearner 对余下两项损失函数都做了修改。
Lvs\mathcal{L}_{vs}Lvs 在 Depth CNN 输出的 四个尺度上进行聚合:对于前三个较粗的尺度,使用 L1 损失;对于最后一个最细的尺度,则使用 L1 损失与 SSIM 损失的线性组合(与 MonoDepth 的方法相同)。
Lsmooth\mathcal{L}_{smooth}Lsmooth 同样使用二阶导数作为平滑惩罚项,以鼓励深度预测结果具有平滑的斜率。不过为了增强深度预测边缘的清晰度, LKVOLearner 作出两项调整:
-
基于图像拉普拉斯的加权平滑损失:对于图像中的每个像素,LKVOLearner 根据图像亮度的拉普拉斯值赋予不同的平滑权重。如果一个像素的拉普拉斯值较高,说明它更可能处于边缘或角点处,LKVOLearner 对其施加较小的平滑惩罚:
Lsmooth(D^)=e−∇2I(∣∂xx2D^∣+∣∂xy2D^∣+∣∂yy2D^∣) \mathcal{L}_{smooth}(\hat{D}) = e^{-\nabla^2 I} \left( |\partial^2_{xx} \hat{D}| + |\partial^2_{xy} \hat{D}| + |\partial^2_{yy} \hat{D}| \right) Lsmooth(D^)=e−∇2I(∣∂xx2D^∣+∣∂xy2D^∣+∣∂yy2D^∣) -
只从较粗尺度计算平滑损失:LKVOLearner 将最终的深度图下采样为三个更粗的尺度,并仅对最粗糙的两个尺度聚合平滑损失。这样可以更稳定地引导大尺度结构的平滑性。
3.3 LKVOLearner 的不足
LKVOLearner 展示了直接视觉里程计(Direct Visual Odometry,DVO)可以用来估计帧间相对相机位姿,替代使用卷积神经网络(Pose-CNN)学习位姿预测器。这种策略需要学习的参数更少,且潜在地需要更少的训练图像。不过原文并没有具体指出“更少的图像”是多少。实验表明,LKVOLearner 的深度预测能力相较于 SfMLeaner 有较大进步,尽管仍然不如 MonoDepth。
然而,LKVOLearner 方法并没有解决 SfMLearner 面临的关于“非刚性运动”的问题以及“视野遮挡”的问题,仍然对骑自行车的人和行人等关节运动物体表现较差。此外,LKVOLearner 仍然需要依赖已知的相机内参 KKK 。
四、MonoDepth 与 SfMLearner 的联合:Depth-VO-Feat
同年还有另一篇文章 Depth-VO-Feat (Zhan et al.—“Unsupervised Learning of Monocular Depth Estimation and Visual Odometry with Deep Feature Reconstruction”—CVPR 2018)其实也注意到了“尺度模糊灾难”这个问题,不过他们的解决办法与 LKVOLearner 略有不同。既然基线已知使得 MonoDepth 拥有对深度信息的先验知识,那么只要用双目视频序列替代单目视频序列用于训练即可。这就是 Depth-VO-Feat 方法。
4.1 网络结构
Depth-VO-Feat 的网络结构如下,它看上去很像 MonoDepth 与 SfMLearner 揉在一起得到:

由于使用双目视频序列用于训练,因此图像帧不仅在空间上有差异(LLL 、RRR),在时间上也有差异(t1t_1t1、t2t_2t2)。Depth-VO-Feat 输入 IL,t1I_{L,t_1}IL,t1 以及 IL,t2I_{L,t_2}IL,t2 两帧——其中 Depth CNN (也即图中的 CNNDCNN_DCNND) 预测得到 DL,t2D_{L,t_2}DL,t2 ( IL,t2I_{L,t_2}IL,t2 的深度图);Pose CNN (也即图中的 CNNVOCNN_{VO}CNNVO)预测得到 t2→t1t_2 \to t_1t2→t1 的变换矩阵 T21T_{21}T21 。我们根据以上结果,以及已知的内参 KKK 、L→RL \to RL→R 的变换矩阵 TLRT_{LR}TLR ,可以得到重建图像 IL,t1′I'_{L,t_1}IL,t1′ 以及 IR,t2′I'_{R,t_2}IR,t2′ 。到此,Depth-VO-Feat 的工作基本等于将 MonoDepth 与 SfMLearner 揉在一起。
然而从上图可以看出,Depth-VO-Feat 的还重建了 FL,t1′F'_{L,t_1}FL,t1′ 以及 FR,t2′F'_{R,t_2}FR,t2′ 两个张量。
FFF 的含义即是“特征(Feature)”,也就是说,Depth-VO-Feat 的输入不仅包含 IL,t1I_{L,t_1}IL,t1 、 IL,t2I_{L,t_2}IL,t2 、 IR,t2I_{R,t_2}IR,t2 共三张图像,还输入了除目标帧 IL,t2I_{L,t_2}IL,t2 以外的各自对应的特征图 FL,t1F_{L,t_1}FL,t1 以及 FR,t2F_{R,t_2}FR,t2 ,并且对特征图也进行了重建。具体选用何种特征图原文做了三种尝试:
- ImageNet Feat:ImageNet 预训练 ResNet50-1by2 的 conv1 特征;
- KITTI Feat:基于 KITTI 数据集训练的图像描述符所提取的特征;
- NYUv2 Feat:现成的基于NYUv2数据集训练的图像描述符所提取的特征;
Depth-VO-Feat 引入特征图重建的目的也很明了:图像重建任务要想成功,必须依赖“场景表面满足朗伯特反射”这一假设——只有在不同角度观察物体时所得到的色彩、亮度一致,光度一致性误差才具有意义。SfMLearner 仅使用可解释性网络来给予不满足这种假设的像素点更低的置信度,而 Depth-VO-Feat 通过重建特征图这一目标提升框架的鲁棒性。从试验结果表明这种操作确实是有意义的。
4.2 损失函数
Depth-VO-Feat 的损失函数思路也比较直接:
L=λirLir+λfrLfr+λdsLds
\mathcal{L}=λ_{ir} \mathcal L_{ir}+λ_{fr} \mathcal L_{fr}+λ_{ds} \mathcal L_{ds}
L=λirLir+λfrLfr+λdsLds
其中,λir\lambda_{ir}λir、λfr\lambda_{fr}λfr 和 λds\lambda_{ds}λds 是三个损失项的权重系数。Lir\mathcal L_{ir}Lir 以及 Lfr\mathcal L_{fr}Lfr 分别表示视图重建损失以及特征图重建损失,实现方式都是简单的 L1 损失;而 Lds\mathcal L_{ds}Lds 作为深度图平滑损失,实现方式与 MonoDepth 的版本一模一样。
4.3 论文成果与不足
Depth-VO-Feat 联合了 MonoDepth 以及 SfMLearner 的建模特点,通过双目立体视频序列联合学习深度估计与相机位姿估计两个任务,并且提出了一种新颖的特征重建损失,在解决了 SfMLearner 所面临的“尺度模糊灾难”的同时,得到了当时最先进的无监督单视图深度估计结果。
尽管如此,Depth-VO-Feat 框架仍然没能解决场景中存在非刚性运动和遮挡的问题。并且由于依赖双目立体视频序列进行训练,反而使得数据集的获取难度相较于 MonoDepth 以及 SfMLearner 都提高了。
五、对非刚性运动建模:GeoNet
先前介绍的两篇文章都旨在解决 SfMLeaner 中的“尺度模糊灾难”问题,而没有解决自 SfMLearner 发布以来就一直面临的关于“非刚性运动”与“视野遮挡”的问题。值得庆幸的是,同年的 GeoNet (Yin et al.—“GeoNet: Unsupervised Learning of Dense Depth, Optical Flow and Camera Pose”—CVPR 2018)选择直面挑战,首次在 SfMLeaner 的基础上对场景中的“非刚体运动”进行建模。
5.1 网络结构
GeoNet 的网络结构实际上像是将 SfMLearner 经典结构与 FlowNet 首尾拼接得到。通过对损失函数的巧妙设计将各个 3D 场景重建任务联系起来。如下图所示:

网络由两个独立的子模块组成:
1)第一部分:刚性结构重建器(Rigid Structure Reconstructor)用于推断整个场景的静态布局。该阶段基本就是摒弃了可解释性网络的 SfMLearner ,由两个子网络 DepthNet 以及 PoseNet 构成。这个部分预测得到目标帧 ItI_tIt 的深度图 DtD_tDt 以及从目标帧 ItI_tIt 变换到源帧 IsI_sIs 的变换矩阵 Tt→sT_{t \to s}Tt→s 。由此前的推导我们得知,假设源帧中某点坐标为 ptp_tpt ,则可以计算出该点变换到源帧中时所对应的坐标 psp_sps :
ps=KTt→sDt(pt)K−1pt
p_s= KT_{t \to s}D_t(p_t)K^{-1}p_t
ps=KTt→sDt(pt)K−1pt
而这个变换坐标的残差值,既可用于构建场景的刚体运动信息:
ft→srig(pt)=ps−pt
f_{t \to s}^{rig}(p_t)=p_s - p_t
ft→srig(pt)=ps−pt
因此,GeoNet 第一部分输出的内容包括计算得到的光流图(Optical Flow)ft→srigf_{t \to s}^{rig}ft→srig 以及直接根据 ft→srigf_{t \to s}^{rig}ft→srig 重建得到的视图 I^srig\hat{I}_s^{rig}I^srig。
此外,GeoNet 的第一阶段还会计算得到一个反向光流图 fs→trigf_{s \to t}^{rig}fs→trig 。这在介绍损失函数时还会更加具体的介绍。
2)第二部分:非刚性运动定位器(Non-rigid Motion Localizer)用于处理场景中的动态物体(如行人、车辆等)。该阶段仅由 ResFlowNet 完成。该网络学习的是一个残差光流,它与第一阶段得到的刚性运动光流相加,构成最终的完整光流预测结果。
ft→sfull=ft→srig+ft→sres
f_{t \to s}^{full} = f_{t \to s}^{rig}+f_{t \to s}^{res}
ft→sfull=ft→srig+ft→sres
此时,根据修正过的(考虑了物体非刚性运动)的全局光流 ft→sfullf_{t \to s}^{full}ft→sfull ,我们可以又重建得到视图 I^sfull\hat{I}_s^{full}I^sfull 。
同样,GeoNet 的第二阶段还会计算得到一个反向光流图 fs→tfullf_{s \to t}^{full}fs→tfull 。这在介绍损失函数时还会更加具体的介绍。
5.2 损失函数
GeoNet 的网络结构很简单,设计的思路也比较简单。这篇论文将很大的重心放在了损失函数的设计上。整体损失函数的计算如下:
L=∑l∑<t,s>(Lrw+λdsLds+Lfw+λfsLfs+λgcLgc)
\mathcal{L} = \sum_l \sum_{\left< t,s \right>} (
\mathcal{L}_{rw} +
\lambda_{ds} \mathcal{L}_{ds} +
\mathcal{L}_{fw} +
\lambda_{fs} \mathcal{L}_{fs} +
\lambda_{gc} \mathcal{L}_{gc}
)
L=l∑⟨t,s⟩∑(Lrw+λdsLds+Lfw+λfsLfs+λgcLgc)
其中 lll 表示各个尺度的结果;<t,s>\left< t,s \right>⟨t,s⟩ 表示输入的帧序列两两组合得到的“目标帧-源帧”对;λ\lambdaλ 表示权重。接下来将重点介绍各个损失函数引入的原因与具体计算方式。
5.2.1 视图合成损失 Lrw\mathcal{L}_{rw}Lrw & Lfw\mathcal{L}_{fw}Lfw
GeoNet 在阶段一得到光流图 ft→srigf_{t \to s}^{rig}ft→srig 以及直接根据 ft→srigf_{t \to s}^{rig}ft→srig 重建得到的视图 I^srig\hat{I}_s^{rig}I^srig ;而在阶段二得到光流图 ft→sfullf_{t \to s}^{full}ft→sfull 以及直接根据 ft→sfullf_{t \to s}^{full}ft→sfull 重建得到的视图 I^sfull\hat{I}_s^{full}I^sfull 。因此 GeoNet 的损失函数分别衡量阶段一以及阶段二的视图合成损失。
阶段一的视图合成损失计算方式如下:
Lrw=α1−SSIM(It,I^srig)2+(1−α)∥It−I^srig∥1
\mathcal{L}_{rw} = \alpha \frac{1 - SSIM(I_t, \hat{I}_s^{rig})}{2} + (1 - \alpha) \| I_t - \hat{I}_s^{rig} \|_1
Lrw=α21−SSIM(It,I^srig)+(1−α)∥It−I^srig∥1
阶段二的视图合成损失计算方式和阶段一的相同。这个计算方法与 Mono Depth 中的实现方式基本相同。
5.2.2 平滑损失 Lds\mathcal{L}_{ds}Lds & Lfs\mathcal{L}_{fs}Lfs
GeoNet 对阶段一得到的深度图 DtD_tDt 以及阶段二得到的完整光流图 ft→sfullf_{t \to s}^{full}ft→sfull 分别计算平滑损失。
其中阶段一关于深度图的平滑损失 Lds\mathcal{L}_{ds}Lds 的计算方式如下:
Lds=∑Pt∣∇D(Pt)∣⋅(e−∣∇I(Pt)∣)T
\mathcal{L}_{ds} = \sum_{P_t} |\nabla D(P_t)| \cdot \left( e^{-|\nabla I(P_t)|} \right)^T
Lds=Pt∑∣∇D(Pt)∣⋅(e−∣∇I(Pt)∣)T
该损失函数也是“常客”了。和 MonoDepth 的损失函数基本就是数学形式不同,用于鼓励深度图在图像光滑区域内也保持平滑,而在图像边缘处允许有较大变化。而阶段二关于全光流图 ft→sfullf_{t \to s}^{full}ft→sfull 的平滑损失 Lfs\mathcal{L}_{fs}Lfs 与 Lds\mathcal{L}_{ds}Lds 的计算方式基本一致。
5.2.3 几何一致性损失 Lgc\mathcal{L}_{gc}Lgc
GeoNet 包含用于静态场景的刚性结构重建器,以及用于动态物体补偿的非刚性运动定位器。两个阶段都采用视图合成目标作为监督,其隐含假设是光度一致性,而这种一致性在遮挡和非朗伯表面在实际中仍难以被完全处理。
关于这个问题,SfMLeaner 采用可解释性网络为每个点计算一个置信度,以此来降低非理想点的影响; 而 Depth-VO-Feat 引入了“特征图重建任务”,尝试对非朗伯平面的点进行了修正,不过仍然没有解决“存在遮挡”这一问题。
GeoNet 为场景中的非刚性运动作了修正,同时也提出了前向-后向一致性检查,目的是缓解非理想点的影响。这种思路也类似于 MonoDepth 中使用左右一致性损失。在数学上,GeoNet 将这种一致性损失描述为一种自适应几何一致性损失:
Lgc=∑pt[δ(pt)]⋅∥Δft→sfull(pt)∥1
\mathcal{L}_{gc} = \sum_{p_t} [\delta(p_t)] \cdot \|\Delta f^{full}_{t \rightarrow s}(p_t)\|_1
Lgc=pt∑[δ(pt)]⋅∥Δft→sfull(pt)∥1
其中, δ(pt)\delta(p_t)δ(pt) 是一个布尔函数,它只在 ptp_tpt 满足如下条件时返回 111 :
∥Δft→sfull(pt)∥2<max{α,β∥ft→sfull(pt)∥2}
\|\Delta f^{full}_{t \rightarrow s}(p_t)\|_2 < \max\left\{ \alpha, \beta \|f^{full}_{t \rightarrow s}(p_t)\|_2 \right\}
∥Δft→sfull(pt)∥2<max{α,β∥ft→sfull(pt)∥2}
这里损失函数的构建思路比较复杂。首先明确两点:阶段一除了计算正向光流图 ft→srigf_{t \to s}^{rig}ft→srig ,还计算反向光流图 fs→trigf_{s \to t}^{rig}fs→trig ;阶段二相同。
ft→sfullf_{t \to s}^{full}ft→sfull 根据源帧 IsI_sIs 的内容来重建得到 I^t\hat{I}_tI^t ,而 fs→tfullf_{s \to t}^{full}fs→tfull 应当根据根据 I^t\hat{I}_tI^t 的内容又能够重建得到 I^s\hat{I}_sI^s ——这个过程也可以按如下方式来描述:而对于一个具体的目标帧上的点 ptp_tpt ,通过 ft→sfull(pt)f_{t \to s}^{full}(p_t)ft→sfull(pt) 可以将其映射为源帧上的点 ps′p'_sps′ ,而 fs→tfull(ps′)f_{s \to t}^{full}(p'_s)fs→tfull(ps′) 应当又可以将 ps′p'_sps′ 又映射回 ptp_tpt 。也就是说,应该有如下关系:
Δft→sfull(pt)=ft→sfull(pt)+fs→tfull(ps′)≈0
\Delta f_{t \to s}^{full}(p_t) = f_{t \to s}^{full}(p_t) + f_{s \to t}^{full}(p'_s) \approx 0
Δft→sfull(pt)=ft→sfull(pt)+fs→tfull(ps′)≈0
式(21)给出,如果 ptp_tpt 是一个理想点,那么 ptp_tpt 点的“ 前-后不一致性”应当很小并接近于0,这个“不一致性”就由 Δft→sfull(pt)\Delta f_{t \to s}^{full}(p_t)Δft→sfull(pt) 来刻画。由式(19),实际上 Lgc\mathcal{L}_{gc}Lgc 即是对 Δft→sfull(pt)\Delta f_{t \to s}^{full}(p_t)Δft→sfull(pt) 的值的加权求和。式(20)则在数学表示上刻画了“不一致性”应当低到何种程度——要求“不一致性”必须小于:
- 一个固定下限 α\alphaα(防止在光流非常小的地方被误判),或
- 当前点的光流向量的模场的一定比例 β⋅∥f∥2\beta \cdot \|f\|_2β⋅∥f∥2
只有在该约束条件成立时,才认为当前点不是非理想点,从而将该点的“不一致性”纳入考虑。这个思路的本质是 SfMLearner 的可解释性网络与 MonoDepth 的“左右一致性损失”的结合。
5.3 论文成果与不足
GeoNet 通过将 ResFlowNet 引入 SfMLeaner 的框架,并且重新设计损失函数,有效改善了 SfMLeaner 在面对非理想点时的乏力。在深度估计这个任务上,GeoNet 在 KITTI 数据集上的表现远超 SfMLeaner ,多项指标超过 MonoDepth。尽管距离 Depth-VO-Feat 的水准仍然差一些。
GeoNet 通过几何一致性损失 Lgc\mathcal{L}_{gc}Lgc 来缓解非理想点的影响,不过并没有显式建模,有望寻找更好的方法来解决问题。并且 GeoNet 仍然依赖已知相机参数 KKK ,使得模型的应用范围仍然存在限制。
六、小结
本文围绕 SfMLearner 面临的“尺度模糊”与“非刚性运动”等关键问题,系统梳理了 2018 年三篇重要工作:LKVOLearner 引入可导 DDVO 模块与深度归一化策略,部分解决尺度不确定性;Depth-VO-Feat 融合 MonoDepth 与 SfMLearner 结构,通过双目序列与特征图重建显著提升精度;GeoNet 首次引入非刚性运动建模,并设计几何一致性损失以提升动态场景鲁棒性。这些改进虽各有侧重,也存在一定局限,但整体上推动了无监督单目深度估计的研究进展,为后续工作奠定了基础。
2085

被折叠的 条评论
为什么被折叠?



