BEVDepth

面临的问题:

BEVDepth_第1张图片

现有的目标检测器如果得到数据集中的真实深度信息 ,其各项性能都会得到很大提升(如上图所示)所以说深度的获取是基于相机的目标检测不可避免的关键。但是现有的基于相机的目标检测,存在以下问题:

  • 没有明确的深度监督,很难输出准确的深度感知。
  • 深度子网络不能充分利用相机的内外参数,无法有效推断像素深度。
  • 相同的分辨率输入,相同的主干网络,基于深度的目标检测器速度会比较慢。

主要贡献:

  • 提出了一种具有显示深度监控的多视图3D目标检测器,他同时对相机参数和干扰进行编码。
  • 设计了一个高效的视图转换操作---efficient Voxel Pooling,能够处理深度的同时减少时间消耗。

BEVDepth:

overrall architecture

BEVDepth_第2张图片

  •  (N*3*H*W)N张RGB图像送入主干网络进行特征提取,得到特征图(N*Cf*H*W)
  • 相机参数和特征图输入到Depth Net ,在深度的显式监督下进行训练,其输出为N*Cd*H*W,其中Cd代表的是depth bins,和LSS里面的思路差不多,不过LSS里面的深度是估计出来用于后续的任务,而这里是采用了显示的深度监督,相当于一个额外的深度估计网络。
  • backbone输出的特征图和depth net输出的深度分布,可以直接进行点积进行两种特征的融合,得到N*Cf*Cd*H*W,然后通过池化得到BEV视角下的特征图Fbev。
  • 在BEV视角下进行目标检测等任务。

Explicit Depth Supervision

在之前执行的深度估计其损失的计算都是在最终的目标检测损失里面体现的,但是单目深度估计本来就是一个不适定问题,所以仅仅在目标检测损失中体现是完全不够的,因此我们要着重训练一下深度估计网络,利用激光点云数据进行显示监督,这样可学习的数据就更直接也更丰富了。

利用激光点云数据的第一步是将点云数据从世界坐标系转换到像素坐标系,与像素点对映。这里就要用到相机的内外参数了。R和T矩阵是自车坐标系到相机坐标系的转换矩阵,K是相机的内参矩阵。

上面只是映射到了图像平面,并没有映射到准确的像素点,于是进一步转换,得到2.5D的图像坐标系(这里我不是很明白,也不知道是不是这么理解的)。前面相当于把点云数据转换到了像素坐标系,下面就是如何将这一数据和待预测深度的位置相对齐,从而进行显示的深度监督。文中对执行了两种操作,分别是min poolinig和one hot。这两步操作个人感觉应该就类似于bin的分配吧,和LSS差不多。文中把这两步操作用φ表示。公式如下:

 

 Depth Correction

 在深度监督过程中,由于自车的抖动,相机的外参会发生扰动,不能保证激光点云数据和图片像素完美的的对齐。为了解决这一问题,最直观的是如何解决扰动,但是扰动是不可避免且不可估量的,因此原文没有从此下手,而是换了一种思路,来增加Depth Net的感受野,这样即使发生扰动,一些信息也仍能捕捉到(个人理解哈,不知道对不)。原文增加感受野的方法是用了三个级联的残差模块。整体结构如下图:

BEVDepth_第3张图片

 Camera-aware Depth Predition(没看明白)

估计像素深度与相机的内部参数密切相关,因此文章尝试将相机内部特性建模到DepthNet中去。

方法:首先使用MLP将相机内参的维度放大到特征层的维度,然后使用Squeeze-and-Excitation  module对图像特征重新加权。最后我们将相机的内外参数连接起来,帮助DepthNet意识到图像特征其在自车坐标系中的空间位置(属实没看明白),将ψ表示为原始DepthNet,整体相机感知深度预测可写成:

  ξ代表Flatten操作。

Efficient Voxel Pooling(也有点懵逼,留坑)

目的:将多视角的3D特征图全都集成到BEV视角。

方法:和LSS类似,将自车周围空间划分成均匀分布的网格,然后将属于同一网格的特征相加作为该网格的特征。在LSS中,执行此步操作需要用到前缀和排序,需要大量的计算,因为排序的操作使其较为耗时,并行性不好。本文的改进是对每一个视角的截锥体特征分配一个CUDA线程,用于将该特征添加到其对应的BEV网格中。如图:

BEVDepth_第4张图片

改进之后的效果比较:

BEVDepth_第5张图片

实验结果: 

下面是针对三种操作的消融实验结果,可见显式的深度监督对于深度估计是多么重要。

BEVDepth_第6张图片

你可能感兴趣的:(PV2BEV,人工智能)