《MonoIndoor:Towards Good Practice of Self-Supervised Monocular Depth Estimation...》论文笔记
参考代码:None
1. 概述
介绍:经典的自监督深度估计方法已经在KITTI数据集上取得了较为不错的效果,但是在一些室内或是相机能够自由移动(KITTI场景下相机固定在车上)的场景下,现有的经典自监督深度估计算法就出现了问题。这篇文章研究的便是这些场景下的自监督深度估计,在该文章中指出自监督深度估计在这些场景下性能出现较大幅度下降是因为如下两点原因:
- 在这些场景下深度的范围是变化比较大的,特别是在一些室内场景下,随着视角的变化图像中深度的范围会存在较大范围变化。而在KITTI的场景下最远处是天空其深度的变化范围相对来讲比较小;
- 在KITTI数据场景下摄像头是被固定在车辆上的,犹豫是刚性连接其运动主要体现在摄像头的径向平移运动上,其在旋转分量上的变化相对较小。而上述提到的室内或是相机自由运动的场景,其同时在平移和旋转上存在变化量,这就是得对应Pose估计网络部分难以胜任对应任务,从而导致深度估计性能的下降;
对于上面两点文章专门提出了对应的解决方案,其具体为:
- 1)对于深度范围变化:这里使用一种带attention的网络模块区域预测对应深度范围(scale)的概率分布,对于具体范围的值是通过积分的形式计算得到,文章对此的解释是使得训练更加鲁棒;
- 2)对于Pose网络估计不准确:由于KITTI主要的pose变化量在平移分量上,同时预测旋转和平移会对网络带来较大困难,对此文章引入一种迭代残差优化的形式进行解决,从而估计出较为准确的pose变化量;
这篇文章对于pose估计问题是通过残差级联优化的形式进行解决,在之前的一篇文章:
Unsupervised Depth Learning in Challenging Indoor Video: Weak Rectification to Rescue
在这篇文章中也明确指出影响自监督深度估计网络性能的点在输入数据平移和旋转属性上,其在不同数据集下的对比差异见下图:

因而在这篇文章中提出了一种数据预处理的方案,也就是通过如下几步实现训练数据筛选:
- 1)Step1:在输入的视频序列中按照一种设定好的采样策略对视频序列进行采样,之后通过SIFT算子提取特征点,并计算特征点之间的匹配关系;
- 2)Step2:根据匹配关系通过随机采样一致性方法(RANSAC)X_1=HX_2计算本质矩阵H,并通过矩阵分解得到对应的旋转分量;
- 3)Step3:通过对应旋转分量将pair图像对通过正转和反转操作变换到共有平面上去,实现旋转分量消除或是减少;
2. 方法设计
2.1 整体pipeline
文章的整体方法是参考自MonoDepth2的,其结构见下图所示:

相比MonoDepth2方法文章主要是提出了两个子模块:
- 1)Depth Factorization Module:为变化的输入场景设置一个适配的深度变化scale,从而使得网络不会因为深度范围存在较大变化而导致性能下降;
- 2)Residual Pose Estimation Module:通过级联优化的形式优化pose,减少手持等情况引入的旋转运动分量,提升整体pose估计的质量;
2.2 自监督约束
这里设target图像为I_t,source图像为I_{t^{'}},这里是需要估计出target图像对应的深度结果D_t,估计出来的pose变量为T_{t\rightarrow t^{'}}。在已知相机内参数K的情况下source到target的映射描述为:
I_{t^{'}\rightarrow t}=I_{t^{'}}\langle proj(D_t,T_{t\rightarrow t^{'}},K)\rangle
映射之后的图像会与真正的target图像做光度重构误差度量:
\rho(I_t,I_{t^{'}\rightarrow t})=\frac{\alpha}{2}(1-SSIM(I_t,I_{t^{'}\rightarrow t}))+(1-\alpha)||I_t,I_{t^{'}\rightarrow t}||_1
对于有多个source图像的情况其光度重构误差描述为:
L_A=\sum_{t^{'}}\rho(I_t,I_{t^{'}\rightarrow t})
在target图像的引导下会对深度的结果进行平滑约束:
L_s=|\partial_xd_t^*|e^{-\partial_xI_t}+|\partial_yd_t^*|e^{-\partial_yI_t}
其中 ,d^{*}={d}/{\bar{d}}代表的是经过均值归一化之后的深度图。这里也同样采用了MonoDepth2中的auto-mask的机制去排除那些存在运动非静止的目标。对于帧间还做了帧间深度连续约束:
L_c=\frac{|D_t-\bar{D}_{t^{'}\rightarrow t}|}{D_t+\bar{D}_{t^{'}\rightarrow t}}
其中,\bar{D}_{t^{'}\rightarrow t}代表的是深度按照之前图像映射的流程映射的结果。则整体的损失函数被描述为:
L=L_A+\tau L_s+\gamma L_c
其中,\tau=0.001,\gamma=0.05。
2.3 深度scale自适应估计
由于输入视频序列中深度范围变化比较大,这篇文章中通过attention机制构建scale network的形式(其结构见图1左边)对输入的图像生成对应的scale参数。这里scale参数并不是直接预测的形式得到,而是通过在预先设定范围内 估计概率分布并通过积分的形式得到:
S=\sum_{s=0}^{D_{max}}s\times softmax(\bar{S})
在下表中展示了是否使用attention和概率分布回归对性能的影响:

2.4 pose残差估计
只使用一阶pose估计不能很好估计平移与旋转分量,则文章通过下图所示的残差级联优化的形式得到最后的pose估计结果,其对应的网络结构由两部分组成:PoseNet和Residual PoseNet,分别完成初始pose估计和级联pose估计。则其流程图见下图所示:

使用t_i^{'}代表迭代为i时(i=0时为原本source图像)时的图像,按照计算得到的pose其在本次迭代时输入warp之后的source图像为:
I_{(t_i^{'}\rightarrow t)\rightarrow t}=I_{t_i^{'}\rightarrow t}\langle proj(D_t,T_{(t_i^{'}\rightarrow t)\rightarrow t}^{res-1},K)\rangle
而整体的pose其实就是迭代累积的形式:
T_{t^{'}\rightarrow t}=\prod_iT_{t^{'}\rightarrow t},i=\dots,k,\dots,1,0
迭代估计次数对性能的影响:

综上,上述两个模块对于整体性能的影响:

3. 实验结果
NYUv2数据集上的性能比较:

