参考代码:depth_from_video_in_the_wild
1. 概述
导读:在这篇文章中提出了一种自监督深度估计算法,总体上看文章的算法是与monodepth2方法存在一定程度关联性,它们都是采用视频帧之间的相关性来建立自监督关系的。文章的方法经过凝练主要的工作主要体现为如下几点:
1)将相机位姿(旋转和平移矩阵)与相机内参(如果想的话可预测畸变参数)均通过网络预测的形式进行表达,增加对输入数据的适应性;
2)采用几何特性(也就是两帧像素计算光度重构损失的时候选择深度最小的为有效像素点)避免遮挡带来的影响;
3)为了应对目标运动带来的影响,文章经过实验表明通过粗糙的bbox-rect的形式也能获得不错的效果,减少了对先验知识为mask的依赖,简化工作;
4)针对归一化操作过程中存在均值方差漂移问题,文章在深度估计网络的编码器中对均值和方差两个变量认为引入噪声;
综上,经过文章在上面4点工作,文章的算法表现出了较为强大的鲁棒性以及较好的深度估计能力,下图是文章方法得到的示例:
2. 方法设计
对于文章算法的输入是如下格式的:
从上图中可以看出其是由3个连续帧拼接起来的,对于每一帧需要标注出其中运动的物体也就是下图:
除此之外,相机的内参为选择输入项,毕竟网络具有相机内参预测功能。
2.1 深度估计与相机参数估计
2.1.1 深度估计网络
文章采用的深度估计网络是典型的U型网络(带shortcut连接),只不过在U型网络的编码器阶段会对归一化之后的结果添加扰动,从而保证网络在train和infer的时候性能不会存在大的偏差,其使用的归一化函数为:
# /model.py#L202
def _normalizer_fn(x, is_train, name='bn'): # 融合了噪声的归一化操作
return randomized_layer_normalization.normalize(
x, is_train=is_train, name=name, stddev=noise_stddev)
对于其中添加噪声的部分可以参考:
# randomized_layer_normalization.py#L32
def normalize(x, is_train, name='bn', stddev=0.5):
...
进而对于整体深度估计网络部分的实现可以参考:
# depth_prediction_net.py#L100
def depth_prediction_resnet18unet(images, is_training, decoder_weight_reg=0.0,
normalizer_fn=None, reflect_padding=True):
...
2.1.2 相机参数估计
这里相机参数的估计包含了相机内参和外参,其中对于相机外参的估计是与monodepth2
中相机参数估计是一致的,可以参考:
# motion_prediction_net.py#L