SfM (Structure from Motion) 是一种经典的实现三维重建的算法,从相机运动中实现三维重建(要求相机是运动的,环境是静止的)—— 根据一组2D图像序列还原3D空间点位置以及相机位姿。
《Unsupervised Learning of Depth and Ego-Motion from Video》(SfmLearner)提出了基于自监督学习的单目深度+位姿估计的经典框架,成为最基本的自监督学习的范式。后来提出的许多自监督方法都以此为基础。
针对非结构化视频序列的单目深度和相机运动估计问题,我们提出了一种自监督学习框架。
与近期工作一样,我们使用了以视图合成作为监督信号的端到端学习方法。与之前的工作相比,我们的新工作是完全自监督的,只需要单目视频序列进行训练。
我们的方法使用单视图深度网络和多视图位姿网络,利用网络预测的深度和位姿,将时间上邻近的视图打包到目标视图,从而产生损失。因此,训练过程中的损失是耦合在两个网络上的,但在测试时网络可以独立应用。
对KITTI数据集的经验评估证明了我们方法的有效性:(深度&位姿估计两方面的提升)
1.单目深度与使用地面真实位姿或深度进行训练的监督方法相比表现良好。
2.在类似的输入设置下,位姿估计比已建立的SLAM系统表现更好。
人类在估计自身运动和场景的三维结构方面有出色的能力;但是几何计算机视觉的研究,在非刚性的、闭塞的或者缺乏纹理的真实场景上无法创造类似于人类能力的模型。
为什么人类能表现的如此出色呢?
一种假设是,我们通过过去的视觉经验对世界形成了丰富的、结构化的理解,这主要包括四处移动和观察大量场景,并对我们的观察形成一致的模型。
在数百万次这样的观察中,我们认识着世界的规律——道路是平的,建筑物是直的,汽车是在道路上行驶的等等。我们可以将这些知识应用到感知一个新场景时,甚至是从一个单目图像中。
我们通过训练图像序列的模型来模拟这种方法,预测可能的相机运动和场景结构来解释看到的图像序列。
我们采用端到端方法,允许模型直接从输入像素映射到 自我运动(参数化为6自由度变换矩阵)& 场景结构(参数化为视图下每个像素的深度映射)。
如下图,
训练数据是从不同视点拍摄的无标记图像序列,没有提供图像的姿态。
训练过程产生两个独立运行的模型,一个用于单视图深度预测,另一个用于多视图相机位姿估计。
-------------------------------------------------------------------------------------------------------------------------------------
我们的核心观点在于:
只有当几何视图合成系统对于场景几何和相机位姿的估计符合真实情景,才能稳定地有好的表现。
因此,我们的目标是将整个视图合成的过程表述为卷积神经网络的推理过程。
通过训练大规模视频数据的网络来完成视图合成的“元”任务,迫使网络学习深度和相机位姿估计的中间任务,以提出对视觉感知真实世界的一致性解释。
作者提供了开源代码: https://github.com/tinghuiz/SfMLearner
Structure from motion(Sfm)
在已有的技术工具链中,场景结构和相机运动的即时估计是一个得到充分研究的问题。虽然传统的工具链在许多情况下是有效和高效的,但它对精确图像对应的依赖会在低纹理、复杂几何/光度、薄结构和遮挡等领域造成问题。为了解决这些问题,最近已经使用深度学习解决了几个问题,例如特征匹配、姿态估计和立体。这些基于学习的技术很有吸引力,因为它们能够在训练期间利用外部监督,并在应用于测试数据时潜在地克服上述问题。
Warping-based view synthesis
几何场景理解的一个重要应用是新视图合成的任务,其目标是合成从新相机视点看到的场景的外观。视图合成的一个经典范例是,首先显式估计底层的3D几何形状,或者在输入视图之间建立像素对应关系,然后通过合成来自输入视图的图像补丁(例如,[4,55,43,6,9])来合成新的视图。最近,端到端学习被应用于基于深度或流的输入转换来重建新的视图,例如DeepStereo, Deep3D和Appearance Flows。在这些方法中,底层几何分别由量化深度平面(DeepStereo)、概率视差图(Deep3D)和视相关流场(Appearance Flows)表示。与直接从输入视图映射到目标视图的方法不同,基于扭曲的方法被迫学习几何和/或对应的中间预测。在这项工作中,我们的目标是从训练过的用于执行基于扭曲的视图合成的CNN中提取这种几何推理能力。
Learning single-view 3D from registered 2D views
Unsupervised/Self-supervised learning from video
我们提出了利用未标记的视频序列,同时训练一个单目深度CNN和一个相机位姿CNN的方法。
虽然同时训练,但单目深度估计网络和相机位姿估计网络可以在测试时独立使用。
我们模型的训练示例由移动摄像机捕捉到的场景的短图像序列组成。
虽然我们的训练过程某种程度上对于场景运动是 robust 的,但我们主要对于 rigid 场景感兴趣(即场景是静止的,不同帧间的场景外观变化由相机运动决定)。
单目深度和相机位姿估计的CNN的关键监督信号,来自于合成新视图的任务:给定一个场景的输入视图,合成从不同的相机位姿看到的场景的新图像。
给定一个视图的像素深度,结合附近相关视图及其姿态,我们可以合成该目标视图。这个合成过程以完全可微的方式实现,使用CNN作为深度和位姿估计模块。可见性、非刚性和其他非建模因素,可以使用“可解释性”掩码进行处理,我们将在后面讨论(第3.3节)。
< I1, I2,… IN > 作为训练图像的序列,其中某一帧 It 作为目标视图(target view),其余 Is(1 ≤ s ≤ N, s ≠ t) 作为源视图(source view)
新视图合成的目标函数(view synthesis objective)可以表示为下式:
------------------------------------------------------------------------------------------------------------------------------------
p:像素坐标
It:目标视角图像
I^s:源视角图像Is经过深度图像渲染模块变换到目标视角的坐标系
下面描述了自监督学习框架:
下图直观地表示了获取监督信息的流程:
Depth CNN以目标视图 It 为输入,输出单视图的像素深度估计;
Pose CNN以目标视图 It 和邻近的源视图(例如It-1, It+1)为输入,输出相对的相机位姿估计(变换矩阵表示);
所有这些预测结果都会用于重建目标视图,得到的光度重建损失用于训练CNNs;
通过视图合成作为监督的机制,我们可以完全自监督地从视频训练整个框架。
------------------------------------------------------------------------------------------------------------------------------
如 (1) 式所述,学习框架的关键部分就是基于像素深度图像的可微渲染
第一步,首先基于CNN预测的深度图 D^t 和相对位姿 T^t-s ,从源视图 Is 中采样像素来重建目标视图 It :
-----------------------------------------------------------------------------------------------------------------------------------
pt:目标视图中像素的坐标(齐次坐标)
K:相机的内参矩阵
ps:用上式计算像素pt投影到源视图上的坐标(齐次坐标)
由此得到的ps是连续值而不是离散的坐标点,为了得到 Is(ps) 并由此估计 I^s(pt) ,
第二步,采用可微的双线性采样机制(spacial transformer network提出),对四个最邻近的像素点做线性插值(加权平均)来估计 Is(ps)
------------------------------------------------------------------------------------------------------------------------------------
wij 与 ps 到 ps(ij) 的空间距离呈线形比例关系,且 wij 和为1
需要注意的是,在单目视频场景下,上述视图合成公式隐含以下假设:
(1)场景是完全静态的,不含有移动物体
(2)目标视图和源视图之间没有遮挡
(3)朗博表面使得光一致性误差是有意义的
如果训练序列违反了上述任何假设,都会导致梯度被破坏并潜在地抑制训练。
为了提高我们对这些因素的学习管道的鲁棒性,我们额外训练了一个可解释性预测网络(与深度和位姿网络同时训练),对每个target-source pair输出逐像素的软掩码soft mask E^s,表示这种视图合成多大程度上是目标视图的成功建模。
而由于我们对E没有直接监督,容易造成总是预测E的平凡解,于是加入关于E的正则化项:最小化和每个像素位置label都为1的交叉熵损失,鼓励网络预测非零的E值。
换言之,网络倾向于最小化视图合成目标函数,同时对模型中没有考虑的因素有一些松弛度。
对于上述损失函数,仍存在的问题是损失来源于It(pt)与Is(ps)的四个近邻像素,如果真实的ps(用真实的深度和位姿变换得到的结果)位于缺失纹理的位置或者与当前预测距离较远,都会抑制训练。这是运动估计中的常见问题。
我们经验性地发现了解决此问题的方法:
(1)使用具有小瓶颈的卷积编码器-解码器体系结构的深度网络,隐式地约束输出全局平滑,并促进梯度从有意义的区域传播到附近的区域;
(2)显示的多尺度和平滑损失,允许直接从较大的空间区域派生出梯度
我们在这项工作中使用了第二种策略,因为它对于架构选择不敏感。
为了平滑,我们最小化预测的深度图的二阶梯度L1范数
最终的目标函数如下:
--------------------------------------------------------------------------------------------------------------
l:对不同尺度图像的索引;
s:对源视图的索引
λs, λe:平滑损失和可解释性正则项损失的权重
对于单目深度预测,我们使用 DispNet 结构:
【带有跳越连接和多尺度预测的编码器-解码器设计;
除了预测层外,每个卷积层后都有ReLU激活函数;
1/(α ∗ sigmoid(x) + β),α = 10,β = 0.01,预测深度约束在合理的正值范围内】
我们尝试利用多个视图作为输入,并没有改善预测结果,必须执行光流约束才能有效利用多个视图。
位姿估计网络
【输入是目标视图和所有源视图在颜色通道进行concatenate;
输出目标视图和每个源视图之间的相对位姿;
The network consists of 7 stride-2 convolutions followed by a 1 × 1 convolution with 6 ∗ (N − 1) output channels (corresponding to 3 Euler angles and 3-D translation for each source view). Finally, global average pooling is applied to aggregate predictions at all spatial locations. All conv layers are followed by ReLU except for the last layer where no nonlinear activation is applied.
】
The explainability prediction network shares the first five feature encoding layers with the pose network, followed by 5 deconvolution layers with multi-scale side predictions. All conv/deconv layers are followed by ReLU except for the prediction layers with no nonlinear activation. The number of output channels for each prediction layer is 2 ∗ (N − 1), with every two channels normalized by softmax to obtain the explainability prediction for the corresponding source-target pair (the second channel after normalization is ˆEs and used in computing the loss in Eq. 3).
我们提出了一个端到端学习管道,利用视图合成任务监督单视角深度和相机姿态估计。该系统在未标记的视频上进行训练,但表现与需要地面真实深度或姿势进行训练的方法相当。
尽管该方法在基准评价方面表现良好,但还远远不能解决三维场景结构推理的无监督学习问题。
一些重大问题和挑战如下:
(1)我们的模型没有显式地估计场景中的动态和遮挡(隐式地被可解释性掩码考虑在内),而这两个问题都是3D场景理解的重要因素。通过运动分割直接建模动态场景可能是一种方案。
(2)我们的方法假定相机内参是给定的,这就限制了实际情况中未知相机的视频序列估计(作者说他们计划在未来工作中解决这个问题)。
(3)深度图是真实3D场景的简化表示。扩展此模型去学习3D体积表示(full 3D volumetric representations)是有趣的方向。
未来工作的一个有趣方向是更深入地研究我们的自监督系统学习到的表示。特别是位姿估计网络倾向于从图像相关性来学习相机位姿,而深度估计网络可能识别场景和物体的共同特征。或者将我们的工作重新用于对象检测或者语义分割等任务。
最后放上一些对我理解这篇论文和相关工作有帮助的文章:
【逆卷积/转职卷积概念的理解:转置卷积一文详解卷积和逆卷积】