主页:home page
参考代码:depthstillation
1. 概述
导读:在这篇文章中提出了一个生成光流训练数据的策略,用以弥补真实光流训练数据的不足。文章的策略首先使用单目深度估计网络(MiDas或MeGaDepth)生成单张图像的深度估计结果。对于光流估计所需的另外一个视图图像,文章通过采样生成相机内参、平移矩阵、旋转矩阵、相机焦距、双目基线的方式,在给预测深度基础上使用双目视觉映射关系生成另外一个视图的图像,并且可以对应获取该图像对的光流。在生成另外一个视图的图像过程中使用优化策略解决了映射过程中的occlusion和collision问题。此外,还通过实例分割模型引入实例的运动,因而综合多种因素扩充数据场景。进而使用该策略生成的光流训练数据去监督光流网络(RAFT或PWC-Net),并取得了泛化能力很强的光流估计网络。
文章给出的另外一个视图图像的生成pipeline见下图所示:
按照上图中给出的流程可以将光流的生成过程归纳为如下几个步骤:
- 1)对于给定图像 I 0 I_0 I0使用单目深度估计网络估计出深度结果 D 0 D_0 D0,之后根据预测深度在采样出来的相机内参数下转换到相机坐标下,这里观察的视角记为 c 0 c_0 c0;
- 2)通过采样平移旋转变换参数,之后经过warp得到另外一个视角 c 1 c_1 c1下的图像 I 1 I_1 I1。在上述的过程中会对occlusion和collision问题采取不同的策略解决,同时为了增加场景的多样性,使用实例分割模型增加了对图像中物体的运动增广,从而模拟实际场景,极大提升数据多样性;
- 3)通过两个视角 c 0 c_0 c0和 c 1 c_1 c1下像素的相对差异得到两张图对应的光流标注 F 0 → 1 F_{0\rightarrow1} F0→1。
其中单目深度估计网络对性能的影响见下表:
下面展示的是文章的方法从原图输入到最后光流结果和另外一个视角图像的前后对比例子:
2. pipeline构建
2.1 准备工作
给定图像 I 0 I_0 I0,使用单目深度估计网络得到其深度估计结果 D 0 D_0 D0,也就是:
D 0 = Φ ( I 0 ) D_0=\Phi(I_0) D0=Φ(I0)
在上述过程中得到深度估计结果一般会在边界处呈现较为平滑,对此文章中通过双边滤波的形式对其进行保边滤波,值得注意的是文章的滤波算法在其中添加了一些深度不连续的处理逻辑,具体可以参考下面的这个函数:
# bilateral_filter.py#L13
def sparse_bilateral_filtering(
depth,
image,
filter_size,
sigma_r=0.5,
sigma_s=4.0,
depth_threshold=0.04,
HR=False,
mask=None,
gsHR=True,
edge_id=None,
num_iter=None,
num_gs_iter=None,
)
得到深度之后,通过设定或是采样得到相机内参矩阵