高性能计算

使用 NVIDIA CUDA-Pointpillars 检测点云中的对象

点云是坐标系中的点数据集。点包含丰富的信息,包括三维坐标(X、Y、Z)、颜色、分类值、强度值和时间等。点云主要来自于各种NVIDIA Jetson用例中常用的激光雷达,如自主机器、感知模块和3D建模。

其中一个关键应用是利用远程和高精度的数据集来实现3D对象的感知、映射和定位算法。

PointPillars是最常用于点云推理的模型之一。本文将探讨为Jetson开发者提供的NVIDIA CUDA加速PointPillars模型。马上下载CUDA-PointPillars模型

什么是CUDA-Pointpillars

本文所介绍的CUDA-Pointpillars可以检测点云中的对象。其流程如下:

  • 基本预处理:生成柱体。
  • 预处理:生成BEV特征图(10个通道)。
  • 用于TensorRT的ONNX模型:通过TensorRT实现的ONNX模式。
  • 后处理:通过解析TensorRT引擎输出生成边界框。
Image shows the pipeline of CUDA-Pointpillars, which has four parts and uses a point cloud as input and output-bounding box.Image shows the pipeline of CUDA-Pointpillars, which has four parts and uses a point cloud as input and output-bounding box.
图 1 。 CUDA 点柱管道。

基本预处理

基本预处理步骤将点云转换为基本特征图。基本特征图包含以下组成部分:

  • 基本特征图。
  • 柱体坐标:每根柱体的坐标。
  • 参数:柱体数量。
Image shows how to convert points cloud into base feature maps and what is the struct of base feature maps.Image shows how to convert points cloud into base feature maps and what is the struct of base feature maps.
图 2 。将点云转换为基础要素地图

预处理

预处理步骤将基本特征图(4个通道)转换为 BEV 特征图(10个通道)。

Image shows how to convert 4 channels from base feature maps into 0 channels of BEV feature maps.Image shows how to convert 4 channels from base feature maps into 0 channels of BEV feature maps.
图 3 。将基本要素地图转换为 BEV 要素地图

用于TensorRT的ONNX模型

出于以下原因修改OpenPCDet的原生点柱:

  • 小型操作过多,并且内存带宽低。
  • NonZero等一些TensorRT不支持的操作。
  • ScatterND等一些性能较低的操作。
  • 使用“dict”作为输入和输出,因此无法导出ONNX文件。

为了从原生OpenPCDet导出ONNX,我们修改了该模型(图4)。

Image shows an ONNX model in CUDA-Pointpillars, which was exported from OpenPCDet and simplified by onnx-simplifier.Image shows an ONNX model in CUDA-Pointpillars, which was exported from OpenPCDet and simplified by onnx-simplifier.
图 4 。 CUDA Pointpillars 中 ONNX 模型概述。

您可把整个ONNX文件分为以下几个部分:

  • 输入:BEV特征图、柱体坐标、参数,均在预处理中生成。
  • 输出:类、框、Dir_class,在后处理步骤中解析后生成一个边界框。
  • ScatterBEV:将点柱(一维)转换为二维图像,可作为TensorRT的插件。
  • 其他:TensorRT支持的其他部分。
Image shows how to scatter point pillars into 2D image for 2D backbone, which detects objects.Image shows how to scatter point pillars into 2D image for 2D backbone, which detects objects.
图 5 。将点支柱数据散射到二维主干的二维图像中。

后处理

在后处理步骤中解析TensorRT引擎的输出(class、box和dir_class)和输出边界框。图6所示的是示例参数。

Image shows members of a bounding box and their physical significance.Image shows members of a bounding box and their physical significance.
图 6 。边界框的参数。

使用 CUDA PointPillars

若要使用CUDA-PointPillars,需要提供点云的ONNX模式文件和数据缓存:

 std::vector<Bndbox> nms_pred; PointPillar pointpillar(ONNXModel_File, cuda_stream); pointpillar.doinfer(points_data, points_count, nms_pred);

将OpenPCDet训练的原生模型转换为CUDA-Pointpillars的ONNX文件

我们在项目中提供了一个Python脚本,可以将OpenPCDet训练的原生模型转换成CUDA-Pointpillars的ONNX文件。可在CUDA-Pointpillars的/tool 目录下找到exporter.py 脚本。

可在当前目录下运行以下命令获得pointpillar.onnx文件:

$ python exporter.py --ckpt ./*.pth

性能

下表显示了测试环境和性能。在测试之前提升CPU和GPU的性能。

Jetson Xavier NVIDIA AGX 8GB
Release NVIDIA JetPack 4.5
CUDA 10.2
TensorRT 7.1.3
Infer Time 33 ms
 
表 1 。测试平台与性能

开始使用 CUDA PointPillars

本文介绍了什么是CUDA-PointPillars以及如何使用它来检测点云中的对象。

由于原生OpenPCDet无法导出ONNX,而且对于TensorRT来说,性能较低的小型操作数量过多,因此我们开发了CUDA-PointPillars。该应用可以将OpenPCDet训练的原生模型导出为特殊的ONNX模型,并通过TensorRT推断ONNX模型。

立即下载 CUDA-PointPillars。

 

Tags