NVIDIA CUDA-PointPillars による点群内の物体検出

栃谷 宗央 (Muneo Tochiya)
NVIDIA Japan
Published in
6 min readFeb 1, 2022

点群とは、ある座標系内の点のデータセットのことで、1 つの点には、3 次元座標 X/Y/Z、色、分類値、強度、時間など、さまざまな情報が含まれます。点群は主に、自律型マシン、認識モジュール、3D モデリングなど、NVIDIA Jetson のさまざまなユース ケースでよく使用される LiDAR から取得されます。

点群の主な用途として、長距離の高精度データセットを利用して、認識、マッピング、位置特定アルゴリズム用の 3 次元物体を検出することが挙げられます。

PointPillars は、点群推論でよく使用されているモデルです。今回の記事では、Jetson 開発者向けの NVIDIA CUDA のアクセラレーションを活用した PointPillars モデルについてご説明します。

CUDA-PointPillars モデルは、こちらからダウンロードできます。

CUDA-PointPillars とは

この記事では、点群内の物体を検出する CUDA-PointPillars をご紹介します。処理の流れは以下のとおりです。

  • 基本の前処理: ピラー (柱) を生成する。
  • 前処理: BEV 特徴マップ (チャネル数 10) を生成する。
  • TensorRT 用 ONNX モデル: TensorRT で実装可能な ONNX モデル。
  • 後処理: TensorRT エンジンの出力を解析してバウンディング ボックスを生成する。
図 1. CUDA-PointPillars のパイプライン

基本の前処理

基本の前処理では、点群を基本特徴マップに変換します。以下のコンポーネントが提供されます。

  • 基本特徴マップ
  • ピラー座標: 各ピラーの座標
  • パラメータ: ピラーの数
図 2. 点群を基本特徴マップに変換

前処理

前処理では、基本特徴マップ (チャネル数 4) を BEV 特徴マップ (チャネル数 10) に変換します。

図 3. 基本特徴マップを BEV 特徴マップに変換

TensorRT 用 ONNX モデル

以下の理由により、OpenPCDet のネイティブ PointPillars を修正しました。

  • メモリ帯域幅が限られているのに、細かい演算が多すぎる。
  • NonZero などの一部の演算は TensorRT でサポートされていない。
  • ScatterND などの一部の演算のパフォーマンスが低い。
  • 入出力に、ONNX ファイルをエクスポートできない “dict” を使用している。

ネイティブの OpenPCDet から ONNX をエクスポートするために、図 4 のようにモデルを修正しました。

図 4. CUDA-PointPillars の ONNX モデルの概要

ONNX ファイルは以下の要素に分割できます。

  • 入力: BEV 特徴マップ、ピラー座標、パラメータ。すべて前処理で生成。
  • 出力: Class、Box、Dir_class。後処理で解析され、バウンディング ボックスを生成。
  • ScatterBEV: PointPillars (1 次元) を 2 次元画像に変換。TensorRT のプラグインとして機能。
  • その他: TensorRT でサポート。[OTHER WHAT?]
図 5. PointPillars データを 2 次元画像にプロットして 2 次元バックボーンに利用

後処理

後処理では、TensorRT エンジンの出力 (class、box、dir_class) を解析し、バウンディング ボックスを出力します。パラメータの例を図 6 に示します。

図 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 ファイルに変換

このプロジェクトでは、OpenPCDet でトレーニングしたネイティブ モデルを CUDA-PointPillars 用の ONNX ファイルに変換する Python スクリプトを提供しています。exporter.py スクリプトは、CUDA-PointPillars の /tool ディレクトリ内にあります。

カレント ディレクトリ内の pointpillar.onnx ファイルを取得するには、以下のコマンドを実行します。

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

パフォーマンス

以下の表に、テスト環境とパフォーマンスを示します。テスト前に、CPU および GPU ブーストを行いました。

表 1. テスト プラットフォームとパフォーマンス

CUDA-PointPillars の利用を開始

今回は、CUDA-PointPillars の概要と、点群内の物体を検出する方法をご説明しました。

ネイティブの OpenPCDet では ONNX をエクスポートできず、細かい演算が多すぎて TensorRT 向けのパフォーマンスが低いことから、CUDA-PointPillars が開発されました。このアプリケーションを使用して、OpenPCDet でトレーニングしたネイティブ モデルから専用の ONNX モデルをエクスポートし、TensorRT で ONNX モデルの推論を行うことができます。

ぜひ CUDA-PointPillars をダウンロードしてご活用ください。

--

--