深度估计 DenseDepth 笔记

Posted m_buddy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度估计 DenseDepth 笔记相关的知识,希望对你有一定的参考价值。

参考代码: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^)=n1pnypy^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^)=n1pngx(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^)=21SSIM(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))

文章方法得到的结果对比:
在这里插入图片描述

以上是关于深度估计 DenseDepth 笔记的主要内容,如果未能解决你的问题,请参考以下文章

《Robust Consistent Video Depth Estimation》论文笔记

《Revisiting Self-Supervised Monocular Depth Estimation》论文笔记

《WSVD:Web Stereo Video Supervision for Depth Prediction from Dynamic Scenes》论文笔记

《MonoIndoor:Towards Good Practice of Self-Supervised Monocular Depth Estimation...》论文笔记

《Learning optical flow from still images》论文笔记

STS:Surround-view Temporal Stereo for Multi-view 3D Detection——论文笔记