Fast-BEV的CUDA落地 | 5.9ms即可实现环视BEV 3D检测落地!代码开源

简介: Fast-BEV的CUDA落地 | 5.9ms即可实现环视BEV 3D检测落地!代码开源

精确的3D感知系统对于自动驾驶至关重要。经典方法依赖于激光雷达点云提供的精确3D信息。然而,激光雷达传感器通常花费数千美元,阻碍了其在经济型车辆上的应用。纯基于相机的鸟瞰图(BEV)方法最近因其令人印象深刻的3D感知能力和经济的成本而显示出巨大的潜力。

为了从2D图像特征中进行3D感知,nuScenes上最先进的BEV方法要么使用隐式/显式基于深度的投影,要么使用基于Transformer的投影。然而,它们很难部署在车载芯片上:

  1. 具有深度分布预测的方法通常需要多线程CUDA内核来加速推理,这不方便在资源受限或推理库不支持的芯片上操作。
  2. Transformer内的注意力机制需要专用芯片来支持。此外,它们在推理方面很耗时,这使它们无法进行实际部署。

1、省流阅读

本文主要对性能优秀、部署友好、推理速度高的Fast-BEV感知框架的讲解和TensorRT的落地部署

1、TensorRT落地效果

2、量化前后的精度与速度的对比

3、部署代码列表

4、环境的配置

5、开源地址

TensorRT的代码链接:https://github.com/Mandylove1993/CUDA-FastBEV

2、Fast-BEV的原理要点

1、Fast-BEV的前世

是最早用统一的BEV表示来解决多摄像机多任务感知的作品之一。它也更适用于车载平台,因为它没有昂贵的视图Transformer或深度表示。如图2顶部所示,的输入是多摄像机RGB图像,输出是预测的3D边界框(包括速度)和地图分割结果。

有4个关键模块:

  1. 从多摄像头图像中提取图像特征的2D图像编码器;
  2. 图像到BEV(2D→3D)视图转换模块,其将2D图像特征映射到3D BEV空间中;
  3. 处理3D特征的3D BEV编码器;
  4. 执行感知任务(例如3D检测)的任务专用头。

2、Fast-BEV的今生

尽管可以取得有竞争力的成绩,但我们发现它的性能和效率可以进一步提高。如图2底部所示,我们将三种技术集成到中,从而实现了更强、更快的快速BEV。

  1. Data augmentation:从经验上观察到,在的后期训练时期发生了严重的过度拟合问题。这是因为在原始中没有使用Data augmentation。受最近工作[BevDet,BevDepth]的启发,在图像和BEV空间上添加了强大的3D augmentation,如随机翻转、旋转等。
  2. Temporal fusion:在真实的自动驾驶场景中,输入在时间上是连续的,并且在时间上具有巨大的互补信息。例如,在当前帧中被部分遮挡的一名行人可能在过去的几帧中完全可见。因此,通过引入时间特征融合模块,将从BEV空间扩展到时空空间,类似于[Bevformer,Bevdet4d]。更具体地说,使用当前帧BEV特征和存储的历史帧特征作为输入,并以端到端的方式训练快速BEV。
  3. Optimized view transformation:作者发现从图像空间到体素空间的投影主导了延迟。作者建议从2个角度优化投影:
  • 预先计算固定的投影索引,并将它们存储为静态查找表,这在推理过程中非常有效。
  • 让所有的相机投影到同一个体素,以避免昂贵的体素聚集。不像基于Lift Splat Shoot的改进视图转换方案[ Bevdepth, Bevdet,Bevfusion]那样需要开发繁琐而困难的DSP/GPU并行计算,它足够快,只使用CPU计算,这非常方便部署。更多细节见第3.5节

重中之重——优化 View Transformation

iew transformation是将特征从2D图像空间变换到3D BEV空间的关键组件,这通常需要在整个过程中花费大量时间。Lift Splat Shoot是一种经典的view transformation方法。尽管已经针对高级GPU设备(例如,NVIDIA Tesla A100、V100)提出了一些加速技术,但优化无法轻易转移到边缘芯片等其他设备。

另一类view transformation是,它假设深度分布沿着光线是均匀的。优点是,一旦获得了相机的内参/外参,就可以很容易地知道2D到3D的投影。由于这里没有使用可学习的参数,可以很容易地计算2D特征图和BEV特征图中的点之间的对应矩阵。遵循的投影方法,并从两个角度进一步加速:

  • 预计算投影指数
  • 密集体素特征生成

投影索引是从2D图像空间到3D体素空间的映射索引。因为本文的方法既不依赖于依赖于数据的深度预测,也不依赖于Transformer,所以对于每个输入,投影索引都是相同的。因此,可以预先计算固定的投影索引并将其存储。在推理过程中,可以通过查询查找表来获得投影索引,这在边缘设备上是一种非常便宜的操作。此外,如果从单帧扩展到多帧,也可以很容易地预先计算内参和外参,并将它们预先对准当前帧。

cuda kernel实现如下:

static __global__ void compute_volum_kernel(int num_valid, const half* camera_feature, const float* valid_index, const int64_t* valid_y, const int64_t* valid_x, int num_camera, int feat_height, int feat_width, half* output_feature) {
  int tid = cuda_linear_index;
  if (tid >= num_valid) return;
  for (int icamera = 0; icamera < num_camera; ++icamera) {
    int index = icamera * num_valid + tid;
    if(valid_index[index] == 1.0){
      int64_t x = valid_x[index];
      int64_t y = valid_y[index];
      for(int c=0; c< 64; c++){
        output_feature[c*num_valid+tid] = camera_feature[icamera*64*feat_height*feat_width+c*feat_height*feat_width +feat_width*y+x];
      }
    }
  }
}

将为每个相机视图存储一个体素特征,然后将其聚合以生成最终的体素特征(见图5)。因为每个相机只有有限的视角,所以每个体素特征都非常稀疏,例如,只有大约17%的位置是非零的。作者认为这些体素特征的聚集由于其巨大的尺寸而非常昂贵。建议生成密集的体素特征,以避免昂贵的体素聚集。

具体来说,让来自所有相机视图的图像特征投影到相同的体素特征,从而在末端产生一个密集的体素。

在表1中,分析了4种不同方法的视图转换延迟,发现:

  1. BEVDepth在GPU上实现了最佳延迟,但它需要专用的并行计算支持,因此不适用于CPU。
  2. 与 Baseline相比,所提出的快速BEV在CPU上实现了数量级的加速。

3、参考

[1].Fast-BEV: Towards Real-time On-vehicle Bird’s-Eye View Perception.

[2].https://github.com/Mandylove1993/CUDA-FastBEV.

相关文章
|
传感器 并行计算 算法
多传感器感知原理解读 | BEVFusion解读(一)
多传感器感知原理解读 | BEVFusion解读(一)
1481 0
|
传感器
多传感器感知原理解读 | BEVFusion解读(二)
多传感器感知原理解读 | BEVFusion解读(二)
1170 0
|
机器学习/深度学习 算法 计算机视觉
3D目标检测框架 MMDetection3D环境搭建 docker篇
本文介绍如何搭建3D目标检测框架,使用docker快速搭建MMDetection3D的开发环境,实现视觉3D目标检测、点云3D目标检测、多模态3D目标检测等等。
1933 0
|
机器学习/深度学习 传感器 自动驾驶
从 2D 到 BEV,LSS 技术如何重塑自动驾驶感知?
LSS(Lift-Splat-Shoot)是将多视角图像转换为BEV表示的经典技术,算法虽然老,但应用依然非常广泛
1319 23
从 2D 到 BEV,LSS 技术如何重塑自动驾驶感知?
|
机器学习/深度学习 传感器 编解码
史上最全 | BEV感知算法综述(基于图像/Lidar/多模态数据的3D检测与分割任务)
以视觉为中心的俯视图(BEV)感知最近受到了广泛的关注,因其可以自然地呈现自然场景且对融合更友好。随着深度学习的快速发展,许多新颖的方法尝试解决以视觉为中心的BEV感知,但是目前还缺乏对该领域的综述类文章。本文对以视觉为中心的BEV感知及其扩展的方法进行了全面的综述调研,并提供了深入的分析和结果比较,进一步思考未来可能的研究方向。如下图所示,目前的工作可以根据视角变换分为两大类,即基于几何变换和基于网络变换。前者利用相机的物理原理,以可解释性的方式转换视图。后者则使用神经网络将透视图(PV)投影到BEV上。
史上最全 | BEV感知算法综述(基于图像/Lidar/多模态数据的3D检测与分割任务)
|
存储 传感器 数据可视化
3D目标检测数据集 KITTI(标签格式解析、3D框可视化、点云转图像、BEV鸟瞰图)
本文介绍在3D目标检测中,理解和使用KITTI 数据集,包括KITTI 的基本情况、下载数据集、标签格式解析、3D框可视化、点云转图像、画BEV鸟瞰图等,并配有实现代码。
5284 1
|
机器学习/深度学习 传感器 算法
单目3D目标检测 方法综述——直接回归方法、基于深度信息方法、基于点云信息方法
本文综合整理单目3D目标检测的方法模型,包括:基于几何约束的直接回归方法,基于深度信息的方法,基于点云信息的方法。万字长文,慢慢阅读~ 直接回归方法 涉及到模型包括:MonoCon、MonoDLE、MonoFlex、CUPNet、SMOKE等。 基于深度信息的方法 涉及到模型包括:MF3D、MonoGRNet、D4LCN、MonoPSR等。 基于点云信息的方法 涉及到模型包括:Pseudo lidar、DD3D、CaDDN、LPCG等。
3212 2
|
机器学习/深度学习 传感器 编解码
【多传感器融合】BEVFusion: 激光雷达和摄像头融合框架 NeurIPS 2022
BEVFusion提出一个融合多摄像头和激光雷达数据的框架,可用于3D检测。在自动驾驶领域,通过独立处理并融合摄像头和激光雷达数据,可以显著提升3D对象检测的准确性和稳健性,尤其是在激光雷达可能出现故障的真实场景中。
4902 57
【多传感器融合】BEVFusion: 激光雷达和摄像头融合框架 NeurIPS 2022
|
传感器 机器学习/深度学习 人工智能
超全汇总 | 基于Camera的3D目标检测算法综述!(单目/双目/伪激光雷达)
目前3D目标检测领域方案主要包括基于单目、双目、激光雷达点云、多模态数据融合等方式,本文主要介绍基于单目、双目和伪激光雷达数据的相关算法,下面展开讨论下~
超全汇总 | 基于Camera的3D目标检测算法综述!(单目/双目/伪激光雷达)
|
传感器 机器学习/深度学习 人工智能
史上最全综述 | 3D目标检测算法汇总!(单目/双目/LiDAR/多模态/时序/半弱自监督)(下)
近年来,自动驾驶因其减轻驾驶员负担、提高行车安全的潜力而受到越来越多的关注。在现代自动驾驶系统中,感知系统是不可或缺的组成部分,旨在准确估计周围环境的状态,并为预测和规划提供可靠的观察结果。3D目标检测可以智能地预测自动驾驶车辆附近关键3D目标的位置、大小和类别,是感知系统的重要组成部分。本文回顾了应用于自动驾驶领域的3D目标检测的进展。
史上最全综述 | 3D目标检测算法汇总!(单目/双目/LiDAR/多模态/时序/半弱自监督)(下)