参考代码:DenseDepth
论文名称:High Quality Monocular Depth Estimation via Transfer Learning
1. 概述
导读:这篇文章是使用深度监督的方式进行训练的,文章使用在ImageNet上训练过的DenseNet-169作为编码器,之后使用shortcut链接和上采样模块(上采样操作+2个卷积层)作为解码器,从而构建一个U型的网络结构。在此基础上使用输入的深度GT作为回归目标,从而实现网络的训练。
在下图中可以将文章的方法与DRON方法(分段回归)进行比较,文章的方法更加自然和实际。
2. 方法设计
2.1 网络结构
文章的网络结构比较简单,是一个带shortcut链接的U型网络结构:
编码器是DenseNet-169(pretrained on ImageNet),解码器由上采样模块(2x上采样+2个不带BN的卷积)构成,之后在解码器的最后一个上采样模块上预测对应的深度图。
2.2 损失函数
预测得到的深度图表示为
y
^
\hat{y}
y^,对应的标注GT表示为
y
y
y,那么预测与回归之间的监督关系被描述为:
L
(
y
,
y
^
)
=
λ
L
d
e
p
t
h
(
y
,
y
^
)
+
L
g
r
a
d
(
y
,
y
^
)
+
L
S
S
I
M
(
(
y
,
y
^
)
)
L(y,\hat{y})=\lambda L_{depth}(y,\hat{y})+L_{grad}(y,\hat{y})+L_{SSIM}((y,\hat{y}))
L(y,y^)=λLdepth(y,y^)+Lgrad(y,y^)+LSSIM((y,y^))
其中,
λ
=
0.1
\lambda=0.1
λ=0.1。对于深度本身的监督使用L1损失:
L
d
e
p
t
h
(
y
,
y
^
)
=
1
n
∑
p
n
∣
y
p
−
y
^
p
∣
L_{depth}(y,\hat{y})=\frac{1}{n}\sum_{p}^n|y_p-\hat{y}_p|
Ldepth(y,y^)=n1p∑n∣yp−y^p∣
在此基础上引入梯度损失:
L
g
r
a
d
(
y
,
y
^
)
=
1
n
∑
p
n
∣
g
x
(
y
p
,
y
^
p
)
∣
+
∣
g
y
(
y
p
,
y
^
p
)
∣
L_{grad}(y,\hat{y})=\frac{1}{n}\sum_p^n|g_x(y_p,\hat{y}_p)|+|g_y(y_p,\hat{y}_p)|
Lgrad(y,y^)=n1p∑n∣gx(yp,y^p)∣+∣gy(yp,y^p)∣
边界平滑损失:
L
S
S
I
M
(
y
,
y
^
)
=
1
−
S
S
I
M
(
y
,
y
^
)
2
L_{SSIM}(y,\hat{y})=\frac{1-SSIM(y,\hat{y})}{2}
LSSIM(y,y^)=21−SSIM(y,y^)
使用上面的损失函数在深度很大的时候会带来整体损失函数增大很多,因此文章使用场景的最大深度
m
m
m对需要回归的深度信息进行归一化操作,从而训练的GT被描述为:
y
=
m
y
y=\frac{m}{y}
y=ym
对应部分的损失实现为:
# https://github.com/ialhashim/DenseDepth/blob/master/loss.py
def depth_loss_function(y_true, y_pred, theta=0.1, maxDepthVal=1000.0/10.0):
# Point-wise depth
l_depth = K.mean(K.abs(y_pred - y_true), axis=-1)
# Edges
dy_true, dx_true = tf.image.image_gradients(y_true)
dy_pred, dx_pred = tf.image.image_gradients(y_pred)
l_edges = K.mean(K.abs(dy_pred - dy_true) + K.abs(dx_pred - dx_true), axis=-1)
# Structural similarity (SSIM) index
l_ssim = K.clip((1 - tf.image.ssim(y_true, y_pred, maxDepthVal)) * 0.5, 0, 1)
# Weights
w1 = 1.0
w2 = 1.0
w3 = theta
return (w1 * l_ssim) + (w2 * K.mean(l_edges)) + (w3 * K.mean(l_depth))
文章方法得到的结果对比: