Depth estimation from a single image gaunthan Posted on Oct 11 2018 ? Computer Vision ? ? vSLAM ? > 我们知道,三维数据投影到二维空间时,会丢失一个维度的信息。相机成像时,三维场景投影到二维的成像平面上,这一过程中丢失了场景的深度信息。在双目SLAM中,可以利用左右目的视差计算深度信息,在单目SLAM中,可以通过移动视角利用三角化估计深度信息。然而,很多时候我们仅仅拥有一张图像,例如从Web下载了单独的一张图片。怎么估计单张图像的深度呢? ## 概述 估计单张图像的深度是一项备受挑战的任务,因为我们没有额外的几何约束信息。如果我们拥有两张同一个场景的不同视角下的图像,那么可以通过特征匹配获得匹配点,再通过三角化估计匹配点的深度。但是在单张图像中,我们没有这种对极几何约束信息可以利用,而且对场景的整体信息一无所知,因此准确地估计图片的深度变得异常困难。本文介绍数种基于深度学习从单张图像估计场景深度的方法。 ## 用CNN直接回归深度值 论文[^1]提出了一种较为直接的方法,它将待估计的图片送入CNN,网络直接回归出深度估计值。它将估计过程分成了两个部分,首先估计场景的全局结构,然后利用局部信息进行精调。 ### 模型架构 模型架构如下图所示: [^1]: Eigen D, Puhrsch C, Fergus R. Depth map prediction from a single image using a multi-scale deep network[C]//Advances in neural information processing systems. 2014: 2366-2374.  ### 全局粗尺度网络 粗尺度网络位于图中紫色方框圈起的部分,它的任务是用场景的全局视角信息(如灭点,物体位置,房间对齐信息等)预测深度图的整体结构。这类信息通过全局视角才可获得,局部视角(如双目匹配)无法留意到这样的信息。 网络的前五层卷积层在ImageNet上预训练,所有隐藏层都使用ReLU激活函数。 ### 局部细尺度网络 细尺度网络位于图中橙色方框圈起的部分,它的任务是修改接收的粗略的预测,使它与物体和墙壁的边缘对准。 网络仅包含卷积层,第一层卷积层处还有一个池化操作。输入图片经过一层卷积后与粗尺度网络输出的深度图进行合并,然后再经过两层卷积层,得到精调后的深度图。 ### 训练方法 首先使用训练集训练粗尺度网络,然后固定它的权重,接着训练细尺度网络。 ### 代价函数 #### 尺度不变误差 在深度预测中,场景的全局尺度是模糊的,预测的深度与实际的深度相差一个未知的尺度,因此直接计算预测值与真实值的误差将导致结果不稳定。通过对深度图归一化,能够大大降低整体预测误差。因此,论文提出了一种尺度不变误差,它能够忽略全局尺度衡量场景数据点之间的关系: $$ D(y, y^*) = {1 \over 2n} \sum_{i=1}^n (logy_i - logy_i^* + \alpha(y, y^*))^2 \tag{1} $$ 上式中,$y$代表预测值,$y^*$代表真实值。$\alpha(y, y^*) = {1 \over n} \sum_i (logy_i^* - logy_i)$。对任何预测$y$,$e^\alpha$是将它与真实值最佳配准的尺度。任意标量乘以$y$都拥有与$y$一样的误差,因此误差具有尺度不变性。 若令$d_i = logy_i - logy_i^*$,则上式可写为 $$ \begin{align*} D(y, y^*) &= {1 \over 2n^2} \sum_{i,j} ((logy_i - logy_j) - (logy_i^* - logy_j^*))^2 \tag{2} \\ &= {1 \over n} \sum_i d_i^2 - {1 \over n^2} \sum_{i,j} d_i d_j = {1 \over n} \sum_i d_i^2 - {1 \over n^2} (\sum_i d_i)^2 \tag{3} \end{align*} $$ 从(2)式可以发现,为了获得较低的误差,预测深度图中像素对的深度值之差需要与对应的真实值的差值相近。从(3)式则又可知该误差等价于常规的L2损失加上额外项$-{1 \over n^2} \sum_{i,j} d_i d_j$。额外项使预测值与真实值具有相近的梯度变化。 #### 训练损失 模型的训练损失定义与上文所述的误差差不多,区别在于为额外项添加了控制因子$\lambda (\lambda \in [0, 1])$: $$ D(y, y^*) = {1 \over n} \sum_i d_i^2 - {\lambda \over n^2} (\sum_i d_i)^2 \tag{4} $$ 当$\lambda = 1$时,(4)式等同于(3)式。$\lambda = 0$时退化为普通的最小二乘误差,此时将不考虑像素间的关系。论文取$\lambda = 0.5$。 需要注意的是,网络的输出是深度的对数值,并且分辨率是原图的1/4。在训练时深度图可能会有很多缺失值,论文只用有效的点计算损失,因此(4)式中的n代表的是有效的深度值的总数,而不是深度图的像素总数。 ### 数据增强 论文只用以下数据增强方法扩充训练集:  翻转、颜色变化和平面内旋转都能保持数据的几何性质,而放大和平移则没有这样的特点。放大可以简单地通过将深度除以图片放大的倍数来进行修正,因为将图片放大s倍就相当于将相机靠近场景s倍。虽然平移很难修正,但实验发现数据即便不修正也能够改进网络的表现。 ### 实验测试 模型在NYU Depth和KITTI数据集上进行了测试,评分函数定义如下:  评分结果如下:   ### 结论 论文发表在2014年,因此可谓是深度学习在该问题上的第一个标志性成果。从结果可知,论文所提出的方法优于传统的深度估计方法(手工特征+概率图模型)。 ## 深度卷积神经场 论文[^2]考虑了深度值的连续性,将深度估计问题转化为连续条件随机场(Conditional Random Field, CRF)学习问题。 [^2]: Liu F, Shen C, Lin G. Deep convolutional neural fields for depth estimation from a single image[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 5162-5170. 论文[2]与[1]类似,也使用了卷积神经网络回归深度值,但两者其实有很大的不同。论文[1]直接用CNN回归出最终的深度值,而论文[2]用CRF显式地对相邻超像素的关系进行建模,对CNN输出的深度值进行进一步的修正。此外,论文[1]的输出只有原图的1/4大小,并且丢失了一些边缘部分,而论文[2]则没有这样的问题。 ### 超像素 一张图像包含很多个像素,超像素(superpixel)指的是一片连续相邻的像素的集合。一个超像素包含很多个像素,因此相比于单个像素,它具备更高层的语义。  论文[2]假定图像是由很多小型的单应区域(homogeneous regions,即superpixels)组成的。这个假设是很自然的:图像中的像素不是孤立的,总有一些像素归属于同一个对象、分布在同一个平面上,如地板、天空、墙壁等。单应区域上的像素,具有相近的深度值。 ### 模型架构 模型架构如下图所示:  ### 模型定义 令${\bf x}$代表图片,${\bf y} = [y_1, \dots, y_n]^T \in R^n$是组成${\bf x}$的$n$个超像素对应的深度值,则CRF可用以下密度函数表示: $$ Pr({\bf y} | {\bf x}) = {1 \over Z({\bf x})} exp(-E({\bf y}, {\bf x})), \tag{1} $$ $E$是能量函数,$Z$是分区函数(归一化因子),定义如下: $$ Z({\bf x}) = \int_y exp \lbrace -E({\bf y}, {\bf x}) \rbrace d {\bf y}. \tag{2} $$ 预测新图片的深度,需要求解最大化后验推断问题: $$ {\bf y}^* = \underset{y}{\operatorname{argmax}} Pr({\bf y} | {\bf x}). \tag{3} $$ 论文将能量函数$E$定义为一元势能函数$U$和成对势能函数$V$的联合: $$ E({\bf y}, {\bf x}) = \sum_{p \in N} U(y_p, {\bf x}) + \sum_{(p, q) \in \delta} V(y_p, y_q, {\bf x}). \tag{4} $$ 其中,$N$代表组成图像的所有超像素,$\delta$代表所有的边(即超像素对)。$U$旨在为单个超像素回归深度值,$V$则鼓励相邻具有相似外观的超像素具备相似的深度值。这两个函数分别对应于模型的上下两个部分,它们在统一的CNN架构上联合地学习。 $U$对应的详细的网络结构如下图所示:  模型首先将图片分成很多个超像素,然后将每个超像素作为中心,截取一小段图片片段,将该片段送入上图所示的网络中,回归出该超像素对应的深度值。模型利用K种相似性度量计算相邻的超像素对的相似性,得到kx1的相似性向量。 该向量随后被送入全连接层,进行加权求和,最终结果能用于平滑相邻的超像素。 $V$接收所有相邻的超像素对,将它们输入全连接层,获取它们对应的相似度。 CRF损失层接收$U$和$V$的输出作为输入,最小化负对数似然。 ### 势能函数 #### 一元势能 一元势能的定义如下: $$ U(y_p, {\bf x}; \theta) = (y_p - z_p(\theta))^2, \; \forall p = 1, \dots, n. \tag{5} $$ 式中的$z_p$是给定CNN参数为$\theta$时,输入超像素$p$的回归深度值。 #### 成对势能 成对势能接收由K个相似性度量作用在输入的超像素对$p, q$上时得出的kx1维的相似性向量$S_{pq}$加权求和后的结果$R_{pq}$,利用它平滑超像素对,定义如下: $$ V(y_p, y_q, {\bf x}; \beta) = {1 \over 2} R_{pq}(y_p - y_q)^2, \; \forall p,q = 1, \dots, n. \tag{6} $$ $R_{pq}$的计算过程可以用一层无激活函数的全连接层实现,$\beta$是该网络层的参数: $$ R_{pq} = \beta^T [S_{pq}^{(1)}, \dots, S_{pq}^{(K)}]^T = \sum_{k=1}^K \beta_k S_{pq}^k, \tag{7} $$ 为使得划分函数$Z$可积,要求$\beta_k \geq 0$。 论文使用了三种相似性度量,分别用颜色差异、颜色直方图差异和纹理差异计算。相似性$S_{pq}^k$与差异$s_p^{(k)} - s_q^{(k)}$的关系如下: $$ S_{pq}^{(k)} = e^{-\gamma \lVert s_p^{(k)} - s_q^{(k)} \rVert} $$ ### 学习方法 给定了势能函数的定义后,能量函数的具体定义如下: $$ E({\bf y}, {\bf x}) = \sum_{p \in N} (y_p - z_p)^2 + \sum_{(p,q) \in \delta} {1 \over 2} R_{pq} (y_p - yq)^2. \tag{8} $$ 记$R$是由$R_{pq}$组成的矩阵、$D$是由$D_{pp} = \sum_q R_{pq}$定义的对角矩阵,$I$是nxn的单位矩阵,且有: $$ A = I + D - R, \tag{9} $$ 则(8)式可重写为: $$ E({\bf y}, {\bf x}) = {\bf y}^T A {\bf y} - 2 {\bf z}^T {\bf y} + {\bf z}^T {\bf z}. \tag{10} $$ 由于上式中${\bf y}$有二次项且$A$是正定的,分割函数$Z$有以下解析解: $$ \begin{align*} Z({\bf x}) &= \int_y exp \lbrace -E({\bf y}, {\bf x}) \rbrace d {\bf y}. \\ &= {\pi^{n \over 2} \over {\lvert A \lvert}^{1 \over 2}} exp \lbrace {\bf z}^T A^{-1} {\bf z} - {\bf z}^T {\bf z} \rbrace. \tag{11} \end{align*} $$ 密度函数可重写为: $$ Pr({\bf y} | {\bf x}) = {{\lvert A \lvert}^{1 \over 2} \over \pi^{n \over 2}} exp \lbrace -{\bf y}^T A {\bf y} + 2 {\bf z}^T {\bf y} - {\bf z}^T A^{-1} {\bf z} \rbrace, \tag{12} $$ 再求密度函数的负对数: $$ -log Pr({\bf y} | {\bf x}) = {\bf y}^T A {\bf y} - 2 {\bf z}^T {\bf y} + {\bf z}^T A^{-1} {\bf z} - {1 \over 2} log(\lvert A \rvert) + {n \over 2} log(\pi). \tag{13} $$ #### 问题定义 由于最大化一个函数等价于最小化该函数的负对数,因此学习问题可形式化为: $$ \underset{\theta, \beta \geq 0}{\operatorname{min}} - \sum_{i=1}^N log \;Pr({\bf y}^{(i)} | {\bf x}^{(i)}; \theta, \beta) + {\lambda_1 \over 2} {\lVert \theta \rVert}_2^2 + {\lambda_2 \over 2} {\lVert \beta \rVert}_2^2, \tag{14} $$ 式中${\bf x}^{(i)}, {\bf y}^{(i)}$代表第$i$张训练图片和对应的预测的深度图,$N$是训练图片的总数,$\lambda_1$和$\lambda_2$是正则化系数。 #### 优化求解 该最小化优化问题可用梯度下降法求解,根据链式法则,有: $$ \frac{\partial \lbrace -log Pr({\bf y} | {\bf x}) \rbrace}{\partial \theta_l} = 2(A^{-1} {\bf z} - {\bf y})^T \frac{\partial {\bf z}}{\partial \theta_l}, \tag{15} $$ $$ \frac{\partial \lbrace -log Pr({\bf y} | {\bf x}) \rbrace}{\partial \beta_k} = {\bf y}^T {\bf J} {\bf y} - {\bf z}^T A^{-1} {\bf J} A^{-1} {\bf z} - {1 \over 2} Tr(A^{-1} {\bf J}), \tag{16} $$ 式(15)中的$\frac{\partial {\bf z}}{\partial \theta_l}$按神经网络的反向传播过程计算即可。式(16)中的$Tr$代表矩阵的迹,${\bf J}$是nxn的矩阵: $$ J_{pq} = - \frac{\partial R_{pq}}{\partial \beta_k} + \delta(p = q) \sum_q \frac{\partial R_{pq}}{\partial \beta_k}, \tag{17} $$ 式中的$\delta(\cdot)$是指示函数,当$p = q$时取1,否则取0。此外,根据式(7),有$\frac{\partial R_{pq}}{\partial \beta_k} = S_{pq}^{(k)}$。 ### 预测方法 给定一张新的测试图片,预测过程可形式化为最大化后验概率问题: $$ \begin{align*} {\bf y}^* &= \underset{y}{\operatorname{argmax}} Pr({\bf y} | {\bf x}). \\ &= \underset{y}{\operatorname{argmax}} -{\bf y} A {\bf y} + 2 {\bf z}^T {\bf y} \\ &= A^{-1} {\bf z}. \tag{18} \end{align*} $$ ### 实验测试 模型在NYU v2和Make3D数据集上进行了测试,评分函数定义如下:  NYU v2评分结果如下:  下面是测试图片取自NYUD2数据集的效果图:  最后两行的效果图分别由论文[1]和论文[2]的方法生成。对比可知,论文[2]对局部细节掌握得更好,物体的边缘较为清晰。 赏 Wechat Pay Alipay ORB-SLAM2 Compiling Problems Past, Present, and Future of Simultaneous Localization and Mapping: Toward the Robust-Perception Age