《Unsupervised Learning of Depth and Ego-Motion from Video》论文笔记

Unsupervised Learning of Depth and Ego-Motion from Video
作者:Tinghui Zhou,
项目主页

摘要

作者针对于无结构化的单目视频序列的图像深度获取提出了一种无监督网络架构,与之前方法不同在于作者的方法是完全无监督的,而之前的网络或者需要像素深度的标记,或者需要相机姿势的标记等。网络中使用了单目视的深度预测网络与双目视的姿势预测网络,并结合一个 loss 进行训练。这个 loss 是基于相邻图像的区域来合成目标图像的相应区域,并计算两者的 L 1 L_1 loss 得到。

文章的核心思想是利用photometric consistency原理来估计每一帧的depth和pose。photometric consistency就是对于同一个物体的点,在不同两帧图像上投影点,图像灰度应该是一样的。

网络结构

有一个前提是:根据射影几何以及平面投影的相关知识,作者的方法需要提前知道用于拍摄的相机的内部参数 K。

基本网络结构如图所示,包含 Depth CNN 与 Pose CNN 两部分,分别用于预测像素深度、相邻两帧图像之间相机的运动姿势。训练过程中,取 3 帧图像 I t , I t 1 , I t + 1 I_t, I_{t-1}, I_{t+1} ,称 I t I_t 为目标图像,另外两个为源图像。首先 I t I_t 通过 Depth CNN 得到像素深度,将 ( I t , I t 1 ) (I_t, I_{t-1}) ( I t , I t + 1 ) (I_t, I_{t+1}) 分别作为一组送入 Pose CNN 得到相邻像素之间相机的运动 T ^ t t 1 , T ^ t t + 1 \hat{T}_{t \to t-1}, \hat{T}_{t \to t+1}
在这里插入图片描述但是没有像素深度的标记,也没有相机位置的标记,我们只有一个视频序列,怎么样才能做到无监督训练呢?这个时候作者想到了一个很聪明的办法,就是利用网络预测的像素深度来重建图像,通过对重建的图像效果进行训练和优化,来实现对Depth CNN(与Pose CNN)训练和优化。具体实现思路就是已经得到了相邻两帧图像相机的运动 T ^ t t 1 , T ^ t t + 1 \hat{T}_{t \to t-1}, \hat{T}_{t \to t+1} ,那么再结合提前已知的相机内部参数 K,就可以用传统的投影几何的知识,由 I t 1 , I t + 1 I_{t-1}, I_{t+1} 分别来生成 I ^ t \hat{I}_t ,将生成的 I ^ t \hat{I}_t I t I_t 作比较就可以知道重建的效果,通过对此进行优化就间接的对 Depth CNN 进行了训练。
本图就是用来重建得到

第一个问题:如何根据相邻帧(也不一定是紧邻,实际上可能是任意两帧)的图像、当前帧的深度信息以及帧间相机运动信息来重建当前帧图像呢?

不妨记需要重建的帧为目标图像 I t I_t ,用于重建 I t I_t 的帧为源图像 I s I_s ,重建得到的图像为 I ^ s \hat{I}_s 。针对于目标帧的每个像素点 p t p_t ,计算目标帧中该像素点对应的物体在源帧中所应处于的像素点位置 p s p_s ,他们的关系为 p s K T ^ t s D ^ t ( p t ) K 1 p t p_s \sim K \hat{T}_{t \to s} \hat{D}_t(p_t) K^{-1} p_t 其中 T ^ t s \hat{T}_{t \to s} 为 t 到 s 帧相机运动姿势, D ^ t ( p t ) \hat{D}_t(p_t) 为第 t 帧像素点 p t p_t 的深度值。即根据投影几何的知识,应当有 I t ( p t ) I_t(p_t) I s ( p s ) I_s(p_s) 对应的是物理世界中的同一个点,因此不考虑其他因素时(这个假设有很大漏洞,后面作者会提出一些补偿措施),他们的亮度信息应该相同,因此可以用 I s ( p s ) I_s(p_s) 作为重建图像 I ^ s \hat{I}_s 中位于点 p t p_t 的亮度值。但是矩阵运算得到的 p s p_s 不一定是一个整数,那么就通过双线性插值的方法来获得 I s ( p s ) I_s(p_s) 。不过如果计算得到了 p s p_s 超出了图像边界范围怎么办呢?这个作者没提到,我也没想到太好的方法,可以看看作者的源代码是怎么实现的。

第二个问题:如何优化?损失函数是什么呢?

既然重建得到了 I ^ s \hat{I}_s ,就比较重建的效果,取 L v s = s p I t ( p ) I ^ s ( p ) L_{vs} = \sum_s \sum_p |I_t(p) - \hat{I}_s(p)| 其中对 p 求和表示对图像中的像素点逐个计算差值。如果像素深度和相机运动姿势预测的比较好,自然重建效果就比较好。

第三个问题:刚才的思路中暗含一个假设,就是视频中无遮挡、无形变、场景静止、从任何角度亮度都不变等(作者提到 the surface is Lambertian so that the photo-consistency error is meaningful. 不过我没太理解),这个假设基本不能满足,该如何解决呢?

为此作者引入了一个 soft mask E ^ s \hat{E}_s ,损失函数变为 L v s = s p E ^ s ( p ) I t ( p ) I ^ s ( p ) L_{vs} = \sum_s \sum_p \hat{E}_s(p) |I_t(p) - \hat{I}_s(p)| 但是有可能网络最终会得到所有的 E ^ s ( p ) \hat{E}_s(p) 都是0,为了防止这一情况加入正则化项 L r e g ( E ^ s ) L_{reg}(\hat{E}_s)

第四个问题:Overcoming the gradient locality(使输出图像更平滑?原文没太读明白,下面的解释参考自博客

为了输出(不论是深度还是视差)在图像分布中平滑,特别为了解决低纹理或估计值离真值太远时会造成梯度为0或梯度错误的情况,大家一般会有两种思路:将周围的梯度传递给当前像素;和其他无监督方法一样用一个表征平滑度的正则化。本文受SfmNet启发,采用后一种方案。作者是用深度图的二阶梯度的L1的正则项来提取平滑信息。因此最终损失函数为 L f i n a l = l L v s l + λ s L s m o o t h l + λ e s L r e g ( E ^ s l ) L_{final} = \sum_l L_{vs}^l + \lambda_s L_{smooth}^l + \lambda_e \sum _s L_{reg}(\hat{E}_s^l)

第五个问题:Depth CNN 与 Pose CNN 使用的网络结构是什么?

这里作者参考了DispNet,对于这个网络/这篇论文比较详细的解释可以参考博客,博主写的很好易懂。稍微难以理解的就是那个 Upsample + Concat 的连接,简单来讲就是用较低分辨率的特征进行预测,将预测结果上采样后与之前的特征进行级联送入下一个解卷积层。
在这里插入图片描述

实验结果

本文为无监督训练,相比于其他方法,在某些情况下比 Godard 等人的 Unsupervised monocular depth estimation with left-right consistency 效果稍差,其余情况均表现良好。由下面图片可以看出较近的车辆、路面、建筑等都基本能够预测出相对深度。
在这里插入图片描述

参考资料

  1. Unsupervised Learning of Depth and Ego-Motion from Video
  2. https://www.zhihu.com/question/66006923/answer/241333356
  3. https://blog.csdn.net/Kevin_cc98/article/details/78957218
  4. https://blog.csdn.net/kongfy4307/article/details/75212800

猜你喜欢

转载自blog.csdn.net/weixin_41024483/article/details/87992248
今日推荐