Depth Map Prediction from a Single Image using a Multi-Scale Deep Network(NIPS2014)论文阅读
这篇文章是使用深度卷及网络进行单目深度估计的第一篇文章,该文章中提到的很多概念,一直被后来的研究者引用,因此拥有很高的阅读价值。这份工作发表在2014年的NIPS会议上。
基本框架
该网络分为两个模块,一个是“粗糙尺度网络”,那么这个网络模块首先对场景的全局深度进行了一个大概的预测,得到了哪里是远,哪里是近的一个预测。另一个是“精细尺度网络”,在场景粗略深度的基础上,该模块对场景内的局部区域进行精细化的深度预测。结构如下:
另外,两个网络模块均输入原RGB图像,而精细网络也会输入粗糙网络的结果。
全局粗糙尺度网络
粗糙尺度网络包含5个特征提取层(卷积和池化),之后用两个全连接层,其输出是原图的 1/4 的分辨率,是一个原图的中心部分裁出。
在粗糙尺度网络中,输入是RGB图像,输出是粗糙的深度图。最后两层是全连接层,用于整合全图视野,前面几层用于将图像中不同区域的信息进行融合。作者是想让该网络对整个场景的深度有一个大体的理解。在这里,该网络会去利用场景内的一些特殊线索,比如“消失点”,“物体的位置”,还有“房间的大致框架”。这些信息都属于全局信息,而不是局部信息,因此处理局部信息的精细尺度网络就无法学习到这些信息。但是这样学习到的信息也存在一个问题,问题就是输出的深度图像只是大概的深度信息,对细小边缘响应不强。我感觉就像是近视的人摘了眼镜看到的场景。
另外,这个网络的全连接层会学习区域的模板。个人觉得,这个模板就是图像中哪些地方是远的,哪些地方是近的的分布信息图。
上图表示粗糙网络中最后一层的权重向量,(a)是KITTI数据集训练的结果,(b)是NYUDepth数据集训练的结果,红色代表远,蓝色代表近,黑色表示0。从权重中可以看到,KITTI数据集中,深度常常在道路两边有变化,NYUDepth数据集中,权重常常显示出墙与道路的区域。
局部精细尺度网络
该网络是整体框架中的第二步,这一部分的任务是对粗糙预测结果进行修改,让其与物体,墙的边缘等局部信息进行对齐。该子网络中,只有卷积层及在第一层提取边缘信息时使用的池化层。
精细化网络中,一个输出像素的感受野是45*45的输入像素,同时输出图像是输入图像的1/4大小。更具体的来说,粗糙网络输出给进来是作为一个外加的低层特征层的。这样设计,粗糙预测是和第一个精细尺度网络有一样的空间形状(在池化之后)。所有的隐藏单元用了Relu,最后一层是线性的,因为它要预测深度。作者先用目标的ground truth训练粗糙网络,然后训练精细化尺度的网络(保持粗糙尺度网络固定)。
尺度不变误差
该文章提出的一个非常重要的点,就是尺度不变误差(Scale-Invariant Error),而我看到的其他学习笔记中,均没有对其进行能够理解的阐述?,所以我在这里详细说一下。
什么是尺度不变。按照我个人理解,在SIFT中,由于特征点是在多尺度空间上采集的,因此两张不同尺度的图像的特征点在进行matching的时候,可以排除尺度的影响,保证不同尺度下的相同特征点依旧可以被匹配上。该性质可以被成为尺度不变性。
而在单目深度估计的问题中,从理论上说单目是无法获得尺度信息的,深度学习可以从大量的数据中学习到场景的尺度信息。但是,如果直接使用RMSE的loss函数来进行网络的训练,没有对图像尺度进行约束,导致估计得到的深度图像可能像素间相对值是准确的,但是整体深度和groundtruth给出的深度存在尺度上的差异。因此作者给RMSE的loss函数添加了一个约束项用以进行全局的尺度约束。
设
y
∗
y^*
y∗和
y
y
y分别是预测得到的深度图和ground truth,他们均拥有
n
n
n个像素,而
y
i
∗
y_i^*
yi∗和
y
i
y_i
yi分别表示预测深度图和ground truth上的第
i
i
i个像素。作者假设了
l
o
g
log
log空间下的平均误差如下:
α
(
y
,
y
∗
)
=
1
n
∑
i
(
l
o
g
(
y
i
∗
)
−
l
o
g
(
y
i
)
)
\alpha(y,y^*) = \frac{1}{n}\sum_i(log(y_i^*)-log(y_i))
α(y,y∗)=n1i∑(log(yi∗)−log(yi))
该误差项可以被作为绝对尺度估计的loss项,因为
e
α
=
∏
i
=
1
n
y
i
∗
y
i
n
e^\alpha = \prod_{i=1}^n\sqrt[n]{\frac{y_i^*}{y_i}}
eα=∏i=1nnyiyi∗表示的是平均尺度因子,同时
e
α
e^\alpha
eα是正相关函数,因此对
e
α
e^\alpha
eα的最小化可以看作为对
α
\alpha
α的最小化。
所以作者将
α
(
y
,
y
∗
)
\alpha(y,y^*)
α(y,y∗)结合到了RMSE中,新的loss函数如下:
D
(
y
,
y
∗
)
=
1
2
n
∑
i
=
1
n
(
l
o
g
(
y
i
)
−
l
o
g
(
y
i
∗
)
+
α
(
y
,
y
∗
)
)
2
D(y,y^*) = \frac{1}{2n}\sum_{i=1}^n(log(y_i)-log(y_i^*)+\alpha(y,y^*))^2
D(y,y∗)=2n1i=1∑n(log(yi)−log(yi∗)+α(y,y∗))2
接下来作者对该公式进行了展开,设
d
i
=
1
n
∑
i
(
l
o
g
(
y
i
∗
)
−
l
o
g
(
y
i
)
)
d_i=\frac{1}{n}\sum_i(log(y_i^*)-log(y_i))
di=n1∑i(log(yi∗)−log(yi)),然后将上一个公式等价为:
D
(
y
,
y
∗
)
=
1
2
n
2
∑
i
,
j
(
l
o
g
(
y
i
)
−
l
o
g
(
y
j
)
−
(
l
o
g
(
y
i
∗
)
−
l
o
g
(
y
j
∗
)
)
)
2
=
1
n
∑
i
d
i
2
−
1
n
2
(
∑
i
d
i
)
2
D(y,y^*) = \frac{1}{2n^2}\sum_{i,j}(log(y_i)-log(y_j)-(log(y_i^*)-log(y_j^*)))^2 \\=\frac{1}{n}\sum_id_i^2-\frac{1}{n^2}(\sum_id_i)^2
D(y,y∗)=2n21i,j∑(log(yi)−log(yj)−(log(yi∗)−log(yj∗)))2=n1i∑di2−n21(i∑di)2
在此,我个人觉得有些问题,因为以下两个公式应该无法等价:
1
2
n
∑
i
=
1
n
(
l
o
g
(
y
i
)
−
l
o
g
(
y
i
∗
)
+
α
(
y
,
y
∗
)
)
2
1
2
n
2
∑
i
,
j
(
l
o
g
(
y
i
)
−
l
o
g
(
y
j
)
−
(
l
o
g
(
y
i
∗
)
−
l
o
g
(
y
j
∗
)
)
)
2
\frac{1}{2n}\sum_{i=1}^n(log(y_i)-log(y_i^*)+\alpha(y,y^*))^2 \\ \frac{1}{2n^2}\sum_{i,j}(log(y_i)-log(y_j)-(log(y_i^*)-log(y_j^*)))^2
2n1i=1∑n(log(yi)−log(yi∗)+α(y,y∗))22n21i,j∑(log(yi)−log(yj)−(log(yi∗)−log(yj∗)))2
因此我计算出来的loss函数是:
1
2
(
1
n
∑
i
d
i
2
−
1
n
2
(
∑
i
d
i
)
2
)
\frac{1}{2}(\frac{1}{n}\sum_id_i^2-\frac{1}{n^2}(\sum_id_i)^2)
21(n1i∑di2−n21(i∑di)2)
这里我就不写详细的推导过程了,详细的过程其他学习笔记中应该都有。虽然不懂为什么作者要这么组织公式,但是还是觉得奇怪吧。因为最终的结果应该没有影响,多了或少了
1
2
\frac{1}{2}
21应该影响的只是学习率而已。
接下来作者还在尺度项上加了一个系数
λ
\lambda
λ,这样一来,公式就变成了:
L
(
y
,
y
∗
)
=
1
n
∑
i
d
i
2
−
λ
n
2
(
∑
i
d
i
)
2
L(y,y^*) = \frac{1}{n}\sum_id_i^2-\frac{\lambda}{n^2}(\sum_id_i)^2
L(y,y∗)=n1i∑di2−n2λ(i∑di)2
当
λ
=
0
\lambda = 0
λ=0,得到的只是逐像素误差。
当
λ
=
1
\lambda = 1
λ=1,得到的是尺度不变误差。
当
λ
=
0.5
\lambda = 0.5
λ=0.5,得到的是较好的绝对尺度估计的结果。
这些应该是作者利用实验得到的结果。
实验暂时先不说了。
参考文献
[1] https://zhuanlan.zhihu.com/p/29312227
[2] https://blog.csdn.net/u014485485/article/details/78681086