點雲是坐標系中的點數據集。點包含豐富的信息,包括三維坐標(X、Y、Z)、顏色、分類值、強度值和時間等。點雲主要來自於各種 NVIDIA Jetson 用例中常用的雷射雷達,如自主機器、感知模塊和 3D 建模。
其中一個關鍵應用是利用遠程和高精度的數據集來實現 3D 對象的感知、映射和定位算法。
PointPillars 是最常用於點雲推理的模型之一。本文將探討為 Jetson 開發者提供的 NVIDIA 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 |
版本 |
NVIDIA JetPack 4.5 |
CUDA |
10.2 |
TensorRT |
7.1.3 |
推理時間 |
33 ms |
表1 測試平台和性能
開始使用CUDA-PointPillars
本文介紹了什麼是 CUDA-PointPillars 以及如何使用它來檢測點雲中的對象。
由於原生 OpenPCDet 無法導出 ONNX,而且對於 TensorRT 來說,性能較低的小型操作數量過多,因此我們開發了 CUDA-PointPillars。該應用可以將 OpenPCDet 訓練的原生模型導出為特殊的 ONNX 模型,並通過 TensorRT 推斷 ONNX 模型。
點擊連結:https://github.com/NVIDIA-AI-IOT/CUDA-PointPillars,
立即下載 CUDA-PointPillars。