Abstract

一个实时的几何建图算法, 给大尺度环境搞的.

我们是基于鱼眼相机的.

对于每组同步好的多相机图像, 我们先用plane-sweeping stereo 计算ref帧的深度图.

为了保持精度和效率, 考虑鱼眼图像有更低的angular精度, 我们用multiple image resolutions来恢复深度.

我们用YOLOv3来移除动态物体.

在最后, 我们用TSDF (truncated signed distance function)来获得3D图.

1. Introduction

基于图像的3D稠密建图有两个关键步骤:

  1. 恢复深度用MVS
  2. 用融合算法融合成3D地图

单目的问题是移除动态物体比较难. 双目系统对处理复杂动态环境更好.


我们用了多鱼眼相机模组. 鱼眼相机的问题是中间区域的angular精度更低, 这个会降低车前面远处物体的深度估计. 而在为了实时情况下的降采样则会更严重.

为了维持精度和效率, 我们提出了新的策略, 用不同分辨率. 不同的滤波方法也用来滤出噪声和不可靠的深度估计. 最后融合成3D地图.

我们的系统可以支持40km/h的情况.

很多工作是基于使用pinhole的立体匹配, 假设图像已经rectified了, 只需要在基线上做disparity search.

3. Real-Time Dense Mapping

1593759360585

A. Depth Map Estimation at Multiple Scales

我们用plane-sweeping stereo来做深度估计. plane-sweeping立体匹配是将ref图向一组支持图(给定位姿的)通过sweeping一组3D空间的平面. 每个平面的位置定义了一个homography mapping pixel从ref图到target图.

同时, 每个平面位置对应一个深度假设, 对于每个像素.

对于ref图的一个像素, 深度假设的质量可以用图像块的相似度来衡量.

在[12]中, 图像warping函数可以在GPU上跑, 只是多用了一点计算量.

跟[8, 13]提的一样, 我们在不同的方向sweep平面. 作为标准的,

  • **一组平面是平行与ref相机的图像平面. **
  • 另一组是平行与地平面.

在我们的实验中, 我们用了64个fronto-parallel平面和30个平行与地平面. 一个局部窗口的ZNCC会被用来计算cost.

在full分辨率, 我们用9x9. 在降采样上我们用7x7.

Multi-Scale Strategy

在GPU上深度估计都是耗时的.

  • 现在降采样的鱼眼图进行深度估计
  • 再把深度估计升采样到原分辨率
  • 我们crop中间区域, 计算对应区域的深度图
  • 然后融合2个深度图

我们的策略可以说是融合鱼眼图的低精度深度图和接近pinhole相机的高精度深度图. 原图是1024x544像素, 降采样是512x272, crop的大小是572x322.

Depth map filtering

从plane-sweeping一般都有外点.

  • 如果cost大于\(\alpha\), 就认为是外点.
  • 最优/次优 cost的ratio会用来移除潜在不可靠的深度. 值越大, 就越可靠/独特
  • 最后我们用局部深度连续检查来滤出噪声. 如果中心像素和local window的差异大于阈值\(\gamma\) , 我们认为是一致. 如果local window的一致像素低于\(\delta\), 我们考虑中心像素有不准确的深度. 我们把\(\alpha\) 的上下设置为0.05, 0.3, 把\(\gamma\)\(\delta\) 设置为0.5m和0.3.

1593761054105

B. Dynamic Object Detection

YOLOv3[30]把一张图分为\(S \times S\) 个格子. 我们把所有的车辆都作为潜在的移动对象, 我们标注了2609个鱼眼图和大约11200个不同的车辆. 网络在TensorFlow里用, 在Adam优化器里优化.

C. TSDF-based Depth Map Fusion

相机位姿可以用VIO或者GNSS/INS系统获得. 场景被用voxel表示, 每个voxel保存一个TSDF值. 所以, 每个voxel保存有向(signed)距离---跟最近的物体平面, truncated to a certain max / min 距离.

我们用InfiniTAM库的地图融合流程.

  • 新的voxel被分配, 基于现在的深度图
  • 当前可见的voxel会被更新
  • 新的3D信息会融合到每个可见的voxel
  • voxel可以被swapped到GPU外面来保存memory

当一个新的深度图来了之后, 我们用一个深度值\(d\)来迭代每个像素\(p\)在鱼眼图上, 计算它的back-projected ray direction:

\[r(\mathbf{p})=\left[\begin{array}{c} \frac{\xi+\sqrt{1+\left(1-\xi^{2}\right)\left(x^{2}+y^{2}\right)}}{x^{2}+y^{2}+1} x \\ \frac{\xi+\sqrt{1+\left(1-\xi^{2}\right)\left(x^{2}+y^{2}\right)}}{x^{2}+y^{2}+1} y \\ \frac{\xi+\sqrt{1+\left(1-\xi^{2}\right)\left(x^{2}+y^{2}\right)}}{x^{2}+y^{2}+1}-\xi \end{array}\right] \]

\((x, y)\)\(p\)的归一化坐标, \(\xi\) 是鱼眼相机的mirror参数. 我们考虑\(d-\mu\)\(d+\mu\) 来做TSDF融合.

在更新一系列当前可见的体素之后, 我们做深度integration. 每个体素\(X\)维护一个平均的TSDF值\(D(X)\). 给定当前的相机pose \((R_d, t_d)\), 我们得到相机坐标系的体素位置 \(X_d = R_d X + t_d\). 我们把\(X_d\) 投影到鱼眼深度图, 得到对应的深度信息. 挂链的深度值不小于\(-\mu\), 那么SDF值会更新为:

\[D(\mathbf{X}) \leftarrow\left(w(\mathbf{X}) D(\mathbf{X})+\min \left(1, \frac{\eta}{\mu}\right)\right) /(w(\mathbf{X})+1) \]

这里\(w(X)\) 是之前观测数量.


我们的系统维护了一个\(60m \times 60m \times 3m\)的局部地图, 中心是当前车辆位置.

4. Experimental Evaluation

我们用5个near-infrared相机, 在车顶, 向前.

这些相机输出\(1024\times 544\) 的图, 25fps.

深度图估计 / 动态物体检测 / TSDF-based深度融合 耗时分别是 60ms / 40ms / 20ms

B. Evaluation of Depth Estimation Stage

1593762479219

1593762665851


关于滤波

1593762785149

5. Conclusions

没啥

posted on 2020-07-03 15:54  四积阴功五读书  阅读(293)  评论(0编辑  收藏  举报