题目:Pseudo-LiDAR from Visual Depth Estimation: Bridging the Gap in 3D Object Detection for Autonomous Driving(自动驾驶)

作者:Yan Wang, Wei-Lun Chao, Divyansh Garg, Bharath Hariharan, Mark Campbell, Kilian Q. Weinberger
论文链接:https://arxiv.org/abs/1812.07179项目链接:https://mileyan.github.io/pseudo_lidar/代码链接:https://github.com/mileyan/pseudo_lidar

 

1)核心观点:基于视觉得深度检测效果不好,很大程度上是因为数据的表达形式,也就是格式选择不对。(这篇的角度很新颖很奇特,因为还是网上没什么参考资料,就又自己强行翻译理解了)

2)使用雷达&相机做3D车辆检测的优缺点与区别:

雷达

  1. 贵;通过64路或者128路旋转激光束提供稀疏的深度数据。
  2. 使用单一传感器存在很大的风险,比如雷达不适用的环境,或者雷达因为其他原因不可用;此外,如果可以多传感器协同工作的话,精度和效率或许可以有更大提升。
  3. 数据用3D点云表示,或者从bird‘s eye view观察(这种方式可以避免在正面图像中远处物体尺寸特别小的问题,因此几乎为线性误差),在这两种情况下,目标的形状和尺寸都不受深度影响。

相机图像:

  1. 便宜,帧率高;
  2. 远处的物体尺寸会变小,更难检测,对深度估计的误差随着深度的增加大致成二次增长。
  3. 基于图像的深度,提供稠密的深度数据,每个像素都有其深度值(通常在基于图像的处理中,会将深度作为RGB之外的一个额外的通道);
  4. 相邻像素在3D空间中可能存在很大的深度差。

基于图像和基于雷达的3D检测,在思路上的主要区别(存在个人理解,存疑):

  1. LiDAR:雷达可以提供确切可知的准确的深度,因此检测的重点往往在于预测标签和画出准确的3D框(也就是类别和方向角的预测);
  2. 图像:基于图像的检测更重要的一个环节是可靠的深度估计(当然类别和角度的估计也很重要)。

3)本文算法:

  思路:

  1. 通过视觉深度估计方法从单目相机或双目相机的图像中估计深度,
  2. 将得到的像素深度反投影为3D点云,得到Pseudo-LiDAR数据,
  3. 最后用基于LiDAR的检测算测做检测。

  流程图:

深度学习 图像增强 ImageDataGenerator 图像深度检测_人工智能

  深度估计:本文算法与深度估计部分无关,这里可用单目深度估计或者双目深度估计,本文采用双目深度。

  双目深度估计输入一对左右图像Il,Ir,输出与任意一图像大小相同的视差图Y(disparity map)。本文假设左图为参考图像,并在Y矩阵中存每个像素相对于右图的水平视差。由下式得到深度图:(其中fU为左图的水平方向的焦距)

深度学习 图像增强 ImageDataGenerator 图像深度检测_3D_02

  这里补充下双目相机的视差估计原理(下图截自SLAM十四讲):

深度学习 图像增强 ImageDataGenerator 图像深度检测_人工智能_03

深度学习 图像增强 ImageDataGenerator 图像深度检测_深度图_04

生成Pseudo-LiDAR数据:

  在左图的相机坐标系中为每个像素(u,v)反投影的到3D坐标(x,y,z):((cU,cV)是像素坐标原点相对与相机中心的位置偏移,fV是垂直焦距)。将所有的像素点都反投影到3D坐标,得到3D点云{(x(n),y(n),z(n))}Nn=1(N为像素数目)。

深度学习 图像增强 ImageDataGenerator 图像深度检测_数据_05

  这里补充一下相机坐标到像素坐标的投影变换:

深度学习 图像增强 ImageDataGenerator 图像深度检测_深度图_06

 

 

LiDAR vs. pseudo-LiDAR:因为后续是要和雷达信号做对比,这里对伪雷达信号做了些额外的处理:

  1. 由于真实雷达信号只存在于一定的高度范围内,这里只保留雷达源(就是KITTI雷达的位置,车顶)上方1m内的雷达信号,去掉的部分通常不存在自动驾驶场景感兴趣的目标(车辆、行人),影响不大;
  2. 雷达信号通常会包含每个测量像素的反射率(给出数值0或者1),但是图像无法的到这个数据,就全部简单粗暴设置为1。
  3. 从图中可以看出,伪雷达数据和真实雷达数据对应比较好(这个地方我不太会看,这个黄色点点怎么就和蓝色点点对准了啊),但是伪雷达数据是稠密的,雷达虽然在一幅图像上可以采集到和图像像素同量级的数据(超过10w点),但由于雷达只有64或者128路激光束,所以雷达数据点是稀疏的。

深度学习 图像增强 ImageDataGenerator 图像深度检测_人工智能_07

3D目标检测:

  有了伪雷达数据就可以用任何一种基于雷达的3D检测算法检测啦。本文采用单目图像+LiDAR的方式,采用两种方式处理pseudo-LiDAR数据,baseline选用了AVOD和frustum PointNet:(这两个baseline我都不了解,文中的简单解释也不太能理解来,这里不多说了吧)

  1. 3D点云:frustum PointNet;
  2. 从Bird's Eye View(BEV)角度去观察pseudo-LiDAR数据:这样从俯视角度,3D信息被转化成为2D图像(保留宽和深,高度存在通道中),AVOD。

数据表示形式至关重要:

  尽管pseudo-LiDAR和深度图中是相同的信息转化而来,但是本文主张pseudo-LiDAR数据更适用于基于卷积神经网络的3D目标检测。

  卷积神经网络的核心模块是2D卷积,卷积神经网络在处理深度图像的时候是进行一系列的2D卷积操作,虽然卷积核的参数是可以学习的,但是核心假设有两个:

  1. 图像的局部邻域是有意义的,网络应该观察局部图片块;
  2. 所有邻域都可以用相同的方式处理。(?这个地方还是不懂是个啥意思)

  这些假设确实需要,但并不完善,现有的2D检测器在遇到这些假设不成立时常常会崩溃。

  1. 第一,2D图片上的局部图片块只有在同属于同一目标的时候,才在物理上具有相关性。如果图片块跨越目标边界,那么深度图上相邻的两像素在3D空间中可能位置相差非常大。
  2. 第二,相同大小的物体处于不同的深度,投影在深度图上时会有不同的尺寸。相同尺寸的图片块可能覆盖的内同相差非常大。

  相反,点云上的3D卷积或者BEV视角上的2D卷积在物理上自然靠近(尽管BEV会将不同高度的像素堆叠到一起,但是这些像素通常你都属于同一物体,不影响)。这样,远处物体和近处物体可以用完全相同的方式处理,这些操作本质上更具有物理意义,自然地可以得到更精确的结果。做了对比实验来验证这点(2D卷积操作有时侯不太靠谱)(图3):左侧是原始深度图和其得到的pseudo-LiDAR数据;右侧深度图是左侧经过一个11 * 11 的卷积层得到的,下面是其得到的pseudo-LiDAR数据。

深度学习 图像增强 ImageDataGenerator 图像深度检测_人工智能_08

4)结果

双目视差估计:使用3种算法PSMNet,DispNet,SPS-stereo

单目深度估计不可靠:文中实验,单目深度估计网络DORN用10倍于双目深度估计(PSMNet)图片数量的数据集进行训练,但是双目得到的效果更好(表1中蓝色数据的对比)。

深度图作为额外的通道不合理:MLF-stereo也是将像素深度反投影为3D点坐标,但是其将每个像素的3D坐标作为前景视角的一个额外的特征图,和原有的RGB 通道concatenate起来作为2D检测的输入,但其效果不好。

视差估计的准确性对目标检测的影响不大:1、视差的精度可能并不反映深度的精度:相同的视差误差可能导致差别巨大的深度误差(取决于像素的真实深度);2、不同的检测算法产生3D点的方式不同:AVOD将空间点分割为体元素,F-PointNet直接产生3D点(易受噪声影响)。

减小深度估计的误差依旧非常重要:随着难度的增加,pseudo-LiDAR的结果会下降。

对自行车和行人的检测效果偏差:IoU阈值为0.5的精确度远小于IoU阈值为0.7的车辆检测(表4)。

深度学习 图像增强 ImageDataGenerator 图像深度检测_人工智能_09

深度学习 图像增强 ImageDataGenerator 图像深度检测_数据_10

深度学习 图像增强 ImageDataGenerator 图像深度检测_数据_11

深度学习 图像增强 ImageDataGenerator 图像深度检测_人工智能_12

5)未来改进方向:端到端训练整个网络;提高输入图像的分辨率;本文算法速度为1fps,可从速度上提高(先在低分辨率上计算深度图,然后合并高分辨率来调整之前的结果);做多传感器融合(LiDAR和pseudo-LiDAR)