1. Abstract
- 提出了一种无监督单目深度估计和相机运动估计的框架
- 利用视觉合成作为监督信息,使用端到端的方式学习
- 网络分为两部分(严格意义上是三个)
- 单目深度估计
- 多视图姿态估计
- 解释性网络(论文后面提到训练了第三个网络)
2. Introduction
- 计算机几何视觉难以重建真实的场景模型
- 由于非刚性、遮挡、纹理缺失等情况的存在
- 人类在很短的时刻可以推断自我运动以及三维场景的结构,为什么?
- 一个假设就是人类在移动中通过观察大量的场景,已经进化出一个对真实世界丰富的、具有结构层次的理解力。通过这些上百万次的观察,人们已经认识到了世界的规律性—路是平的,大楼是直立的等,于是在进入一个新的场景,即使通过一个单目图像。我们也可以运用这些先验知识来识别场景。
- 很自然地,我们就想到通过训练一个观察图像序列的网络来模拟这种能力,这个网络的目的在于通过预测相机运动和场景结构来解释观察到的内容。
- 端到端的方式。直接从输入的像素来估计相机运动(6个*度的变化矩阵)和场景结构(每个像素的深度)
- 视觉合成作为度量。
- 无监督的方法。直接使用图像序列进行训练,不需要人工标记甚至相机运动信息。
- 本文方法建立一个观点的基础上:只有当场景的中间预测与相机姿态与真实场景一致的时候,几何视觉合成系统才会表现的很好。
- 但是对于某些场景(例如纹理缺失),几何和姿态估计的不好会导致视觉合成的错误,由此相同模型在面对另一类场景(布局和场景结构更多样)时,会非常失败。
- 本文的目标是构建整个视觉合成的流程,作为CNN的推理过程,通过学习深度和相机姿态的中间估计,以达到网络解释内容与真实世界一致的效果。
3. Related Work
3.1 SFM
3.2 Warping-based view synthesis
3.3 Learning single-view 3D from registered 2D views
3.4 Unsupervised/Self-supervised learning from video
4. 方法
4.1 视觉合成作为监督
图1:基于视觉合成的有监督训练流程
本文深度和姿态预测的监督信息来自于视觉合成:给定一个场景的输入图片,合成该场景在另一个相机姿态下的新的视角。给定输入图片中每一个像素的深度,再加上该图片某个相邻视角下相机的姿态以及可见性,我们可以合成同一场景新的视角图片。可见性由本文的explaination网络完成,视角合成可以由CNN完成。
假设\(<I_1,\cdots,I_N>\)表示一个训练图像序列,序列中的一帧作为目标视角\(I_t\),其余的作为源视角\(I_s(1 \leq s \leq N, s \neq t)\).视觉合成的目标函数可以表示为:
\[\mathcal{L}_{vs} = \sum_{s} \sum_{p} |I_t(p)-\hat{I}_s(p)| \tag{1}\]
这里\(p\)表示一个像素坐标,\(\hat{I}_s\)是基于深度图像及render方式将输入视角\(I_s\)翘曲(warp)到目标视角坐标系的图像
注:
可见性(visibility):指两个不同的目标视图在生成新视图的过程中,warp到新视角的同一点。当新视角的一个3D点被另一个3D点遮挡的时候,就会出现这种情况。
4.2 基于图像渲染的可微分深度
图2:可微分图像翘曲描述。对于target view的每个像素点\(p_t\),首先基于预测的深度和姿态将其投影至source view,然后利用双线性差值获得点\(p_t\)在翘曲后图像\(\hat{I}_s\)的像素值
考虑两个相机和一个三维点\(P\),\(P\)在第一、第二个视角的投影坐标分别为\(p_s\),\(p_t\)。假设世界坐标系是第一个相机的相机坐标系,透视投影变换公式如下:
\[ Z_t p_t = \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}_{t} = KP \tag{2}\]
\[Z_s p_s = \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}_{s} = K \hat{T}_{t \to s} P \tag{3}\]
其中\(Z_t\)、\(Z_s\)分别是点\(p_t\)、\(p_s\)的深度,\(K\)是相机的内参矩阵(假设内参一致),\(\hat{T}_{t \to s}\)表示相机1到2的相对位姿。基于\(p_t\)的深度值(所以该方法称为DBIR,又称为3D image warping),变换公式(2)得到:
\[P=Z_t K^{-1} p_t \tag{4}\]
将公式(4)代入公式(3),得到:
\[Z_s p_s =Z_t K \hat{T}_{t \to s} K^{-1} p_t \tag{5}\]
公式(5)可以看成:我们只需要知道新视角(虚拟的,3D image warping得到的)相对于参考帧所在相机的姿态变换\(\hat{T}_{t \to s}\),相机的内参,以及参考帧每个像素的深度值,就可以通过公式(5)合成一个新的虚拟视角。这里的原理详见参考[1]。所以得到论文中的公式,见公式(6),\(\hat{D_t}\)表示\(p_t\)的深度值。
\[p_s \sim K \hat{T}_{t \to s} \hat{D_t} (p_t) K^{-1} p_t \tag{6}\]
因为透视变换得到的图像坐标\(p_s\)是连续的(小数),因此无法获得\(p_s\)的灰度值。本文根据双线性插值获得\(p_s\)处的灰度值\(I_s(p_s)\),
\[\hat I_s=I_s(p_s)=\sum_{i \in \{t,b \}, j \in \{ l,r\}} w^{ij} I_s(p_s^{ij}) \tag{7}\]
4.3 克服模型局限性建模
- 建模基于三个假设
- 场景是静态的,没有动态的物体;
- 目标视角和源视角之间没有遮挡和离合的物体;
- 物体表明是朗伯表面(漫反射)以保证图像一致性误差有意义。
- 解释性预测网络(explainability prediction network)
- 由于以上三个假设并不完全满足,因此为了提高系统的鲁棒性,增加一个训练网络
- 与深度、姿态网络联合训练
- 输出:每对目标视角-源视角每个像素的soft mask$ \hat{E_S}$,表示
- 对公式加一个置信参数(有点类似直接法SLAM的优化方程)
\[\mathcal{L}_{vs}=\sum_{<I_1,\cdots,I_N> \in \mathcal{S}} \sum_{p} \hat{E_s}(p) |I_t(p) - \hat{I_s}(p)| \tag{8}\] - 最小化loss函数时候,很可能会让\(\mathcal{L}_{reg}(\hat{E}_{s})\)为0,那么整个loss函数就没有意义了;
- 为了避免这种情况,需要对公式(8)添加一个正则项\(\mathcal{L}_{reg}(\hat{E}_{s})\),通过最小化每个像素点处与1之间的交叉熵损失,来避免\(\hat{E}_{s}\)为0;
- 换句话说,鼓励网络最小化视觉合成的目标函数,但允许一定程度的松弛度以磨合网络未考虑的因素。
4.4 克服梯度局限性
- 梯度来源于\(I(p_{t})\)与相邻四个点\(I(p_s)\)的像素差
- 如果利用ground-truth深度和姿态得到的投影像素\(p_s\)(这是一个精确值)位于低纹理区域,或当前估计不够准确时,网络会一直训练。
- 两种典型的处理这种问题的方法
- 使用带有bottleneck层的encoder-decoder网络架构,从而约束深度网络的输出平滑,并且促使有意义的梯度区域传给周围像素;
- 明确多尺度和平滑损失:允许梯度能从更大的区域得到;
- 本文使用了第二种方法。
- 为了平滑损失,在预测深度图时,最小化二阶梯度的\(L_1\)范式
- 最终的目标函数变为:
\[\mathcal{L}_{final}=\sum_{l} \mathcal{L}_{vs}^{l}+\lambda_{s} \mathcal{L}_{smooth}^{l} + \lambda_{e} \sum_{s} \mathcal{L}_{reg}(\hat{E}_{s}^{l}), \tag{9}\]- \(l\)表示不同的图像尺度,\(s\)表示源图像,\(\lambda_{s}\)和\(\lambda_{e}\)分别是深度平滑loss和解释性网络正则化的权值。
4.5 网络架构
图3:网络架构
- 单目深度估计
- 输入:目标视角(target view)
- 采用DispNet结构;
- 采用带有跳跃连接(skip connections)的Encoder-Decoder架构,multi-scale端预测深度;
- 除了深度预测层,所有层都采用ReLU函数激活;
- 深度预测层采用\(\frac{1}{\alpha * sigmoid(x)+ \beta}\),这里的\(\alpha = 10\),\(\beta = 0.1\),以保证预测深度为正值,且在一个合理范围内。
- 除了前四层分别采用7*7, 7*7, 5*5, 5*5的卷积核,其余都采用3*3的卷积核
- 姿态估计
- 输入:目标视角(target view)和所有源视角(source view)
- 输出:目标视角与每一个源视角的相对姿态
- 7个卷积层,步长为2,除了前两个卷积层和最后两个反卷积(预测)层的卷积核分别是7*7, 5*5, 5*5, 7*7之外,其余都采用3*3的卷积核
- \(6*(N-1)\)个1*1的卷积层(对应于6个*度:3个欧拉角和3个平移量)
- 第一个卷积层的输出通道为16
- 解释性网络
- 与pose网络共享前五个econding层
- 5个反卷积层的多尺度预测
- 除了预测层没有激活函数,所有卷积层/反卷积层都使用ReLU激活函数
- 每个预测层的输出通道为\(2 * (N-1)\),每两个通道都使用softmax归一化,以获得每个source-target对的解释性预测(第二个通道归一化为\(\hat{E}_{s}\),用于计算公式5的loss)
5. 实验
主要使用了KITTI作衡量基准,同时使用了Make3D数据集以评估模型的泛化能力。
训练:
- Tensorflow架构(github也有PyTorch实现)
- \(\lambda_{s}\)设为\(0.5 / l\)(\(l\)是下采样因子),同时\(\lambda_{e}=0.2\)
- 每层都使用Batch Normalization和ReLU
- 优化器使用Adam,\(\beta_{1}=0.9\),\(\beta_2=0.999\)
- 学习率:0.002,mini-batch的size为4,迭代次数150K
- 单目相机拍摄的图像序列,训练时将图片设为128$\times$416
5.1 单目深度估计
- 使用KITTI数据集训练
- 排除所有帧中平均光流小于1个像素的静态场景作训练
- 固定图像序列长度为3帧,将中间帧作为target view,中间帧的\(\pm 1\)帧作为source view
- 一共44540个序列,40109用于训练,4431用于测试。
6. 讨论
考虑了三个未来工作:
- 本文目前的框架没有明确估计动态场景和遮挡(尽管explainability已经将其考虑在内),这两者都是三维场景理解的关键因素。通过motion segmentation建模或许是解决方法之一
- 目前的框架假设内参已知,这限制了对网上视频的应用,未来考虑解决这一问题
- 深度图是三维场景的一种简单表示方法,考虑应用更好的表示,例如体素。
另一个有趣的方向是探究由本文学习得到的系统更详细的细节,尤其是姿态估计时使用某种图像对应,深度估计时识别场景和对象的共同特征,即探究语义分割、对象检测等对本文框架的影响。
参考
[1] Christoph Fehn. Depth-image-based rendering (DIBR), compression, and transmission for a new approach on 3D-TV
[2] https://blog.csdn.net/wangshuailpp/article/details/80098059