1. 摘要
本文作者提出了一种多尺度的深度网络用来从单张图片估计深度图。该网络由两部分组成:一个全局粗糙网络以及一个局部细化网络。同时,作者还提出了一种尺度不变误差来估计深度关系。最终作者利用原始训练数据集在 NYU Depth 和 KITTI 数据集上获得了当前最佳性能。
2. 介绍
估计深度对于理解一个场景的几何信息是非常重要的,它能为目标和环境提供丰富的表达,从而有助于目标识别任务以及 3D 建模等应用。
作者认为立体图片深度估计通过局部表面特征就能够获取鲁棒的对应点关系,使用局部视差就足矣。而单张图片要想估计出深度则需要借助全局图像,挖掘出潜在的信息,如图片中线条的角度、透视图、目标大小、位置以及大气效应。
另外,作者认为从单张图估计深度这个任务是有着内在歧义性的,全局尺度就是其中之一,一个极端的例子就是一个普通的房间和一个 dollhouse。作者为了解决这个问题于是提出了尺度不变误差,该误差关注的是场景的空间关系而非真实尺度下的深度值,而这点也适用于 3D 建模等应用。
文章中作者提出了一种新的估计单张图片深度的方法,通过一个多尺度网络直接回归深度。具体网络由两部分组成,粗糙网络利用全局图像信息能够估计出图像的模糊深度,细化网络能够使深度图的局部细节更加清晰。
3. 方法
3.1. 模型结构
网络模型整体结构如下图所示。
上方是粗糙网络用来获取图片全局的模糊深度值,下方是细化网络,用于改善细节信息。粗糙网络中反复使用卷积与池化层,后接两个全连接层,并将最后一个全连接层直接转换为粗糙网络输出的特征图(4096 -> 4070 -> 1 * 74 * 55),同时在这层中(第 6 层)使用了 Dropout 防止过拟合。细化网络中也采用卷积加池化的方式提取特征,但是除了第一层,其他层不改变特征图大小,并在第二层将粗糙网络的输出合并起来一起训练,最终输出的深度图大致是原图的 1/4 分辨率,表格中给出了详细的参数。整个训练是分两步走的,先训练好粗糙网络,再训练细化网络,训练细化网络时,不更新粗糙网络输出结果的。这里很重要的一点是在粗糙网络和细化网络的第一层卷积中都没有设置 padding,因此最终输出的深度图不包含原图最外层 4 像素宽度的区域。
3.2. 尺度不变误差
作者先定义了下面这种形式的尺度不变误差。
D(y,y∗)=1n∑i=1n(log yi−log yi∗+α(y,y∗))2
D(y,y^*)=\frac{1}{n}\sum^n_{i=1}(\text{log}\ y_i-\text{log}\ y_i^*+\alpha(y,y^*))^2
D(y,y∗)=n1i=1∑n(log yi−log yi∗+α(y,y∗))2
其中 y,y∗y,y^*y,y∗ 分别是估计的深度图以及真实的深度图,nnn 是总的像素点个数,α(y,y∗)=1n∑i(log yi∗−log yi)\alpha(y,y^*) = \frac{1}{n}\sum_i(\text{log}\ y_i^*- \text{log}\ y_i)α(y,y∗)=n1∑i(log yi∗−log yi),α(y,y∗)\alpha(y,y^*)α(y,y∗) 代表估计深度图与真实深度图在log空间的平均差值,将该值叠加在每个像素点的对数深度误差上就使得最终的误差具有了全局的尺度不变性。估计的深度图全局增加或减小深度均不会改变误差大小。
D(y,y∗)=1n∑i,j((log yi−log yj)−(log yi∗−log yj∗))2=1n∑idi2−1n2∑i,jdidj=1n∑idi2−1n2(∑idi)2 \begin{aligned} D(y,y^*) & = \frac{1}{n}\sum_{i,j}((\text{log}\ y_i-\text{log}\ y_j)-(\text{log}\ y_i^*-\text{log}\ y_j^*))^2 \\ & = \frac{1}{n}\sum_id^2_i-\frac{1}{n^2}\sum_{i,j}d_id_j = \frac{1}{n}\sum_id^2_i-\frac{1}{n^2}\bigg(\sum_id_i\bigg)^2 \end{aligned} D(y,y∗)=n1i,j∑((log yi−log yj)−(log yi∗−log yj∗))2=n1i∑di2−n21i,j∑didj=n1i∑di2−n21(i∑di)2
其中 di=log yi−log yi∗d_i = \text{log}\ y_i - \text{log}\ y_i^*di=log yi−log yi∗,从第一行等式我们可以看出该误差关注的是相对深度,例如 yiy_iyi 和 yi∗y_i^*yi∗ 可能不等,但是只要 (log yi−log yj)(\text{log}\ y_i-\text{log}\ y_j)(log yi−log yj) 和 (log yi∗−log yj∗)(\text{log}\ y_i^*-\text{log}\ y_j^*)(log yi∗−log yj∗) 相等,误差依然为 0。另外,即使估计的深度值 yi,yjy_i,y_jyi,yj 都乘上一个常数,计算的误差也不会变化,这就证明了该误差确实有尺度不变性。从等式第二行我们也可以看到 −1n2∑i,jdidj-\frac{1}{n^2}\sum_{i,j}d_id_j−n21∑i,jdidj 就是在 MSE 基础上添加的一个惩罚项,要想该误差小,di,djd_i,d_jdi,dj 就要同号,即前面表达的相对深度误差要小。
3.3. 训练损失
最终的训练损失是正常均方误差以及上述尺度不变误差的一个权衡后的综合结果。
L(y,y∗)=1n∑idi2−λn2(∑idi)2
L(y,y^*)=\frac{1}{n}\sum_id^2_i-\frac{\lambda}{n^2}\bigg(\sum_id_i\bigg)^2
L(y,y∗)=n1i∑di2−n2λ(i∑di)2
其中 λ∈[0,1]\lambda\in[0,1]λ∈[0,1],λ=0\lambda=0λ=0 就是均方误差 l2l2l2,λ=1\lambda=1λ=1 就是尺度不变误差,最终作者选择了两者的平均,λ=0.5\lambda=0.5λ=0.5,能在估计出良好绝对深度的情况下略微提高可视化效果。
在训练中作者发现大部分真实的深度图中都含有 missing values,特别是在物体的边缘、窗户以及镜面物体上,因此作者将这些位置的像素点分割出来,并仅在有效点上计算损失。
3.4. 数据增强
作者在实验过程中采用了尺度、旋转、随机裁剪、颜色变换以及翻转等策略来进行数据增强,具体如下。
4. 实验
作者在 NYU Depth 以及 KITTI 数据集上将自己的方法与之前的方法进行了比较,通过实验发现作者提出方法效果是当前最好的。这里要注意的一点是由于作者最终输出的深度图约为原图的 1/4 分辨率大小(长宽均为原图 1/4),因此在计算各项指标前,要先将估计的深度图上采样或是将真实的深度图下采样。下面展示作者的效果图。
通过实验,也确实证明了作者提出的多尺度网络能够提高深度估计的精度,并且细化网络能够有效改善最终深度图细节。
5. 讨论
作者在论文最后谈到了未来可以改进的地方,如利用 3D 几何信息,以及通过更好的局部细化网络将深度图恢复至原始图像的尺度大小。