Abstract
一个实时的几何建图算法, 给大尺度环境搞的.
我们是基于鱼眼相机的.
对于每组同步好的多相机图像, 我们先用plane-sweeping stereo 计算ref帧的深度图.
为了保持精度和效率, 考虑鱼眼图像有更低的angular精度, 我们用multiple image resolutions来恢复深度.
我们用YOLOv3来移除动态物体.
在最后, 我们用TSDF (truncated signed distance function)来获得3D图.
1. Introduction
基于图像的3D稠密建图有两个关键步骤:
- 恢复深度用MVS
- 用融合算法融合成3D地图
单目的问题是移除动态物体比较难. 双目系统对处理复杂动态环境更好.
我们用了多鱼眼相机模组. 鱼眼相机的问题是中间区域的angular精度更低, 这个会降低车前面远处物体的深度估计. 而在为了实时情况下的降采样则会更严重.
为了维持精度和效率, 我们提出了新的策略, 用不同分辨率. 不同的滤波方法也用来滤出噪声和不可靠的深度估计. 最后融合成3D地图.
我们的系统可以支持40km/h的情况.
2. Related Work
很多工作是基于使用pinhole的立体匹配, 假设图像已经rectified了, 只需要在基线上做disparity search.
3. Real-Time Dense Mapping
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.
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:
\((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值会更新为:
这里\(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
关于滤波
5. Conclusions
没啥