点云是坐标系中的点数据集。点包含丰富的信息,包括三维坐标(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引擎输出生成边界框。
基本预处理
基本预处理步骤将点云转换为基本特征图。基本特征图包含以下组成部分:
- 基本特征图。
- 柱体坐标:每根柱体的坐标。
- 参数:柱体数量。
预处理
预处理步骤将基本特征图(4个通道)转换为 BEV 特征图(10个通道)。
用于TensorRT的ONNX模型
出于以下原因修改OpenPCDet的原生点柱:
- 小型操作过多,并且内存带宽低。
- NonZero等一些TensorRT不支持的操作。
- ScatterND等一些性能较低的操作。
- 使用“dict”作为输入和输出,因此无法导出ONNX文件。
为了从原生OpenPCDet导出ONNX,我们修改了该模型(图4)。
您可把整个ONNX文件分为以下几个部分:
- 输入:BEV特征图、柱体坐标、参数,均在预处理中生成。
- 输出:类、框、Dir_class,在后处理步骤中解析后生成一个边界框。
- ScatterBEV:将点柱(一维)转换为二维图像,可作为TensorRT的插件。
- 其他:TensorRT支持的其他部分。
后处理
在后处理步骤中解析TensorRT引擎的输出(class、box和dir_class)和输出边界框。图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 |
开始使用 CUDA PointPillars
本文介绍了什么是CUDA-PointPillars以及如何使用它来检测点云中的对象。
由于原生OpenPCDet无法导出ONNX,而且对于TensorRT来说,性能较低的小型操作数量过多,因此我们开发了CUDA-PointPillars。该应用可以将OpenPCDet训练的原生模型导出为特殊的ONNX模型,并通过TensorRT推断ONNX模型。