1. 论文介绍
本文作者设计了一种通用的多尺度网络,仅需要通过少量的修改就能适用于三个不同的计算机视觉任务:深度估计,表面法向量估计,语义分割。给定输入图片,网络能够直接回归出输出图,如深度图、法向量图、分类图。网络结构在之前工作上加以改进,堆叠了 3 层卷积神经网络,从低分辨率逐渐升到高分辨率,进一步改善了图像细节。测试中,网络的输出是实时的,达到了 30Hz 左右,同时生成的结果在三项任务中都获得了当前最佳性能,证明了网络的多面性。
设计一个通用网络具有很多优点:仅需要少量的修改,就可以在不同任务、应用中切换;简化了多任务系统的实现;在某些任务中网络结构能够共用,如作者本文中对于深度以及表面法向量的估计就共用了网络的后 2 层,提高了网络的效率。
2. 模型结构
网络结构及相关参数如下图所示。
作者本文提出的模型基于之前工作 Depth Map Prediction from a Single Image using a Multi-Scale Deep Network 中提出的全局+局部网络。在此基础上作者做出了三点改进:(1)采用更多的卷积层加深了网络;(2)增加了第三尺度网络,为了获取更高的输出分辨率,最终的输出分辨率为输入图片的一半,相比之前工作中的 1/4 有了提高;(3)第一尺度的输出并未采用直接的预测图,而是选用多通道的特征图(之前工作第一尺度输出的是一个模糊的全局深度图),并将其上采样作为第二尺度的输入。作者这么做的目的是想将前两个尺度的训练结合在一起,从而简化了训练步骤并且也提升了最终的效果。
Scale 1: Full-Image View 第一尺度网络是整个网络最重要的一环,后面实验部分也证明了这点。它预测出的是一个模糊但是反映图像空间变换的全局特征图,因为后接了两个全连接层,因此其感受野是全局的,最终的输出尺度是原始图像的 1/16,但是有 64 个特征通道,之后上采样到 1/4 作为第二尺度网络的输入。
Scale 2: Predictions 第二尺度网络生成中等分辨率的预测图。其输入是由原图经过简单的卷积加池化形成的特征图以及第一尺度网络输出上采样后的特征图连接而成,最终输出的是原始图片 1/4 分辨率大小的预测图(深度图等)。
Scale 3: Higher Resolution 第三尺度网络进一步改善预测结果,使其拥有更高的分辨率,其输入与第二层类似,看图就能理解,最终的输出分辨率为原图的 1/2,且获得了更多的细节信息。
3. 任务
对于深度估计、表面法向量估计以及语义分割,作者使用了不同的损失函数以及相应的训练数据。
3.1. 深度估计
设
D
,
D
∗
D,D^*
D,D∗ 分别为估计出的对数深度图和真实的对数深度图(每个深度值取 log),
d
=
D
−
D
∗
d=D-D^*
d=D−D∗ 为两者差值,定义最终的损失函数为:
L
d
e
p
t
h
(
D
,
D
∗
)
=
1
n
∑
i
d
i
2
−
1
2
n
2
(
∑
i
d
i
)
2
+
1
n
∑
i
[
(
∇
x
d
i
)
2
+
(
∇
y
d
i
)
2
]
\begin{aligned} L_{depth}(D,D^*)= & \frac{1}{n}\sum_id_i^2-\frac{1}{2n^2}\bigg(\sum_id_i\bigg)^2 \\ & +\frac{1}{n}\sum_i[(\nabla_xd_i)^2+(\nabla_yd_i)^2] \end{aligned}
Ldepth(D,D∗)=n1i∑di2−2n21(i∑di)2+n1i∑[(∇xdi)2+(∇ydi)2]
其中所有计算损失的像素点均为有效点(有 ground truth 的像素点), ∇ x d i \nabla_xd_i ∇xdi 和 ∇ y d i \nabla_yd_i ∇ydi 分别是深度差值的水平和垂直梯度。这里定义的损失函数与之前工作中提出的损失函数相似,仅仅是在原来的基础上加入了梯度项 ( ∇ x d i ) 2 + ( ∇ y d i ) 2 (\nabla_xd_i)^2+(\nabla_yd_i)^2 (∇xdi)2+(∇ydi)2,这一项直观的理解就是希望深度差值能够尽量一致(若 d i d_i di 均为 1,则该项为 0),即保证相对误差小。作者论文中也说到这一项使最终预测结果不仅与真实梯度值相近,同时也有相似的局部结构。
3.2. 表面法向量
表面法向量是三维的,因此最终的输出通道要从一个通道改成三个,最终输出的法向量在计算损失函数之前要先归一化,定义损失函数如下。
L
n
o
r
m
a
l
s
(
N
,
N
∗
)
=
−
1
n
∑
i
N
i
⋅
N
i
∗
=
−
1
n
N
⋅
N
∗
L_{normals}(N,N^*)=-\frac{1}{n}\sum_iN_i\cdot N_i^*=-\frac{1}{n}N\cdot N^*
Lnormals(N,N∗)=−n1i∑Ni⋅Ni∗=−n1N⋅N∗
其中 N , N ∗ N,N^* N,N∗ 是经过归一化后的估计表面法向量图和真实表面法向量图,同样这里只针对有效点计算损失。只看损失函数,其目的是希望估计的法向量和真实的法向量点乘结果大,那么两者角度就小,相似性就高。对于真实的表面法向量,作者用 Silberman 的方法,从实际深度值得到真实的表面法向量。
3.3. 语义分割
语义分割中每个像素点对应一个类别,因此网络的输出通道数与类别数一致,损失函数使用交叉熵损失,如下所示。
L
s
e
m
a
n
t
i
c
(
C
,
C
∗
)
=
−
1
n
∑
i
C
i
∗
log
(
C
i
)
L_{semantic}(C,C^*)=-\frac{1}{n}\sum_iC^*_i\text{log}(C_i)
Lsemantic(C,C∗)=−n1i∑Ci∗log(Ci)
其中 C i = e z i / ∑ c e z i , c C_i=e^{z_i}/\sum_ce^{z_{i,c}} Ci=ezi/∑cezi,c 是像素点 i i i 的类别预测结果。在进行语义分割时,作者将真实的深度图及表面法向量图一起作为网络的输入。具体来讲,在第一尺度网络仅使用 RGB 图作为输入,在第二尺度网络在原有网络输入基础上新增深度图以及表面法向量图,但是三者并非直接通道相连作为网络输入,而是分别一个网络进行训练,最后将三个网络的输出通道相连,作为第二尺度网络的输出。这么做是为了保证三者在低层次特征上保持相对独立性。
4. 训练
4.1. 训练步骤
训练模型的过程中,使用随机梯度下降法 SGD,先联合训练第一尺度和第二尺度网络,然后固定这两部分的参数训练第三尺度网络,为了加快训练速度,作者在实际训练第三尺度网络时,将输入的特征图和原图随机裁剪成 74 * 55 大小(NYUDepth数据集上,原始输入的一半),在不太影响结果精度的情况下提高了 3 倍左右的速度。
4.2. 数据增强
作者采用了尺度、旋转、裁剪、颜色、翻转及对比的方式进行数据增强,在对原始 RGB 进行数据增强的同时,对于 ground truth 也要进行相应的操作来匹配输入的 RGB 图。
4.3. 合并深度估计和表面法向量估计
为了减小计算量,作者将深度估计和表面法向量估计这两个任务合并在一起训练,即输入一张 RGB 图能同时得到其深度图和表面法向量图。实际操作中两者共用第一尺度网络,而后面两个网络则完全独立,我认为作者这么做的原因还是考虑到两个任务的关联性并不那么大,因此仅共用底层特征。合并后的网络训练速度是两个完全独立网络训练速度的 1.6 倍左右。
5. 实验
实验部分,作者做的非常详细,除了在三个任务上作者将本文方法与当前做好方法做了性能对比外,作者还做了进一步探究实验,分析网络结构中不同部分的重要性以及对最终结果的影响,有兴趣的话可以看看原文,这里仅展示三个任务中作者最终的效果图。
5.1. 深度估计
5.2. 表面法向量估计
5.3. 语义分割