Skip to main content

TensorRTを使用してNVIDIA JetsonにYOLOv8をデプロイ

このwikiガイドでは、YOLOv8モデルをNVIDIA Jetsonプラットフォームにデプロイし、TensorRTを使用して推論を実行する方法を説明します。ここでは、Jetsonプラットフォームでの推論性能を最大化するためにTensorRTを使用します。

以下のような様々なコンピュータビジョンタスクを紹介します:

  • 物体検出
  • 画像セグメンテーション
  • 画像分類
  • ポーズ推定
  • 物体追跡

前提条件

  • Ubuntu ホストPC(ネイティブまたはVMware Workstation Playerを使用したVM)
  • reComputer JetsonまたはJetPack 5.1.1以上を実行している他のNVIDIA Jetsonデバイス
note

このwikiはreComputer J4012およびNVIDIA Jetson orin NX 16GBモジュールを搭載したreComputer Industrial J4012[https://www.seeedstudio.com/reComputer-Industrial-J4012-p-5684.html]でテストおよび検証されています

JetsonにJetPackをフラッシュ

JetsonデバイスがJetPackシステムでフラッシュされていることを確認する必要があります。NVIDIA SDK Managerまたはコマンドラインを使用してデバイスにJetPackをフラッシュできます。

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

note

このwikiで検証したバージョンであるため、JetPackバージョン5.1.1をフラッシュするようにしてください

1行のコードでJetsonにYOLOV8をデプロイ!

JetsonデバイスにJetPackをフラッシュした後、以下のコマンドを実行するだけでYOLOv8モデルを実行できます。これにより、まず必要なパッケージと依存関係をダウンロードしてインストールし、環境をセットアップし、YOLOv8から事前訓練済みモデルをダウンロードして、物体検出、画像セグメンテーション、ポーズ推定、画像分類タスクを実行します!

wget files.seeedstudio.com/YOLOv8-Jetson.py && python YOLOv8-Jetson.py
note

上記スクリプトのソースコードはこちらで確認できます

事前学習済みモデルの使用

YOLOv8を始める最も速い方法は、YOLOv8が提供する事前学習済みモデルを使用することです。ただし、これらはPyTorchモデルであるため、Jetsonで推論を行う際にはCPUのみを利用します。JetsonでこれらのモデルをGPU上で実行して最高のパフォーマンスを得たい場合は、このwikiのセクションに従ってPyTorchモデルをTensorRTにエクスポートできます。

YOLOv8は、COCOデータセットで入力画像サイズ640x640で学習された、物体検出用の5つの事前学習済みPyTorchモデル重みを提供しています。以下で確認できます

Modelsize
(pixels)
mAPval
50-95
Speed
CPU ONNX
(ms)
Speed
A100 TensorRT
(ms)
params
(M)
FLOPs
(B)
YOLOv8n64037.380.40.993.28.7
YOLOv8s64044.9128.41.2011.228.6
YOLOv8m64050.2234.71.8325.978.9
YOLOv8l64052.9375.22.3943.7165.2
YOLOv8x64053.9479.13.5368.2257.8

参考: https://docs.ultralytics.com/tasks/detect

上記の表から希望するモデルを選択してダウンロードし、以下のコマンドを実行して画像に対する推論を実行できます

yolo detect predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg' show=True

モデルについては、yolov8s.pt、yolov8m.pt、yolov8l.pt、yolov8x.ptのいずれかに変更することができ、関連する事前訓練済みモデルがダウンロードされます

ウェブカメラを接続して以下のコマンドを実行することもできます

yolo detect predict model=yolov8n.pt source='0' show=True
note

上記のコマンドを実行する際にエラーが発生した場合は、コマンドの最後に「device=0」を追加してみてください

note

上記は reComputer J4012/ reComputer Industrial J4012 で実行され、640x640 入力で訓練された YOLOv8s モデルを使用し、TensorRT FP16 精度を使用しています。


TensorRTを使用して推論速度を向上させる

前述したように、JetsonでYOLOv8モデルを実行する際の推論速度を向上させたい場合は、まず元のPyTorchモデルをTensorRTモデルに変換する必要があります。

以下の手順に従って、YOLOv8 PyTorchモデルをTensorRTモデルに変換してください。

note

これは前述した4つのコンピュータビジョンタスクすべてに対応しています

  • ステップ1. モデルパスを指定してエクスポートコマンドを実行する
yolo export model=<path_to_pt_file> format=engine device=0

例えば:

yolo export model=yolov8n.pt format=engine device=0
note

cmakeに関するエラーが発生した場合は、無視してください。TensorRTのエクスポートが完了するまでお待ちください。数分かかる場合があります

TensorRTモデルファイル(.engine)が作成された後、以下のような出力が表示されます

  • ステップ 2. 追加の引数を渡したい場合は、以下の表に従って実行できます
キー説明
imgsz640スカラーまたは(h, w)リストとしての画像サイズ、例:(640, 480)
halfFalseFP16量子化
dynamicFalse動的軸
simplifyFalseモデルの簡素化
workspace4ワークスペースサイズ(GB)

例えば、PyTorchモデルをFP16量子化でTensorRTモデルに変換したい場合は、以下のように実行します

yolo export model=yolov8n.pt format=engine half=True device=0

モデルのエクスポートが正常に完了したら、検出、分類、セグメンテーション、姿勢推定の4つのタスクすべてを実行する際に、yolopredictコマンド内の**model=**引数でこのモデルを直接置き換えることができます。

例えば、物体検出の場合:

yolo detect predict model=yolov8n.engine source='0' show=True

独自のAIモデルを持ち込む

データ収集とラベリング

特定のAIアプリケーションがあり、そのアプリケーションに適した独自のAIモデルを持ち込みたい場合は、独自のデータセットを収集し、ラベル付けを行い、YOLOv8を使用してトレーニングすることができます。

自分でデータを収集したくない場合は、すぐに利用できる公開データセットを選択することもできます。COCOデータセットPascal VOCデータセットなど、多数の公開データセットをダウンロードできます。Roboflow Universeは、幅広いデータセットを提供する推奨プラットフォームで、コンピュータビジョンモデルの構築に利用できる90,000以上のデータセットと6,600万以上の画像が利用可能です。また、Googleでオープンソースデータセットを検索し、利用可能な様々なデータセットから選択することもできます。

独自のデータセットがあり、画像にアノテーションを付けたい場合は、Roboflowが提供するアノテーションツールの使用をお勧めします。詳細については、このwikiの部分に従ってください。また、アノテーションについてはRoboflowのこのガイドに従うこともできます。

トレーニング

ここでは、モデルをトレーニングする3つの方法があります。

  1. 最初の方法はUltralytics HUBを使用することです。RoboflowをUltralytics HUBに簡単に統合できるため、すべてのRoboflowプロジェクトがトレーニングにすぐに利用できるようになります。ここでは、トレーニングプロセスを簡単に開始し、リアルタイムでトレーニングの進行状況を表示するGoogle Colabノートブックを提供しています。

  2. 2番目の方法は、トレーニングプロセスを簡単にするために私たちが作成したGoogle Colabワークスペースを使用することです。ここでは、Roboflow APIを使用してRoboflowプロジェクトからデータセットをダウンロードします。

  3. 3番目の方法は、トレーニングプロセスにローカルPCを使用することです。ここでは、十分に強力なGPUがあることを確認し、データセットを手動でダウンロードする必要があります。

ここでは、Ultralytics HUBを使用してRoboflowプロジェクトを読み込み、Google Colabでトレーニングを行います。

  • ステップ1. このURLにアクセスし、Ultralyticsアカウントにサインアップします

  • ステップ2. 新しく作成したアカウントでサインインすると、以下のダッシュボードが表示されます

  • ステップ3. このURLにアクセスし、Roboflowアカウントにサインアップします

  • ステップ4. 新しく作成したアカウントでサインインすると、以下のダッシュボードが表示されます

  • ステップ5. 私たちが準備したこのwikiガイドに従って、新しいワークスペースを作成し、ワークスペース内に新しいプロジェクトを作成します。公式Roboflowドキュメントから詳細を学ぶには、こちらを確認することもできます。

  • ステップ6. ワークスペース内にいくつかのプロジェクトができると、以下のようになります

  • ステップ7. Settingsに移動し、Roboflow APIをクリックします
  • ステップ8. copyボタンをクリックしてPrivate API Keyをコピーします
  • ステップ9. Ultralytics HUBダッシュボードに戻り、Integrationsをクリックし、先ほどコピーしたAPI Keyを空の列に貼り付けてAddをクリックします
  • ステップ10 ワークスペース名がリストに表示されていれば、統合が成功したことを意味します
  • ステップ11 Datasetsに移動すると、すべてのRoboflowプロジェクトがここに表示されます
  • ステップ12 プロジェクトをクリックして、データセットの詳細を確認します。ここでは、健康なリンゴと損傷したリンゴを検出できるデータセットを選択しました
  • ステップ13 Train Modelをクリックします
  • ステップ14 Architectureを選択し、Model name(オプション)を設定してからContinueをクリックします。ここでは、モデルアーキテクチャとしてYOLOv8sを選択しました
  • ステップ15 Advanced optionsで、お好みに応じて設定を構成し、Colabコード(これは後でColabワークスペースに貼り付けられます)をコピー&ペーストしてからOpen Google Colabをクリックします
  • ステップ16 まだサインインしていない場合は、Googleアカウントにサインインします
  • Step 17 Runtime > Change runtime type に移動します
  • Step 18 Hardware acceleratorGPU を選択し、GPU type で利用可能な最高のものを選択して Save をクリックします
  • Step 19 Connect をクリックします
  • Step 20 RAM, Disk ボタンをクリックしてハードウェアリソースの使用状況を確認します
  • Step 21 Play ボタンをクリックして最初のコードセルを実行します
  • Step 22 先ほど Ultralytics HUB からコピーしたコードセルを Start セクションの下に貼り付けて実行し、トレーニングを開始します
  • Step 23 Ultralytics HUB に戻ると、Connected というメッセージが表示されます。Done をクリックします
  • Step 24 ここで、Google Colab でモデルがトレーニングされている間、Box Loss、Class Loss、Object Loss がリアルタイムで表示されます
  • Step 25 トレーニングが完了すると、Google Colab で以下の出力が表示されます
  • Step 26 Ultralytics HUB に戻り、Preview タブに移動してテスト画像をアップロードし、トレーニング済みモデルの性能を確認します
  • Step 26 最後に Deploy タブに移動し、YOLOv8 で推論するために好みの形式でトレーニング済みモデルをダウンロードします。ここでは PyTorch を選択しました。

これで、ダウンロードしたモデルを、このwikiで以前に説明したタスクで使用できます。モデルファイルをあなたのモデルに置き換えるだけです。

例えば:

yolo detect predict model=<your_model.pt> source='0' show=True

パフォーマンスベンチマーク

準備

NVIDIA Jetson Orin NX 16GBモジュールを搭載したreComputer J4012/ reComputer Industrial J4012で動作するYOLOv8がサポートするすべてのコンピュータビジョンタスクについて、パフォーマンスベンチマークを実施しました。

samplesディレクトリには、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 最適化ファイルに変換し、以下のような出力を確認できます

FP32 よりも優れたパフォーマンスを提供する FP16 精度を使用したい場合は、上記のコマンドを以下のように実行できます

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

ただし、FP16よりも優れたパフォーマンスを提供するINT8精度が必要な場合は、上記のコマンドを次のように実行できます

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

結果

以下に、reComputer J4012/ reComputer Industrial J4012で実行した4つのコンピュータビジョンタスクすべてから得られた結果をまとめます。

ボーナスデモ:YOLOv8を使用したエクササイズ検出・カウンター

YOLOv8-Poseモデルを使用して、YOLOv8でエクササイズ検出とカウントを行うポーズ推定デモアプリケーションを構築しました。このデモの詳細を学び、独自のJetsonデバイスにデプロイするには、こちらのプロジェクトをご確認ください!

NVIDIA Jetson用YOLOv8の手動セットアップ

前述のワンラインスクリプトでエラーが発生した場合は、以下の手順を一つずつ実行してJetsonデバイスでYOLOv8を準備できます。

Ultralyticsパッケージのインストール

  • ステップ1. Jetsonデバイスのターミナルにアクセスしてpipをインストールし、アップグレードします
sudo apt update
sudo apt install -y python3-pip -y
pip3 install --upgrade pip
  • ステップ 2. Ultralyticsパッケージをインストールする
pip3 install ultralytics
  • ステップ 3. numpy のバージョンを最新にアップグレードする
pip3 install numpy -U
  • ステップ 4. デバイスを再起動する
sudo reboot

Torch と Torchvision のアンインストール

上記の ultralytics インストールにより、Torch と Torchvision がインストールされます。しかし、pip 経由でインストールされたこれら 2 つのパッケージは、ARM aarch64 アーキテクチャベースの Jetson プラットフォーム上では動作しません。そのため、事前にビルドされた PyTorch pip wheel を手動でインストールし、Torchvision をソースからコンパイル/インストールする必要があります。

pip3 uninstall torch torchvision

PyTorchとTorchvisionのインストール

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

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

PyTorch v2.0.0

JetPack 5.1 (L4T R35.2.1) / JetPack 5.1.1 (L4T R35.3.1) でPython 3.8をサポート

file_name: torch-2.0.0+nv23.05-cp38-cp38-linux_aarch64.whl URL: https://nvidia.box.com/shared/static/i8pukc49h3lhak4kkn67tg9j4goqm0m7.whl

PyTorch v1.13.0

JetPack 5.0 (L4T R34.1) / JetPack 5.0.2 (L4T R35.1) / JetPack 5.1 (L4T R35.2.1) / JetPack 5.1.1 (L4T R35.3.1) でPython 3.8をサポート

file_name: torch-1.13.0a0+d0d6b1f2.nv22.10-cp38-cp38-linux_aarch64.whl URL: https://developer.download.nvidia.com/compute/redist/jp/v502/pytorch/torch-1.13.0a0+d0d6b1f2.nv22.10-cp38-cp38-linux_aarch64.whl

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

例えば、ここでは JP5.1.1 を実行しているため、PyTorch v2.0.0 を選択します

sudo apt-get install -y libopenblas-base libopenmpi-dev
wget https://nvidia.box.com/shared/static/i8pukc49h3lhak4kkn67tg9j4goqm0m7.whl -O torch-2.0.0+nv23.05-cp38-cp38-linux_aarch64.whl
pip3 install torch-2.0.0+nv23.05-cp38-cp38-linux_aarch64.whl
  • ステップ 2. インストールしたPyTorchのバージョンに応じてtorchvisionをインストールします。例えば、PyTorch v2.0.0を選択した場合、Torchvision v0.15.2を選択する必要があります
sudo apt install -y libjpeg-dev zlib1g-dev
git clone https://github.com/pytorch/vision torchvision
cd torchvision
git checkout v0.15.2
python3 setup.py install --user

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

  • PyTorch v2.0.0 - torchvision v0.15
  • PyTorch v1.13.0 - torchvision v0.14

より詳細なリストが必要な場合は、このリンクをご確認ください。

ONNXのインストールとNumpyのダウングレード

これはPyTorchモデルをTensorRTに変換したい場合にのみ必要です

  • ステップ1. 必要なONNXをインストールします
pip3 install onnx
  • ステップ 2. エラーを修正するために Numpy を低いバージョンにダウングレードする
pip3 install numpy==1.20.3

リソース

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

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

Loading Comments...