本文共 2050 字,大约阅读时间需要 6 分钟。
参考代码:
论文名称:High Quality Monocular Depth Estimation via Transfer Learning导读:这篇文章是使用深度监督的方式进行训练的,文章使用在ImageNet上训练过的DenseNet-169作为编码器,之后使用shortcut链接和上采样模块(上采样操作+2个卷积层)作为解码器,从而构建一个U型的网络结构。在此基础上使用输入的深度GT作为回归目标,从而实现网络的训练。
在下图中可以将文章的方法与DRON方法(分段回归)进行比较,文章的方法更加自然和实际。
文章的网络结构比较简单,是一个带shortcut链接的U型网络结构:
预测得到的深度图表示为 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.pydef 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))
文章方法得到的结果对比:
转载地址:http://fkkhj.baihongyu.com/