Learning the Depths of Moving People by Watching Frozen
基于双目的传统算法
- 对静止的物体, 在不同的 viewpoints 同一时刻进行拍摄, 根据拍摄到的结果, 使用三角测量算法计算出平面 2D 图像在 3D 图像中的坐标
单目
- Ground Truth
- 使用 MVS 得到的深度图
- 使用 MVS 直接得到的深度图有一些也是不符合实验的要求的, 需要对其进行 filtering
- 神经网络的输入
- 待计算深度的 RGB 图像(target image)
- 使用 Mask-RCNN 得到的行人分割图
- 在原始的 video 中得到的 reference image 与 target image 计算出光流图(表示在成像平面上物体的运行), 用于解决在 training 时输入的仅仅是人物禁止但是摄像机在动的图片序列, 而在 testing 的时候输入的人和摄像机都在运动的图片序列, 为了在 training 的时候弥补这种情况, 需要通过光流图计算出初始环境深度图(借助光流图和分割图得到)
- 此外光流图还包含了物体的 montion 和形状的信息
- 此外光流图还包含了物体的 montion 和形状的信息
- 目的
- 得到深度图, where both the camera and people in the scene are naturally moving
- 该算法使用到的其他算法
- MVS: 对运动的物体无效, 运动的物体被视为噪声, 用于估计深度图像, 作为 GT
- Sfm: 对运动的物体无效, 运动的物体被视为噪声, 用于估计相机的位置
算法流程
1. 制作数据集
1.1 估计相机位姿
- 给定一个视频, 使用 ORB-SLAM2 算法计算 frame 之间的 track, 再估计每一个 frame 的相机位姿
- 再使用 visual SfM 优化相机位姿(外参数)和内参数(相机内部, 包括径向畸变系数, 焦距)
- 知道了相机位姿就知道每个 frame 之间的位移关系, 去掉相机位姿不平滑的 frame (拍摄的人不稳定等)
1.2 制作 Ground truth
-
在获取了每个 frame 的相机位姿之后, 使用 COLMAP(一种 MVS 算法) 恢复每个 frame 的深度图
-
因为数据是从网络上获取的, 包含了一些噪声(motion blur, shadows, reflections, MVS 算法本身的要求(不能有动的物体, 背景不能是后期电脑合成的)等), 需要对 COLMAP 算法获取的深度图进行过滤
-
定义 depth value 过滤器1, 不符合的像素对应的 depth = 0
- \(D_{MVS}\) 表示使用 COLMAP 算法得到的深度图
-
\(D_{pp}\) 表示两个 frame 的 motion paralax(该论文首次提出), 通过 FlowNet2.0 计算出整张图的 \(D_{pp}\)
-
使用公式计算每个 frame 的 normalized error \(\Delta{(p)}\) , 其中 \(p\) 为像素
\[
\Delta(p)={{|D_{MVS}(p)-D_{pp}(p)|}\over{D_{MVS}(p)+D_{pp}(p)}}
\]- 如果 \(\Delta(p)>0.2\) 则 \(p\) 对应的 depth = 0, 意味着该 pixcel 距离我们无限远, 不关心该像素的深度
-
一张 MVS 的深度图经过第 3 点的过滤器之后, 如果保留的非 0 的个数占总共的比例小于 20% 则不要这个 frame 和对应的深度图
-
定义过滤器2
- 如果估计出相机内参数的径向畸变系数 \(|k_1|>0.1\) 或者焦距 \(focal\ length \le 0.6\) 或者 \(focal\ length \ge 1.2\) 则去掉该 frame 和对应的深度图
-
保证视频的帧数至少 30, 宽高比为 16:9, 宽至少为 1600px
-
对剩下的 frame 和深度图, 采用人工的方法去掉明显错误的 frame
1.3 总结
- dataset 提供了 RGB, 深度图(GT), 相机的位姿
2. 网络模型
1.1 输入
-
\(I^{r}\) reference image
-
\(M\) 人的分割图
-
\(D_{pp}\) non-human regions 的 depth map which estimated from motion parallax w.r.t another view of the scene
- \(D_{pp}\) 需要通过两个 frame 计算, 一个 \(I^{r}\), 另外一个是 \(I^{r}\) , 当确定了 \(I^{r}\) 之后, 使用 Keyframe selection 计算出 \(I^{r}\) 对应的 \(I^{s}\)
- 使用 FlowNet2.0 网络估计出 \(I^{r}\) 和 \(I^{s}\) 的 optical flow field
- 根据两个相机在两个 view 中的相对坐标以及估计出来的 optical flow field 通过 Plane-Plus-Parallax(P+P) 表示
-
\(C\) confidence map
- 因为数据集中可能有 motion blur, shadows, low lighting and reflections, 为了提高准确度, 将 confidence map 输入
-
optional: human keypoint map \(K\)
1.1.1 详解输入
- 给定 \(I^{r}\) 和 \(I^{s}\) , 使用 FlowNet2.0 估计出光流场
1.2 输出
-
a full depth map for the entire scene
在输入时, \(C\) 和 \(D_{pp}\) 都没有人的区域, 但是因为 GT 有人的深度信息, 为了匹配上 GT 的 depth 的值, 网络学习人的信息, 优化没有人的区域(\(D_{pp}\))
1.3 网络
- 沙漏网络的变体, 将原来的最近邻上采样层替换成了双线性上采样层
1.4 损失
-
公式
\[
L_{si}=L_{MSE}+\alpha_1L_{grad}+\alpha_2L_{sm}
\] -
\(L_{MSE}\)
-
\(L_{grad}\)
-
\(L_{sm}\)
- 当 MVS 无法恢复深度信息时, 通过此 term 进行 smooth interpolation