zl程序教程

您现在的位置是:首页 >  后端

当前栏目

《PackNet:3D Packing for Self-Supervised Monocular Depth Estimation》论文笔记

3D论文笔记 for self depth Supervised estimation
2023-09-11 14:22:28 时间

参考代码:packnet-sfm

1. 概述

导读:这篇文章提出了一种自监督的深度估计方法,其使用视频序列与运动信息作为输入,用网络去估计深度信息/相机位姿,并用最小重构误差去约束整个训练的过程从而实现自监督。文章的创新点主要体现为:使用3D卷机作为深度编解码网络,在相机位姿的6d信息基础上对平移分量进行约束,提出了一个新的数据集DDAD(Dense Depth for Automated Driving)。

单目情况下的自监督深度估计问题一般是使用几个相邻的视频帧去相互映射,其中完成映射所需要的参数是通过网络估计出来的。在这篇文章之前monodepth是一个较为成功的案例,文章的方法在很多环节的设计上与之类似,整体下来文章的主要工作可以归纳为:

  • 1)提出了一种新的编解码网络去预测深度信息,其中使用3D卷积替换了传统使用的pooling和线性upsample操作,从而使得图片中的目标细节能够更好的保留下来;
  • 2)在monodepth中直接使用pose-net去估计相机的位姿但是这个相机位姿是没有一个准确的scale去约束的,好在可以使用加速度传感器等得到瞬时速度信息,从而可以与估计出来的相机位姿中的平移分量进行约束;
  • 3)文章针对自动驾驶的场景提出了新的DDAD数据集

文章方法的效果见下图例子所示:
在这里插入图片描述
可以看到上图的深度估计结果要比monodepth的结果边缘上更加锐利一些。

2. 方法设计

2.1 文章pipline

文章的整体pipeline结构见下图所示:
在这里插入图片描述
可以看到该pipeline与monodepth的类似,一个深度估计网络用于估计目标图像逐像素点的深度信息,一个姿态估计网络去估计相机旋转和平移的几个分量,之后通过几个关系建立起自监督关系,从而实现训练与收敛。与monodepth不同的一点是其对相机的位姿平移分量进行了约束,从而使得网络有了较为准确的scale信息,从而避免了monodepth中存在的scale不清晰的问题。

2.2 深度自监督部分

深度的自监督与monodepth中使用的方法类似,其损失函数为:
L ( I t , I t ^ ) = L p ( I t , I s ) ⊙ M p ⊙ M t + λ 1 L s ( D t ^ ) L(I_t,\hat{I_t})=L_p(I_t,I_s)\odot M_p\odot M_t+\lambda_1L_s(\hat{D_t}) L(It,It^)=Lp(It,Is)MpMt+λ1Ls(Dt^)
其中, M t M_t Mt代表的是那些未被匹配到的像素掩膜。其中对于重建误差的描述形式为:
L p ( I t , I t ^ ) = α 1 − S S I M ( I t , I t ^ ) 2 + ( 1 − α ) ∣ ∣ I t − I t ^ ∣ ∣ L_p(I_t,\hat{I_t})=\alpha\frac{1-SSIM(I_t,\hat{I_t})}{2}+(1-\alpha)||I_t-\hat{I_t}|| Lp(It,It^)=α21SSIM(It,It^)+(1α)ItIt^
之后,在源图像和目标图像之间通过取最小误差作为后的损失:
L p ( I t , I S ) = min ⁡ I S L p ( I t , I t ^ ) L_p(I_t,I_S)=\min_{I_S}L_p(I_t,\hat{I_t}) Lp(It,IS)=ISminLp(It,It^)
此外为了增加训练的稳定性与对视频中目标移动的适应,增加了一个automask掩膜机制,其取值描述为:
M p = min ⁡ I S L p ( I t , I S ) > min ⁡ I S L p ( I t , I t ^ ) M_p=\min_{I_S}L_p(I_t,I_S)\gt\min_{I_S}L_p(I_t,\hat{I_t}) Mp=ISminLp(It,IS)>ISminLp(It,It^)
上述损失中的最后一项是边界平滑损失,描述为:
L s ( D t ^ ) = ∣ ∂ x D t ^ ∣ e − ∣ ∂ x I t ∣ + ∣ ∂ y D t ^ ∣ e − | ∂ y I t | L_s(\hat{D_t})=|\partial_x\hat{D_t}|e^{-|\partial_xI_t|}+|\partial_y\hat{D_t}|e^{-|\partial_yI_t|} Ls(Dt^)=xDt^exIt+yDt^eyIt

2.3 引入scale属性

在monodepth中(也就是上节内容)是对相机位姿没有一个准确的scale去做约束的,这就导致了最后估计出来的深度并补准确,对此文章使用加速度计对估计出来的相机位姿中的平移分量进行约束,从而使其引入了scale的属性,从而使得估计出来的深度信息更加准确。这里使用到了帧间的时间差 Δ T t → s \Delta T_{t\rightarrow s} ΔTts,加速度计得到的瞬时速度 v v v,网络估计出来的平移参数 t ^ t → s \hat{t}_{t\rightarrow s} t^ts,则文章中将scale属性的损失定义为:
L v ( t ^ t → s , v ) = ∣ ∣ t ^ t → s ∣ ∣ − ∣ ∣ v Δ T t → s ∣ ∣ L_v(\hat{t}_{t\rightarrow s},v)=||\hat{t}_{t\rightarrow s}||-||v\Delta T_{t\rightarrow s}|| Lv(t^ts,v)=t^tsvΔTts
对于这部分的损失其是在平移的维度对归一化之后数据进行约束,可以参考如下代码实现:

# packnet_sfm/losses/velocity_loss.py#L33
pred_trans = [pose.mat[:, :3, -1].norm(dim=-1) for pose in pred_pose]
gt_trans = [pose[:, :3, -1].norm(dim=-1) for pose in gt_pose_context]
# Calculate velocity supervision loss
loss = sum([(pred - gt).abs().mean()
            for pred, gt in zip(pred_trans, gt_trans)]) / len(gt_trans)

因而加上引入scale属性,整个网络的损失函数被描述为:
L s c a l e ( I t , I t ^ , v ) = L ( I t , I t ^ ) + λ 2 L v ( t ^ t → s , v ) L_{scale}(I_t,\hat{I_t},v)=L(I_t,\hat{I_t})+\lambda_2L_v(\hat{t}_{t\rightarrow s},v) Lscale(It,It^,v)=L(It,It^)+λ2Lv(t^ts,v)

2.4 基于3D卷积的编解码网络

上下采样模块:
文章抛弃了使用pool操作和线性upsample操作用作下和上采样,充分使用3D卷积的内在属性,从而有效规避了这些操作,从而使得网络在细节上具有更好的变现能力。其使用3D卷积进行上下采样的基础模块见下图所示:
在这里插入图片描述
对于细节的保留特性:
使用文章方法由于去除掉了pool操作和线性upsample操作从二是的网络在细节的表现能力上更好,使用文章的方法实现自编码器损失为0.0079,而使用pool和线性upsample操作得到的损失为0.063。下图便是两者很直观的视觉比较,可以看到文章3D的方法在细节的保留能力上更佳。
在这里插入图片描述

网络结构:
这里的网络结构详细见下表所示:
在这里插入图片描述
文章编解码网络与ResNet系列网络的性能比较:
在这里插入图片描述
网络的超参数 D D D对于最后性能的影响:
在这里插入图片描述

3. 实验结果

与monodepth的性能比较:

KITTI数据集上的性能比较:
在这里插入图片描述
文章方法与其它一些方法视觉上的直观对比:
在这里插入图片描述