• LR Real-Time Dense Mapping for Self-Driving Vehicles using Fisheye Cameras


    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 imes 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[egin{array}{c} frac{xi+sqrt{1+left(1-xi^{2} ight)left(x^{2}+y^{2} ight)}}{x^{2}+y^{2}+1} x \ frac{xi+sqrt{1+left(1-xi^{2} ight)left(x^{2}+y^{2} ight)}}{x^{2}+y^{2}+1} y \ frac{xi+sqrt{1+left(1-xi^{2} ight)left(x^{2}+y^{2} ight)}}{x^{2}+y^{2}+1}-xi end{array} ight] ]

    ((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}) leftarrowleft(w(mathbf{X}) D(mathbf{X})+min left(1, frac{eta}{mu} ight) ight) /(w(mathbf{X})+1) ]

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


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

    4. Experimental Evaluation

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

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

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

    B. Evaluation of Depth Estimation Stage

    1593762479219

    1593762665851


    关于滤波

    1593762785149

    5. Conclusions

    没啥

  • 相关阅读:
    POJ1741
    聪聪可可
    [USACO07NOV]Cow Relays
    Android 程序的反破解技术
    在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互
    vmware中的bridge、nat、host-only的区别
    史上最易懂的Android jni开发资料--NDK环境搭建
    使用javah生成.h文件, 出现无法访问android.app,Activity的错误的解决
    Android apk反编译基础(apktoos)图文教程
    Smali文件语法解析
  • 原文地址:https://www.cnblogs.com/tweed/p/13230895.html
Copyright © 2020-2023  润新知