Skip to main content

TensorRTとDeepStream SDKを使用したYOLOv8のデプロイ

note

この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues

TensorRTとDeepStream SDKを使用してNVIDIA Jetson上でYOLOv8をデプロイする

このガイドでは、トレーニング済みのAIモデルをNVIDIA Jetsonプラットフォームにデプロイし、TensorRTとDeepStream SDKを使用して推論を実行する方法を説明します。ここでは、Jetsonプラットフォーム上で推論性能を最大化するためにTensorRTを使用します。

前提条件

  • UbuntuホストPC(ネイティブまたはVMware Workstation Playerを使用した仮想マシン)
  • reComputer Jetson またはJetPack 4.6以上を実行しているその他のNVIDIA Jetsonデバイス

JetPackバージョンに対応するDeepStreamバージョン

YOLOv8をDeepStreamと連携させるために、このDeepStream-YOLOリポジトリを使用します。このリポジトリはDeepStreamの異なるバージョンをサポートしているため、正しいDeepStreamバージョンに対応するJetPackバージョンを使用してください。

DeepStreamバージョンJetPackバージョン
6.25.1.1
5.1
6.1.15.0.2
6.15.0.1 DP
6.0.14.6.3
4.6.2
4.6.1
6.04.6

このWikiを検証するために、DeepStream SDK 6.2JetPack 5.1.1システムにインストールし、reComputer J4012上で実行しました。

JetsonにJetPackをフラッシュする

JetsonデバイスがCUDA、TensorRT、cuDNNなどのSDKコンポーネントを含むJetPackシステムでフラッシュされていることを確認する必要があります。JetPackをデバイスにフラッシュするには、NVIDIA SDK Managerまたはコマンドラインを使用できます。

Seeed Jetson搭載デバイスのフラッシュガイドについては、以下のリンクを参照してください:

DeepStreamのインストール

JetsonデバイスにDeepStreamをインストールする方法はいくつかあります。このガイドを参照して詳細を確認できます。ただし、インストールの成功と簡便さを保証するために、SDK Managerを使用してDeepStreamをインストールすることをお勧めします。

SDK Managerを使用してDeepStreamをインストールした場合、システム起動後に以下のコマンドを実行して、DeepStreamの追加依存関係をインストールする必要があります。

sudo apt install \
libssl1.1 \
libgstreamer1.0-0 \
gstreamer1.0-tools \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
libgstreamer-plugins-base1.0-dev \
libgstrtspserver-1.0-0 \
libjansson4 \
libyaml-cpp-dev

必要なパッケージのインストール

  • ステップ 1. Jetsonデバイスのターミナルにアクセスし、pipをインストールしてアップグレードします。
sudo apt update
sudo apt install -y python3-pip
pip3 install --upgrade pip
  • ステップ 2. 以下のリポジトリをクローンします。
git clone https://github.com/ultralytics/ultralytics.git
  • ステップ 3. requirements.txtを開きます。
cd ultralytics
vi requirements.txt
  • ステップ 4. 以下の行を編集します。この際、編集モードに入るために最初にiを押してください。編集後、ESCを押して:wqと入力し、保存して終了します。
# torch>=1.7.0
# torchvision>=0.8.1

注意: 現時点ではtorchとtorchvisionは除外されています。これらは後でインストールします。

  • ステップ 5. 必要なパッケージをインストールします。
pip3 install -r requirements.txt

インストーラーがpython-dateutilパッケージの古いバージョンについて警告する場合は、以下のコマンドでアップグレードしてください。

pip3 install python-dateutil --upgrade

PyTorchとTorchvisionのインストール

PyTorchとTorchvisionはpipからインストールすることができません。なぜなら、これらはARM aarch64アーキテクチャに基づくJetsonプラットフォームでは互換性がないためです。そのため、事前にビルドされたPyTorchのpipホイールを手動でインストールし、Torchvisionをソースからコンパイル/インストールする必要があります。

このページを訪問して、すべてのPyTorchとTorchvisionのリンクにアクセスしてください。

以下は、JetPack 5.0以降でサポートされているバージョンの一部です。

PyTorch v1.11.0

JetPack 5.0 (L4T R34.1.0) / JetPack 5.0.1 (L4T R34.1.1) / JetPack 5.0.2 (L4T R35.1.0)でPython 3.8をサポート

ファイル名: torch-1.11.0-cp38-cp38-linux_aarch64.whl
URL: https://nvidia.box.com/shared/static/ssf2v7pf5i245fk4i0q926hy4imzs2ph.whl

PyTorch v1.12.0

JetPack 5.0 (L4T R34.1.0) / JetPack 5.0.1 (L4T R34.1.1) / JetPack 5.0.2 (L4T R35.1.0)でPython 3.8をサポート

ファイル名: torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl
URL: https://developer.download.nvidia.com/compute/redist/jp/v50/pytorch/torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl

  • ステップ 1. 以下の形式で、JetPackバージョンに応じてtorchをインストールします。
wget <URL> -O <file_name>
pip3 install <file_name>

例えば、ここではJP5.0.2を使用しているため、PyTorch v1.12.0を選択します。

sudo apt-get install -y libopenblas-base libopenmpi-dev
wget https://developer.download.nvidia.com/compute/redist/jp/v50/pytorch/torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl -O torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl
pip3 install torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl
  • ステップ 2. インストールしたPyTorchのバージョンに応じてtorchvisionをインストールします。例えば、PyTorch v1.12.0を選択した場合、Torchvision v0.13.0を選択する必要があります。
sudo apt install -y libjpeg-dev zlib1g-dev
git clone --branch v0.13.0 https://github.com/pytorch/vision torchvision
cd torchvision
python3 setup.py install --user

以下は、PyTorchバージョンに応じてインストールする必要があるtorchvisionバージョンのリストです:

  • PyTorch v1.11 - torchvision v0.12.0
  • PyTorch v1.12 - torchvision v0.13.0

より詳細なリストについては、こちらのリンクを確認してください。

YOLOv8 用 DeepStream 設定

  • ステップ 1. 以下のリポジトリをクローンします
cd ~
git clone https://github.com/marcoslucianops/DeepStream-Yolo
  • ステップ 2. リポジトリを以下のコミットにチェックアウトします
cd DeepStream-Yolo
git checkout 68f762d5bdeae7ac3458529bfe6fed72714336ca
  • ステップ 3. DeepStream-Yolo/utils 内の gen_wts_yoloV8.pyultralytics ディレクトリにコピーします
cp utils/gen_wts_yoloV8.py ~/ultralytics
  • ステップ 4. ultralytics リポジトリ内で、YOLOv8 リリース から pt ファイルをダウンロードします(例:YOLOv8s)
wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s.pt

注意: カスタムモデルを使用することも可能ですが、エンジンを正しく生成するために cfg および weights/wts ファイル名に YOLO モデル参照 (yolov8_) を含めることが重要です。

  • ステップ 5. cfg、wts、labels.txt(利用可能な場合)ファイルを生成します(例:YOLOv8s)
python3 gen_wts_yoloV8.py -w yolov8s.pt

注意: 推論サイズを変更する場合(デフォルト: 640)

-s SIZE
--size SIZE
-s HEIGHT WIDTH
--size HEIGHT WIDTH

例:1280の場合

-s 1280
または
-s 1280 1280
  • ステップ 6. 生成された cfgwts、および labels.txt(生成された場合)ファイルを DeepStream-Yolo フォルダにコピーします
cp yolov8s.cfg ~/DeepStream-Yolo
cp yolov8s.wts ~/DeepStream-Yolo
cp labels.txt ~/DeepStream-Yolo
  • ステップ 7. DeepStream-Yolo フォルダを開き、ライブラリをコンパイルします
cd ~/DeepStream-Yolo
CUDA_VER=11.4 make -C nvdsinfer_custom_impl_Yolo # DeepStream 6.2/ 6.1.1 / 6.1 用
CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo # DeepStream 6.0.1 / 6.0 用
  • ステップ 8. モデルに応じて config_infer_primary_yoloV8.txt ファイルを編集します(例:80クラスの YOLOv8s)
[property]
...
custom-network-config=yolov8s.cfg
model-file=yolov8s.wts
...
num-detected-classes=80
...
  • ステップ 9. deepstream_app_config.txt ファイルを編集します
...
[primary-gie]
...
config-file=config_infer_primary_yoloV8.txt
  • ステップ 10. deepstream_app_config.txt ファイル内のビデオソースを変更します。以下のようにデフォルトのビデオファイルがロードされます
...
[source0]
...
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4

推論の実行

deepstream-app -c deepstream_app_config.txt

上記の結果は、Jetson AGX Orin 32GB H01 キットで FP32 と YOLOv8s 640x640 を使用して実行されています。FPS は約 60 ですが、これは実際の FPS ではありません。deepstream_app_config.txt ファイル内の [sink0] セクションで type=2 を設定すると、FPS はモニターのリフレッシュレート(今回使用したモニターは 60Hz)に制限されます。ただし、この値を type=1 に変更すると、最大 FPS を取得できますが、ライブ検出出力は表示されません。

同じビデオソースと上記と同じモデルを使用し、[sink0] 内の type=1 に変更した後、以下の結果が得られます。

ご覧の通り、約 139 FPS を取得でき、これが実際の FPS 値に相当します。

INT8 キャリブレーション

推論に INT8 精度を使用したい場合は、以下の手順に従ってください。

  • ステップ 1. OpenCV をインストールします
sudo apt-get install libopencv-dev
  • ステップ 2. OpenCV サポートを有効にして nvdsinfer_custom_impl_Yolo ライブラリをコンパイル/再コンパイルします
cd ~/DeepStream-Yolo
CUDA_VER=11.4 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo # DeepStream 6.2/ 6.1.1 / 6.1 用
CUDA_VER=10.2 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo # DeepStream 6.0.1 / 6.0 用
  • ステップ 3. COCO データセットの場合、val2017 をダウンロードして解凍し、DeepStream-Yolo フォルダに移動します

  • ステップ 4. キャリブレーション画像用の新しいディレクトリを作成します

mkdir calibration
  • ステップ 5. 以下を実行して、COCO データセットからランダムに 1000 枚の画像を選択し、キャリブレーションを実行します
for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
cp ${jpg} calibration/; \
done

注意: NVIDIA は、良好な精度を得るために少なくとも 500 枚の画像を推奨しています。この例では、より高い精度を得るために 1000 枚の画像を選択しています(画像が多いほど精度が向上します)。INT8_CALIB_BATCH_SIZE の値を大きくすると、精度が向上し、キャリブレーション速度が速くなります。GPU メモリに応じて設定してください。たとえば、2000 枚の画像の場合は head -2000 を使用します。このプロセスには時間がかかる場合があります。

  • ステップ 6. 選択したすべての画像を含む calibration.txt ファイルを作成します
realpath calibration/*jpg > calibration.txt
  • ステップ 7. 環境変数を設定します
export INT8_CALIB_IMG_PATH=calibration.txt
export INT8_CALIB_BATCH_SIZE=1
  • ステップ 8. config_infer_primary_yoloV8.txt ファイルを更新します

以下を

...
model-engine-file=model_b1_gpu0_fp32.engine
#int8-calib-file=calib.table
...
network-mode=0
...

次のように変更します

...
model-engine-file=model_b1_gpu0_int8.engine
int8-calib-file=calib.table
...
network-mode=1
...
  • ステップ 9. 推論を実行する前に、deepstream_app_config.txt ファイルの [sink0] セクションで type=2 を設定して、最大 FPS パフォーマンスを得るようにします。

  • ステップ 10. 推論を実行します

deepstream-app -c deepstream_app_config.txt

ここでは、約 350 FPS の値を得ることができます!

マルチストリーム設定

NVIDIA DeepStream を使用すると、単一の設定ファイルで簡単に複数のストリームを設定し、マルチストリームのビデオ分析アプリケーションを構築できます。この wiki の後半では、高 FPS パフォーマンスを持つモデルがマルチストリームアプリケーションでどのように役立つか、いくつかのベンチマークとともに説明します。

ここでは、9 ストリームを例として取り上げます。deepstream_app_config.txt ファイルを変更します。

  • ステップ 1. [tiled-display] セクション内で、行と列を 3 と 3 に変更し、3x3 グリッドで 9 ストリームを表示できるようにします
[tiled-display]
rows=3
columns=3
  • ステップ 2. [source0] セクション内で num-sources=9 を設定し、さらに uri を追加します。ここでは、現在のサンプルビデオファイルを 8 回複製して合計 9 ストリームを作成します。ただし、アプリケーションに応じて異なるビデオストリームに変更することもできます
[source0]
enable=1
type=3
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
num-sources=9

次に、deepstream-app -c deepstream_app_config.txt コマンドでアプリケーションを再実行すると、以下の出力が表示されます

trtexec ツール

サンプルディレクトリには、trtexec というコマンドラインラッパーツールが含まれています。trtexec は、独自のアプリケーションを開発することなく TensorRT を使用するためのツールです。trtexec ツールには以下の3つの主な目的があります:

  • ランダムまたはユーザー提供の入力データを使用してネットワークをベンチマークする。
  • モデルからシリアライズされたエンジンを生成する。
  • ビルダーからシリアライズされたタイミングキャッシュを生成する。

ここでは、trtexec ツールを使用して、異なるパラメータでモデルを迅速にベンチマークすることができます。しかし、まず最初に ONNX モデルが必要です。この ONNX モデルは ultralytics yolov8 を使用して生成できます。

  • ステップ 1. 次のコマンドで ONNX を構築します:
yolo mode=export model=yolov8s.pt format=onnx
  • ステップ 2. 次のように trtexec を使用してエンジンファイルを構築します:
cd /usr/src/tensorrt/bin
./trtexec --onnx=<path_to_onnx_file> --saveEngine=<path_to_save_engine_file>

例えば:

./trtexec --onnx=/home/nvidia/yolov8s.onnx --saveEngine=/home/nvidia/yolov8s.engine

これにより、以下のようなパフォーマンス結果が出力され、.engine ファイルが生成されます。デフォルトでは、ONNX を FP32 精度の TensorRT 最適化ファイルに変換し、以下のような出力が得られます。

ここでは、平均レイテンシを 7.2ms として計算し、これは 139FPS に相当します。これは、以前の DeepStream デモで得られたパフォーマンスと同じです。

しかし、より高いパフォーマンスを提供する INT8 精度が必要な場合は、以下のように上記のコマンドを実行できます:

./trtexec --onnx=/home/nvidia/yolov8s.onnx --int8 --saveEngine=/home/nvidia/yolov8s.engine 

ここでは、平均レイテンシを 3.2ms として計算し、これは 313FPS に相当します。

YOLOv8 ベンチマーク結果

reComputer J4012AGX Orin 32GB H01 Kit、および reComputer J2021 上で動作する異なる YOLOv8 モデルのパフォーマンスベンチマークを実施しました。

YOLOv8 モデルを使用したパフォーマンスベンチマークの詳細については、こちらのブログをご覧ください。

マルチストリームモデルベンチマーク

reComputer Jetson Orin シリーズ製品で複数の DeepStream アプリケーションを実行した後、YOLOv8s モデルを使用してベンチマークを行いました。

  • 最初に、単一の AI モデルを使用し、同じ AI モデルで複数のストリームを実行しました。
  • 次に、複数の AI モデルを使用し、複数のストリームを複数の AI モデルで実行しました。

これらのベンチマークは以下の条件下で実施されました:

  • YOLOv8s 640x640 画像入力
  • UI を無効化
  • 最大電力および最大パフォーマンスモードを有効化

これらのベンチマークから、INT8 精度の単一 YOLOv8s モデルを使用した場合、最高性能の Orin NX 16GB デバイスでは約 40 台のカメラを約 5fps で使用できることがわかります。一方、各ストリームに対して複数の YOLOv8s モデルを使用した場合、約 11 台のカメラを約 15fps で使用できます。マルチモデルアプリケーションでは、デバイスの RAM 制限によりカメラの数が減少します。各モデルが大量の RAM を消費するためです。

まとめると、YOLOv8 モデルのみを使用してアプリケーションを実行しない場合、 Jetson Orin Nano 8GB は 4~6 ストリームをサポートでき、Jetson Orin NX 16GB は最大 16~18 ストリームを管理できます。 ただし、実際のアプリケーションでは RAM リソースが使用されるため、これらの数値は減少する可能性があります。そのため、これらの数値をガイドラインとして使用し、特定の条件下で独自のテストを実施することをお勧めします。

リソース

技術サポートと製品ディスカッション

弊社製品をお選びいただきありがとうございます!製品をご利用いただく際に、できる限りスムーズな体験を提供するために、さまざまなサポートをご用意しております。異なる好みやニーズに対応するため、複数のコミュニケーションチャネルを提供しています。

Loading Comments...