文章目录
近期调研查看视觉SLAM系列文章,将自己看的一些做一个整理。
1 概要
1.1 简要
题目:Unsupervised Learning of Depth and Ego-Motion from Video, CVPR2017
论文:https://people.eecs.berkeley.edu/~tinghuiz/projects/SfMLearner/cvpr17_sfm_final.pdf
代码:https://github.com/jonathanventura/cylindricalsfmlearner
简介:提出来一种无监督框架,预测无结构视频序列的 单目深度和相机位姿估计,
1.2 背景知识
Structure from Motion:基于运动的重建,旨在利用外部监督,通过特征匹配,位姿估计或立体来消除在测试时出现的一些低纹理度、复杂几何等的一些问题。
Warping-based视点合成:最新方法可以通过深度或流来合成新视角,例如DeepStereo,Deep3D,Appearance Flows。基于warping的主要学习几何关联性中的中间部分。
视频的无监督/自监督学习:Pretest任务:ego-motion估计,追踪,时域一致性,目标运动掩码等。
重投影映射:通过单目视觉相机模型将目标视图中的点投影到源视图中的点
2. Motivation
1)由人类运动意识的形成,说明人类通过过去的视觉经历来建模当前的观察。
因此该方法想要通过观察到的序列来训练模型,预测相机运动和场景结构如图1所示。
2)一个集合视角合成系统当且仅当其场景集合的中间预测和相机位姿与物理真值对应时,才表现好。因此不难完美的几何估计/位姿估计会被 看上去合理的合成视角欺骗,模型也会在另一个场景或不同表现的结构下失败。
–>因此,目标就是建模整个视角合成流程作为卷及神经网络的输入,因此,通过对大规模视频数据进行视点合成的元任务训练,网络被迫学习深度估计和相机姿态估计等中间任务,从而对视觉世界做出一致的解释。
3. 思想
用视点合成作为监督信号,实现端到端的学习。
整体的框图如图2所示,对于深度网络(Depth CNN),输入的是目标视图 I t I_t It,输出像素点的深度 D ^ t ( p ) \hat{D}_t(p) D^t(p).对于位姿网络(Pose CNN),输入的是目标视图 I t I_t It和源视图 I s I_s Is(不止一个,比如 l t − 1 l_{t-1} lt−1与 l t + 1 l_{t+1} lt+1),输出的是源视图相对于目标视图的位姿 T ^ t → t − 1 \hat{T}_{t \rightarrow t-1} T^t→t−1和 T ^ t → t + 1 \hat{T}_{t \rightarrow t+1} T^t→t+1等。
主要的思路是将一个目标图像上的像素点首先经过重投影映射到源图像上(一般不止一个),然后将这个源图像中像素点扭曲(warp)到和目标图像上对应像素点同一位置,最后对这同一位置对应的像素点求像素差,也就是灰度值的差(有点类似于求特征点匹配)。
4. 算法
4.1 坐标系转换与损失衡量:
下面公式为从相机坐标系到理想图像坐标系,假设我们已知相机内参
K
K
K,不考虑畸变的情况,有如下映射:
p
t
p_t
pt是
I
t
I_t
It中一点的齐次形式。左乘
D
^
t
(
p
t
)
K
−
1
\hat{D}_t(pt)K^{-1}
D^t(pt)K−1,将
p
t
p_t
pt映射到三维空间,这里齐次坐标的坐标系原点是
t
t
t时刻相机位置;左乘
T
^
t
→
s
\hat{T}_{t\rightarrow s}
T^t→s,将齐次坐标系原点移至
s
s
s时刻的相机位置;最后左乘
K
K
K,将三维坐标映射到2D图像上。
如此这样我们就得到了
I
s
I_s
Is与
I
t
I_t
It的对应关系,也就是说
I
S
I_S
IS上
p
s
p_s
ps位置的数值,应该跟
I
t
I_t
It上
p
t
p_t
pt位置上的数值相同。然后就可以用最简单的损失函数,来衡量这种一致性了:
使用损失进行反馈,优化深度网络和位姿网络。
4.2 可微深度图
不过得到的 p s p_s ps是连续值,我们必须将其映射到对应的像素点才能得到 I ^ s \hat{I}_s I^s。于是作者采用了经典论文spatial transformer networks的双线性采样来解决。即 I ^ s ( p t ) \hat{I}_s(p_t) I^s(pt)的像素值为 I s ( p s ) I_s(p_s) Is(ps)周围四个点的双线性差值结果。
视图扭曲(warp):一个像素点包含两个信息,一个是灰度值,另一个是位置。可微分双线性采样机制解决了灰度值的问题,这里为了满足公式(1)中的代价函数,需要将所有源视图中的 p s p_s ps点的位置扭曲成目标视图中 p t p_t pt点的位置。
整体扭曲过程如图3所示:
4.3 针对移动物体的处理
单目视图建立在以下假设之上:
(1)视图场景完全是静止的,不存在动态物体。
(2)目标视图和源视图之间没有遮挡和离合的物体。
(3)物体表面是朗伯体以保证图像一致性误差有意义。
但其实实际上上面假设不完全满足,因此为提高系统鲁棒性,克服以上的问题,在这里增加了另一个训练网络explainability prediction network(和深度和位姿估计网络联合)。输入为
I
s
I_s
Is与
I
t
I_t
It,输出为一个遮罩层
E
^
s
\hat{E}_s
E^s(soft mask)。因此将公式(1)改为公式(3):
E
^
\hat{E}
E^相当于赋予了网络对误差“视而不见”的能力。如果按这个损失函数训练,网络很自然地会把
E
^
\hat{E}
E^的每一个值都赋值为0,这样loss也为0。当然这么做是没有意义的,我们必须限制
E
^
\hat{E}
E^:
理想情况下, I t I_t It 和 I s I_s Is 中的每个像素点都一一对应,此时遮罩层不需要起作用,也就是 E ^ \hat{E} E^ 的每一个值都是1。我们希望网络尽可能地接近这种情况,也就是说希望 E ^ \hat{E} E^ 的每个元素尽可能接近1。为了到达这个目的,我们用 E ^ \hat{E} E^ 和1之间的交叉熵来衡量误差,希望交叉熵越小越好。也就是公式(4)的诞生,增加了正则项的部分。
4.4 克服大位移情况
网络通过对损失函数求导来实现优化。可是当估计的
p
s
p_s
ps处的纹理单一,或者距离真实的
p
s
p_s
ps比较大的时候,求导会产生问题。这是以为双线性插值之和
p
s
p_s
ps 周围4个点的像素值有关。为了解决这个问题,作者引入了多尺度 和 平滑损失。多尺度 是指先把
I
t
I_t
It 和
I
s
I_s
Is的尺寸都压缩,然后再计算
L
v
s
L_{vs}
Lvs 。这样尽管 双线性还是从周围4个像素取样,但是这4个像素却对应着原图较大的一片区域。平滑损失则用来抑制 深度 的突变,如下:
因此,总的损失函数设计如下,其中
l
l
l表示不同图像尺度。
4.5 整个网络结构
整个估计系统的网络结构如图4所示.
单视图深度,采用DispNet框架设计。
虽然也是用了多视角作为输入来训练深度网络,但并没有发现其改善效果。这可能是由于需要对多视角采用光流限制来限定。
位姿:
输入:目标视图 + 所有源视图;
输出:位姿
5. 实验结果
KITTI 作为基准线;
Make3D作为验证交叉数据生成能力;
效果还是不错的。
图6展示了与其他监督基准线的比较。可以看出还是不错的。
6. 总结与思考
可挖掘的几点:
- 当前框架没有显式估计动态场景和遮挡,其在3D场景理解至关重要;通过动作分割直接对动态场景建模是潜在的可研究点;
- 我们的框架假定相机内参已给定,这就无法使用来自随机相机的视频;
- 深度图在当前3D场景下是一个简单表示。可以有3D体素表达。
参考:
https://zhuanlan.zhihu.com/p/50544334
https://blog.csdn.net/wangshuailpp/article/details/80098059
https://blog.csdn.net/excellent_sun/article/details/88866896