TensorRTとDeepStream SDKを使用してNVIDIA JetsonでYOLOv8を使用する

本Wikiでは、NVIDIA Jetsonプラットフォームへの学習済みAIモデルの読み込みと、TensorRTとDeepStream SDKを使用した推論の方法を説明します。TensorRTを使用することで、Jetsonプラットフォームでの推論パフォーマンスを最大限に利用できます。



システム要件

  • UbuntuがインストールされたホストPC(Ubuntuネイティブ環境またはVMware Workstation Playerを使用したもの)
  • reComputer Jetson、もしくはJetPack4.6以降が動作するその他のNVIDIA Jetsonデバイス

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

YOLOv8とDeepStreamを組み合わせて使用する際、SeeedではDeepStream-YOLOレポジトリの使用をおすすめします。対応する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ではJetPack 5.1.1をインストールしたreComputer J4012上でDeepStream SDK 6.2を使用して検証を行なっています。



JetsonにJetPackをインストールする

CUDA、TensorRT、cuDNNなどのSDKコンポーネントを含むJetPackシステムがJetsonデバイスに書き込まれていることを確認してください。NVIDIA SDK Managerもしくはコマンドラインで書き込みが行えます。

SeeedのJetsonデバイスへの書き込みについては以下のリンクをご覧ください。

DeepStreamのインストール

JetsonにDeepStreamをインストールする方法は複数あります。詳しくはこちらのガイドを参照してください。成功率が高く簡単なため、Seeedでは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



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

  • Step 1. Jetsonデバイスのターミナルからpipのインストールとアップグレードを行います。
sudo apt update
sudo apt install -y python3-pip
pip3 install --upgrade pip
  • Step 2. 以下のレポジトリをコピーします。
git clone https://github.com/ultralytics/ultralytics.git
  • Step 3. requirements.txtを開きます。
cd ultralytics
vi requirements.txt
  • Step 4. 以下の行の記述を変更します。編集モードに入るには最初にiキーを押します。ESCキーを押した後:wqで保存、終了します。
# torch>=1.7.0
# torchvision>=0.8.1

注 : この段階ではtorchとtorchvisionは含まれていません。後ほどインストールを行います。

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

インストール中にpython-deteutilパッケージのバージョンが古いというエラーが表示される場合は、以下のコードを実行してアップグレードを行なってください。

pip3 install python-dateutil –upgrade



PyTorchとTorchvisionのインストール

PyTorchやTorchvisionはJetsonプラットフォームなどARM aarch64アーキテクチャベースの製品上での動作には対応していないため、pipを使用してのインストールが不可能です。このため、プリビルドのPyTorch pip wheelを手動でインストールし、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) / Python 3.8をインストールしたJetPack 5.0.2 (L4T R35.1.0)

ファイル名 : 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) / Python 3.8をインストールしたJetPack 5.0.2 (L4T R35.1.0)

ファイル名 : 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

  • Step 1. 以下のフォーマットを使用して、お使いのJetPackのバージョンに対応したバージョンのTorchをインストールします。
wget <URL> -O <file_name>
pip3 install <file_name>

例えば、JetPack 5.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
  • Step 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の設定

  • Step 1. 以下のリポジトリをコピーします。
cd ~
git clone https://github.com/marcoslucianops/DeepStream-Yolo
  • Step 2. 以下のコマンドを実行します。
cd DeepStream-Yolo
git checkout 68f762d5bdeae7ac3458529bfe6fed72714336ca
  • Step 3. DeepStream-Yolo_utils内のgen_wts_yoloV8.pyUltralyticsディレクトリ内にコピーします。
cp utils/gen_wts_yoloV8.py ~/ultralytics
  • Step 4. Ultralyticsリポジトリ内にリンク内のpt fileをダウンロードします。
wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s.pt

注 : カスタムモデルも使用できますが、エンジンが正しく生成されるよう、cfgおよびweights/wtsのファイル名にはYOLOモデルのリファレンス(yolo8_)を含めてください。

  • Step 5. cfg、wtsおよび(必要であれば)labels.txtファイルを生成します。以下のコードはYOLOv8用のものです。
python3 gen_wts_yoloV8.py -w yolov8s.pt

注 : 推論のサイズを変更するには以下のコードを使用してください。デフォルトでは640に設定されています。

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

Example for 1280:

-s 1280
or
-s 1280 1280
  • Step 6. 生成されたcfgwtsおよびlabels.txtファイルをDeepStream-Yoloフォルダに移動します。
cp yolov8s.cfg ~/DeepStream-Yolo
cp yolov8s.wts ~/DeepStream-Yolo
cp labels.txt ~/DeepStream-Yolo
  • Step 7. DeepStream-Yoloフォルダを開いてライブラリのコンパイルを実行します。
cd ~/DeepStream-Yolo
CUDA_VER=11.4 make -C nvdsinfer_custom_impl_Yolo  # for DeepStream 6.2/ 6.1.1 / 6.1
CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo  # for DeepStream 6.0.1 / 6.0
  • Step 8. 使用するモデルに合わせてconfig_infer_primary_yoloV8.txtファイルを編集します(以下は例としてYOLOv8sを80 classesで使用する場合のコードです)。
[property]
...
custom-network-config=yolov8s.cfg
model-file=yolov8s.wts
...
num-detected-classes=80
…
  • Step 9. deepstream_app_config.txtファイルを編集します。
...
[primary-gie]
...
config-file=config_infer_primary_yoloV8.txt
  • Step 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

上はFP32及びYOLOv8s 640 x 640の設定でJetson AGX Orin32 GB H01 Kit上で推論を実行した場合の結果です。FPSは60の前後となっており、実際のFPSとは異なっています。これは、deepstream_app_config.txtファイル内の[sink0]type=2に設定されているためで、モニタのFPSによって制限を受けたり、このガイドを執筆するためにSeeedで使用しているモニタが60Hzモニタであるためです。 この値をtype=1に変更することで最大のFPSで実行が可能ですが、リアルタイムな検知結果の出力は不可能な可能性があります。

上で使用したのと同じビデオソースとモデルを使用し、[sink0]type=1に設定した場合の推論結果は以下のようになります。

FPSは139前後と、実際のFPSの値が反映されています。

INT8キャリブレーション

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

  • Step 1. OpenCVをインストールします
sudo apt-get install libopencv-dev
  • Step 2. OpenCV Supportを使用してnvdsinfer_custom_impl_Yoloライブラリをコンパイルします。
cd ~/DeepStream-Yolo
CUDA_VER=11.4 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo  # for DeepStream 6.2/ 6.1.1 / 6.1
CUDA_VER=10.2 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo  # for DeepStream 6.0.1 / 6.0
  • Step 3. COCOデータセット用にval2017をダウンロードして展開します。その後、DeepStream-Yoloフォルダを移動します。

  • Step 4. キャリブレーション画像用のフォルダを新規作成します。

mkdir calibration
  • Step 5. COCOデータセットからキャリブレーション用の画像を無作為に1000枚選択する、以下のコードを実行します。
for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
    cp ${jpg} calibration/; \
done

注 : NVIDIAでは、充分な精度のために、少なくとも500枚の画像を使用してキャリブレーションを行うことを推奨しています。本Wikiでは更に高い精度のため、1000枚の画像を使用しています。より多くの画像を使用することで精度がより高まるためです。INT8_BATCH_SIZEの値が高いほど精度は高くなり、キャリブレーションの速度も速くなります。GPUメモリサイズに適した値を使用してください。head -1000からの値を設定できます。例えば、2000枚の画像を使用する場合にはhead -2000となります。このプロセスには時間がかかることが予想されます。

  • Step 6. 選択されたすべての画像を含むcalibration.txtファイルを作成します。
realpath calibration/*jpg > calibration.txt
  • Step 7. 環境設定を設定します。
export INT8_CALIB_IMG_PATH=calibration.txt
export INT8_CALIB_BATCH_SIZE=1
  • Step 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
…
  • Step 9. FPSの最大値で推論を行うためには、推論を実行する前にdeepstream_app_config.txtファイル内の[sink0]type=2に設定します。

  • Step 10. 推論を実行します。

deepstream-app -c deepstream_app_config.txt

上はFPS 350で推論を行なっている場面です。

マルチストリーム設定

NVIDIA DeepStreamを使用して、ひとつの設定ファイルからマルチストリームのビデオ解析アプリケーションを簡単にセットアップすることができます。FPS性能の高いモデルがマルチストリームアプリケーションに与える良い影響については、ベンチマークと併せて、本Wiki内で解説します。

ここでは例として9ストリームでの設定について解説します。deepstream_app_config.txtファイルを以下に従って変更します。

  • Step 1. [tiled-display]セクション以下の行と列をそれぞれ3に変更します。これにより9ストリーム、3 x 3のグリッドが得られます。
[tiled-display]
rows=3
columns=3
  • Step 2. [source0]セクション以下のnum-sources=9を設定し、uriをさらに追加します。本wikiでは、ひとつのサンプルビデオファイルを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 Tool

サンプルディレクトリ内には、コマンドラインラッピングツール trtexecが含まれています。trtexecを使用すれば、自分でアプリケーションの開発を行うことなくTensorRTと組み合わせて使用することができます。trtexecツールには主に以下の三つの機能があります。

  • ランダムなデータ、もしくはユーザーが用意した入力データのネットワークベンチマーク
  • モデルからシリアル化されたエンジンを生成する
  • ビルダーからシリアル化されたタイミングキャッシュを生成する

本wikiでは、trtexecツールを使用して、異なるパラメータのモデルのベンチマークを行います。これには最初にonnxモデルの用意が必要です。Ultralytics YOLOv8を使用してonnxモデルを生成します。

  • Step 1. 以下のコードを使用してONNXを作成します。
yolo mode=export model=yolov8s.pt format=onnx
  • Step 2. trtexecを使用して、以下のようにエンジンを作成します。
cd /usr/src/tensorrt/bin
./trtexec --onnx=<path_to_onnx_file> --saveEngine=<path_to_save_engine_file>

本wikiのケースでは以下のようになります。

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

生成された.engineファイルと一緒に、以下のようなベンチマーク結果が出力されます。デフォルトではONNXをTensorRTに適した形式に変換したFP32精度のファイルが生成されます。

平均レイテンシは7.2ms(139FPS)で、上のDeepStreamでもで得られたベンチマークと同じ結果になっています。

さらに高いパフォーマンスのINT8精度が必要な場合には、上のコードを以下のように変更してください。

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

これにより平均レイテンシは3.2ms(313FPS)になっています。

YOLOv8のベンチマーク

以下はSeeedが実施したYOLOv8のベンチマーク結果です。複数の異なるYOLOv8モデルをreComputer J4012AGX Orin 32GB H01 KitreComputer J2021で実行しています。

YOLOv8モデルを使用してSeeedが行ったベンチマークについての詳細はSeeedのブログをご覧ください。

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

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

  • まず、単一のAIモデルを使用し、マルチストリームを同一のAIモデル上で実行する
  • 続いて、複数のAIモデルを使用し、マルチストリームを複数のAIモデル上で実行する。

全てのベンチマークは以下の環境で実施されています。

  • YOLOv8s 640x640画像入力
  • UI無効
  • 最大パワー/最大性能モード オン

パラメータごとのベンチマーク結果についてはSeeedのwikiをご覧ください。

これらのベンチマークから、フラッグシップ機であるOrin NX 16GBでひとつのYOLOv8sモデルをINT8で実行した場合、約40台のカメラを5fps前後で使用可能で、複数のYOLOv8モデルの各ストリームをINT8で実行可能であることが分かります。また、約11台のカメラであれば15fps前後で使用可能です。複数のモデルを使用したケースでは、同時に使用できるカメラの台数は少なくなります。これはデバイス上のRAMの制限によるもので、各モデルがRAM上に一定の容量を占めているためです。

資料

テクニカルサポートと製品に関するフォーラム

ご購入いただいた製品をスムーズにお使いいただけるよう、Seeedでは様々なサポートを提供しています。ご希望に合わせてコンタクトの方法をお選びください。

出典 : Seeed Studio資料 Wiki - Deploy YOLOv8 with TensorRT and DeepStream SDK

https://wiki.seeedstudio.com/YOLOv8-TRT-Jetson/

*このガイドはSeeed Studioの許可を得て、スイッチサイエンスが翻訳しています。