Skip to main content

Yolov5とRoboflowを使った入門

note

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

YOLOv5とRoboflowを使用したFew-Shotオブジェクト検出

はじめに

YOLOは、利用可能な最も有名なオブジェクト検出アルゴリズムの1つです。このアルゴリズムは、少ないサンプルでのトレーニングが可能で、トレーニング時間が短く高い精度を提供します。本Wikiでは、これらの特徴を1つずつ実演しながら、データを収集し、ラベル付けし、トレーニングし、最終的にトレーニング済みデータを使用してオブジェクトを検出するという機械学習パイプライン全体をステップバイステップで説明します。また、カスタムデータセットと公開データセットを使用する場合の違いも比較します。

YOLOv5とは?

YOLOは「You Only Look Once(1回見るだけ)」の略です。これは、リアルタイムで画像内のさまざまなオブジェクトを検出して認識するアルゴリズムです。UltralyticsのYOLOv5はYOLOの最新バージョンであり、現在はPyTorchフレームワークに基づいています。

Few-Shotオブジェクト検出とは?

従来、機械学習モデルをトレーニングする場合、Pascal VOC 2012データセットのような約17112枚の画像を含む公開データセットを使用します。しかし、YOLOv5を使用した転移学習により、非常に少ないトレーニングサンプルでFew-Shotオブジェクト検出を実現できます。本Wikiではこれを実演します。

対応ハードウェア

YOLOv5は以下のハードウェアでサポートされています:

  • NVIDIA公式開発キット:

    • NVIDIA® Jetson Nano Developer Kit
    • NVIDIA® Jetson Xavier NX Developer Kit
    • NVIDIA® Jetson AGX Xavier Developer Kit
    • NVIDIA® Jetson TX2 Developer Kit
  • NVIDIA公式SoM(System on Module):

    • NVIDIA® Jetson Nano module
    • NVIDIA® Jetson Xavier NX module
    • NVIDIA® Jetson TX2 NX module
    • NVIDIA® Jetson TX2 module
    • NVIDIA® Jetson AGX Xavier module
  • Seeed製キャリアボード:

    • Jetson Mate
    • Jetson SUB Mini PC
    • Jetson Xavier AGX H01 Kit
    • A203キャリアボード
    • A203(バージョン2)キャリアボード
    • A205キャリアボード
    • A206キャリアボード

前提条件

  • 上記のいずれかのJetsonデバイスで、最新のJetPack v4.6.1がインストールされ、すべてのSDKコンポーネントがインストールされていること(インストールの参考としてこのWikiを参照)

  • ホストPC

    • ローカルトレーニングにはLinux PC(推奨:Ubuntu)が必要
    • クラウドトレーニングは任意のOSを搭載したPCで実行可能

始めましょう

Jetsonプラットフォームのようなエッジデバイスで最初のオブジェクト検出プロジェクトを実行するには、以下の4つの主要なステップを実行します!

  1. データセットを収集するか、公開されているデータセットを使用する

    • データセットを手動で収集
    • 公開されているデータセットを使用
  2. Roboflowを使用してデータセットにアノテーションを付ける

  3. ローカルPCまたはクラウドでトレーニングを行う

    • ローカルPC(Linux)でトレーニング
    • Google Colabでトレーニング
  4. Jetsonデバイスで推論を行う

データセットを収集するか、公開されているデータセットを使用する

オブジェクト検出プロジェクトの最初のステップは、トレーニング用のデータを取得することです。公開されているデータセットをダウンロードするか、自分でデータセットを作成することができます。通常、公開データセットは教育や研究目的で使用されます。しかし、公開データセットに自分が検出したいオブジェクトが含まれていない場合、独自のデータセットを作成する必要があるかもしれません。

データセットを手動で収集する

まず、認識したいオブジェクトのビデオ映像を録画することをお勧めします。この際、オブジェクトの全角度(360度)をカバーし、異なる環境、異なる照明条件、異なる天候条件でオブジェクトを配置するようにしてください。 録画したビデオの合計時間は9分で、そのうち4.5分は花、残りの4.5分は葉の映像です。録画内容は以下のように分けられます:

  1. 朝の通常の天候
  2. 朝の風の強い天候
  3. 朝の雨の天候
  4. 昼の通常の天候
  5. 昼の風の強い天候
  6. 昼の雨の天候
  7. 夕方の通常の天候
  8. 夕方の風の強い天候
  9. 夕方の雨の天候

注意: 後で、このビデオ映像を一連の画像に変換し、トレーニング用のデータセットを作成します。

公開されているデータセットを使用する

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

Roboflowを使用してデータセットをアノテーションする

次に、収集したデータセットをアノテーションします。アノテーションとは、検出したい各オブジェクトの周りに矩形のボックスを描き、それにラベルを割り当てることを意味します。ここでは、Roboflowを使用してこれを行う方法を説明します。

Roboflowはオンラインベースのアノテーションツールです。ここでは、先ほど録画したビデオ映像を直接Roboflowにインポートし、それを一連の画像に変換できます。このツールは非常に便利で、データセットを「トレーニング、検証、テスト」に分割するのを助けてくれます。また、ラベル付け後にこれらの画像にさらなる処理を追加することも可能です。さらに、ラベル付けされたデータセットをYOLOV5 PyTorch形式に簡単にエクスポートできるため、非常に便利です!

  • ステップ1. こちらをクリックしてRoboflowアカウントにサインアップします。

  • ステップ2. Create New Projectをクリックしてプロジェクトを開始します。

  • ステップ3. Project Nameを入力し、License (CC BY 4.0)Project type (Object Detection (Bounding Box))をデフォルトのままにします。What will your model predict?の列にはアノテーショングループ名を入力します。例えば、今回の場合はplantsを選択します。この名前はデータセットのすべてのクラスを強調する必要があります。最後に、Create Public Projectをクリックします。
  • ステップ4. 録画したビデオ映像をドラッグ&ドロップします。
  • ステップ5. フレームレートを選択して、ビデオを一連の画像に分割します。ここではデフォルトのフレームレート1フレーム/秒を使用し、合計542枚の画像が生成されます。スライダーを操作してフレームレートを選択したら、Choose Frame Rateをクリックします。このプロセスは、ビデオの長さに応じて数秒から数分かかる場合があります。
  • ステップ6. 画像の処理が完了したら、Finish Uploadingをクリックします。画像がアップロードされるまでしばらく待ちます。
  • ステップ7. 画像がアップロードされたら、Assign Imagesをクリックします。
  • ステップ8. 画像を選択し、花の周りに矩形のボックスを描き、ラベルをpink flowerに設定してENTERを押します。
  • ステップ9. 残りの花についても同じ操作を繰り返します。
  • ステップ10. 葉の周りに矩形のボックスを描き、ラベルをleafに設定してENTERを押します。
  • ステップ11. 残りの葉についても同じ操作を繰り返します。

注意: 画像内に見えるすべてのオブジェクトにラベルを付けるようにしてください。オブジェクトの一部しか見えない場合でも、それにラベルを付けるようにしてください。

  • ステップ12. データセット内のすべての画像をアノテーションし続けます。

RoboflowにはLabel Assistという機能があり、ラベルを事前に予測してラベリングをより迅速に行うことができます。ただし、この機能はすべてのオブジェクトタイプに対応しているわけではなく、特定のオブジェクトタイプに限定されます。この機能を有効にするには、Label Assistボタンを押し、モデルを選択し、クラスを選択して、予測されたラベルとバウンディングボックスを画像で確認します。

上記のように、これは80クラスに限定されたアノテーションの予測を支援することしかできません。もしあなたの画像にこれらのクラスに該当しないオブジェクトが含まれている場合、ラベル補助機能を使用することはできません。

  • ステップ13. ラベリングが完了したら、Add images to Dataset をクリックします。
  • ステップ14. 次に、画像を「Train、Valid、Test」に分割します。デフォルトの分布割合をそのままにして、Add Images をクリックします。
  • ステップ15. Generate New Version をクリックします。
  • ステップ16. 必要に応じて PreprocessingAugmentation を追加できます。ここでは Resize オプションを削除し、元の画像サイズを保持します。
  • ステップ17. 残りのデフォルト設定をそのままにして、Generate をクリックします。
  • ステップ18. Export をクリックします。
  • ステップ19. download zip to computer を選択し、「Select a Format」では YOLO v5 PyTorch を選択して Continue をクリックします。
  • ステップ20. その後、.zip ファイルがコンピュータにダウンロードされます。この .zip ファイルは後でトレーニングに使用します。

ローカルPCまたはクラウドでのトレーニング

データセットのアノテーションが完了したら、次はデータセットをトレーニングする必要があります。トレーニングには2つの方法を紹介します。1つはオンライン(Google Colab)を使用する方法で、もう1つはローカルPC(Linux)を使用する方法です。

Google Colabでのトレーニングでは、2つの方法を使用します。最初の方法では、Ultralytics HUBを使用してデータセットをアップロードし、Colabでトレーニングを設定し、トレーニングを監視してトレーニング済みモデルを取得します。2つ目の方法では、Roboflow APIを介してRoboflowからデータセットを取得し、Colabでトレーニングを行い、モデルをダウンロードします。

Ultralytics HUBを使用したGoogle Colabでの利用

Ultralytics HUB は、コードを1行も書かずにモデルをトレーニングできるプラットフォームです。データをUltralytics HUBにアップロードし、モデルをトレーニングして、現実世界にデプロイするだけです!迅速でシンプル、そして使いやすいので、誰でも始められます。

  • ステップ1. こちらのリンク を訪問して、無料のUltralytics HUBアカウントにサインアップします。

  • ステップ2. 資格情報を入力し、メールでサインアップするか、Google、GitHub、Appleアカウントで直接サインアップします。

Ultralytics HUBにログインすると、以下のようなダッシュボードが表示されます。

  • ステップ3. 以前にRoboflowからダウンロードしたzipファイルを解凍し、含まれているすべてのファイルを新しいフォルダに入れます。

  • ステップ4. データセットyamlルートフォルダ(先ほど作成したフォルダ)が同じ名前であることを確認します。例えば、yamlファイルを pinkflowers.yaml と名付けた場合、ルートフォルダも pinkflowers と名付ける必要があります。

  • ステップ5. pinkflowers.yaml ファイルを開き、trainval ディレクトリを以下のように編集します。

train: train/images
val: valid/images
  • ステップ6. ルートフォルダを .zip に圧縮し、ルートフォルダと同じ名前を付けます(この例では pinkflowers.zip)。

これで、Ultralytics HUBにアップロードする準備が整ったデータセットが完成しました。

  • ステップ7. Datasets タブをクリックし、Upload Dataset をクリックします。
  • ステップ8. データセットの名前を入力し、必要に応じて説明を入力し、先ほど作成した .zip ファイルを Dataset フィールドにドラッグ&ドロップして、Upload Dataset をクリックします。
  • ステップ9. データセットがアップロードされたら、そのデータセットをクリックして、データセットの詳細を確認します。
  • ステップ10. Projects タブをクリックし、Create Project をクリックします。
  • ステップ11. プロジェクトの名前を入力し、必要に応じて説明を入力し、必要に応じてカバー画像を追加して、Create Project をクリックします。
  • ステップ12. 新しく作成したプロジェクトに入り、Create Model をクリックします。
  • ステップ13. モデル名を入力し、事前学習済みモデルとして YOLOv5n を選択し、Next をクリックします。

注意: 通常、事前学習済みモデルとして YOLOv5n6 が推奨されます。これは、Jetson プラットフォームのようなエッジデバイスで使用するのに適しているためです。しかし、Ultralytics HUBではまだサポートされていません。そのため、YOLOv5n を使用します。これは若干似たモデルです。

  • ステップ14. 先ほどアップロードしたデータセットを選択し、Next をクリックします。
  • ステップ 15. トレーニングプラットフォームとして Google Colab を選択し、Advanced Options ドロップダウンメニューをクリックします。ここでトレーニングの設定を変更できます。例えば、エポック数を 300 から 100 に変更し、他の設定はそのままにします。Save をクリックしてください。

注意: ローカルトレーニングを行う予定の場合は、Bring your own agent を選択することもできます。

  • ステップ 16. API キーをコピーし、Open Colab をクリックします。
  • ステップ 17. MODEL_KEY を先ほどコピーした API キー に置き換えます。
  • ステップ 18. Runtime > Run All をクリックして、すべてのコードセルを実行し、トレーニングプロセスを開始します。
  • ステップ 19. Ultralytics HUB に戻り、青色に変わったら Done をクリックします。また、Colab が Connected と表示されるのが確認できます。

これで HUB 上でトレーニングの進行状況が確認できます。

  • ステップ 20. トレーニングが終了したら、PyTorch をクリックして、PyTorch フォーマットでトレーニング済みモデルをダウンロードします。PyTorch は、Jetson デバイスで推論を行うために必要なフォーマットです。

注意: Formats に表示されている他のフォーマットにエクスポートすることも可能です。

Google Colab に戻ると、以下のような詳細が確認できます。

ここで、葉と花の精度 [email protected] はそれぞれ約 90% と 99.4%、全体の精度 [email protected] は約 94.7% です。

Google Colab と Roboflow API の使用

ここでは、Google Colaboratory 環境を使用してクラウド上でトレーニングを実行します。また、Colab 内で Roboflow API を使用してデータセットを簡単にダウンロードします。

  • ステップ 1. こちら をクリックして、すでに準備された Google Colab ワークスペースを開き、ワークスペース内の手順を進めてください。

トレーニングが終了すると、以下のような出力が表示されます。

ここで、葉と花の精度 [email protected] はそれぞれ約 91.6% と 99.4%、全体の精度 [email protected] は約 95.5% です。

  • ステップ 2. Files タブの下で、runs/train/exp/weights に移動すると、best.pt というファイルが表示されます。これはトレーニングから生成されたモデルです。このファイルをダウンロードして、Jetson デバイスにコピーしてください。このモデルを後で Jetson デバイスで推論に使用します。

ローカル PC の使用

ここでは、Linux OS を搭載した PC を使用してトレーニングを行います。この wiki では Ubuntu 20.04 PC を使用しています。

  • ステップ 1. YOLOv5 リポジトリをクローンし、Python>=3.7.0 環境で requirements.txt をインストールします。
git clone https://github.com/ultralytics/yolov5 
cd yolov5
pip install -r requirements.txt
  • ステップ 2. 以前に Roboflow からダウンロードした .zip ファイルを yolov5 ディレクトリにコピーして解凍します。
# 例
cp ~/Downloads/pink-flowers.v1i.yolov5pytorch.zip ~/yolov5
unzip pink-flowers.v1i.yolov5pytorch.zip
  • ステップ 3. data.yaml ファイルを開き、trainval ディレクトリを以下のように編集します。
train: train/images
val: valid/images
  • ステップ 4. 以下を実行してトレーニングを開始します。
python3 train.py --data data.yaml --img-size 640 --batch-size -1 --epoch 100 --weights yolov5n6.pt

データセットが比較的小さい(約 500 枚の画像)ため、転移学習 を使用することで、ゼロからトレーニングするよりも良い結果が期待されます。モデルは、事前学習済みの COCO モデルの重みで初期化され、weights 引数にモデル名(yolov5n6)を渡すことで設定されます。ここでは、エッジデバイスに最適な yolov5n6 を使用しています。画像サイズ640x640 に設定されています。バッチサイズ-1 に設定されており、これにより最適なバッチサイズが自動的に決定されます。ただし、「GPU メモリが不足している」というエラーが発生した場合は、バッチサイズを 32 または 16 に設定してください。また、エポック数 は好みに応じて変更可能です。

トレーニングが終了すると、以下のような出力が表示されます。

ここで、葉と花の精度 [email protected] はそれぞれ約 90.6% と 99.4%、全体の精度 [email protected] は約 95% です。

  • ステップ 5. runs/train/exp/weights に移動すると、best.pt というファイルが表示されます。これはトレーニングから生成されたモデルです。このファイルをコピーして Jetson デバイスに貼り付けてください。このモデルを後で Jetson デバイスで推論に使用します。

Jetson デバイスでの推論

TensorRT を使用する

ここでは、以前のトレーニングで生成したモデルを使用して、Jetson デバイスで画像の推論(物体検出)を行います。ここでは、NVIDIA TensorRT を使用して、Jetson プラットフォームでの推論性能を向上させます。

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

注意: 後で YOLOv5 を実行する際にエラーが発生しないように、matplotlibnumpy の固定バージョンを指定しています。また、torch と torchvision は後でインストールするため、ここでは除外しています。

  • ステップ 5. 以下の依存関係をインストールします。
sudo apt install -y libfreetype6-dev
  • ステップ 6. 必要なパッケージをインストールします。
pip3 install -r requirements.txt
  • ステップ 7. torch をインストールします。
cd ~
sudo apt-get install -y libopenblas-base libopenmpi-dev
wget https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl
pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl
  • ステップ 8. torchvision をインストールします。
sudo apt install -y libjpeg-dev zlib1g-dev
git clone --branch v0.9.0 https://github.com/pytorch/vision torchvision
cd torchvision
sudo python3 setup.py install
  • ステップ 9. 以下のリポジトリをクローンします。
cd ~
git clone https://github.com/wang-xinyu/tensorrtx
  • ステップ 10. 前回のトレーニングで生成した best.pt ファイルを yolov5 ディレクトリにコピーします。

  • ステップ 11. tensorrtx/yolov5 内の gen_wts.pyyolov5 ディレクトリにコピーします。

cp tensorrtx/yolov5/gen_wts.py yolov5
  • ステップ 12. PyTorch の .pt ファイルから .wts ファイルを生成します。
cd yolov5
python3 gen_wts.py -w best.pt -o best.wts
  • ステップ 13. tensorrtx/yolov5 に移動します。
cd ~
cd tensorrtx/yolov5
  • ステップ 14. yololayer.hvi テキストエディタ で開きます。
vi yololayer.h
  • ステップ 15. CLASS_NUM をモデルがトレーニングされたクラス数に変更します。この例では 2 に設定します。
CLASS_NUM = 2
  • ステップ 16. 新しい build ディレクトリを作成し、その中に移動します。
mkdir build 
cd build
  • ステップ 17. 先ほど生成した best.wts ファイルをこの build ディレクトリにコピーします。
cp ~/yolov5/best.wts .
  • ステップ 18. コンパイルします。
cmake ..
make
  • ステップ 19. モデルをシリアライズします。
sudo ./yolov5 -s [.wts] [.engine] [n/s/m/l/x/n6/s6/m6/l6/x6 or c/c6 gd gw]
#例
sudo ./yolov5 -s best.wts best.engine n6

ここでは、NVIDIA Jetson プラットフォームのようなエッジデバイスに推奨される n6 を使用します。ただし、Ultralytics HUB を使用してトレーニングを設定した場合、n6 はまだ HUB でサポートされていないため、n のみ使用できます。

  • ステップ 20. モデルが検出する画像を新しいフォルダ(例: tensorrtx/yolov5/images)にコピーします。

  • ステップ 21. 以下のように画像で推論を実行します。

sudo ./yolov5 -d best.engine images

以下は、Jetson Nano と Jetson Xavier NX での推論時間の比較です。

Jetson Nano

ここでは量子化が FP16 に設定されています。

上記の結果から、平均は約 47ms と見積もることができます。この値をフレーム毎秒に変換すると、1000/47 = 21.2766 = 21fps となります。

Jetson Xavier NX

ここでは量子化が FP16 に設定されています。

上記の結果から、平均は約 20ms と見積もることができます。この値をフレーム毎秒に変換すると、1000/20 = 50fps となります。

また、検出された物体を含む出力画像は以下のようになります。

TensorRT と DeepStream SDK を使用する

ここでは、NVIDIA TensorRTNVIDIA DeepStream SDK を使用して、ビデオ映像で推論を行います。

  • ステップ 1. Jetson デバイスにすべての SDK コンポーネントDeepStream SDK が正しくインストールされていることを確認します。(インストールに関する参考情報は この wiki を参照してください)

注意: すべての SDK コンポーネントと DeepStream SDK をインストールするには、NVIDIA SDK Manager を使用することを推奨します。

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

注意: 後で YOLOv5 を実行する際にエラーが発生しないように、matplotlibnumpy の固定バージョンを指定しています。また、torch と torchvision は後でインストールするため、ここでは除外しています。

  • ステップ 6. 以下の依存関係をインストールします。
sudo apt install -y libfreetype6-dev
  • ステップ 7. 必要なパッケージをインストールします。
pip3 install -r requirements.txt
  • ステップ 8. torch をインストールします。
cd ~
sudo apt-get install -y libopenblas-base libopenmpi-dev
wget https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl
pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl
  • ステップ 9. torchvision をインストールする
sudo apt install -y libjpeg-dev zlib1g-dev
git clone --branch v0.9.0 https://github.com/pytorch/vision torchvision
cd torchvision
sudo python3 setup.py install
  • ステップ 10. 以下のリポジトリをクローンする
cd ~
git clone https://github.com/marcoslucianops/DeepStream-Yolo
  • ステップ 11. DeepStream-Yolo/utils 内の gen_wts_yoloV5.pyyolov5 ディレクトリにコピーする
cp DeepStream-Yolo/utils/gen_wts_yoloV5.py yolov5
  • ステップ 12. yolov5 リポジトリ内で、YOLOv5 リリースから pt ファイル をダウンロードする (例: YOLOv5s 6.1)
cd yolov5
wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt
  • ステップ 13. cfgwts ファイルを生成する
python3 gen_wts_yoloV5.py -w yolov5s.pt

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

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

例: 1280 の場合
-s 1280
または
-s 1280 1280
  • ステップ 14. 生成された cfgwts ファイルを DeepStream-Yolo フォルダにコピーする
cp yolov5s.cfg ~/DeepStream-Yolo
cp yolov5s.wts ~/DeepStream-Yolo
  • ステップ 15. DeepStream-Yolo フォルダを開き、ライブラリをコンパイルする
cd ~/DeepStream-Yolo
# DeepStream 6.1 の場合
CUDA_VER=11.4 make -C nvdsinfer_custom_impl_Yolo
# DeepStream 6.0.1 / 6.0 の場合
CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo
  • ステップ 16. config_infer_primary_yoloV5.txt ファイルをモデルに合わせて編集する
[property]
...
custom-network-config=yolov5s.cfg
model-file=yolov5s.wts
...
  • ステップ 17. deepstream_app_config ファイルを編集する
...
[primary-gie]
...
config-file=config_infer_primary_yoloV5.txt
  • ステップ 18. 推論を実行する
deepstream-app -c deepstream_app_config.txt

上記の結果は Jetson Xavier NX 上で FP32YOLOv5s 640x640 を使用して実行されています。FPS が約 30 であることが確認できます。

INT8 キャリブレーション

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

  • ステップ 1. OpenCV をインストールする
sudo apt-get install libopencv-dev
  • ステップ 2. OpenCV サポート付きで nvdsinfer_custom_impl_Yolo ライブラリをコンパイル/再コンパイルする
cd ~/DeepStream-Yolo
# DeepStream 6.1 の場合
CUDA_VER=11.4 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo
# DeepStream 6.0.1 / 6.0 の場合
CUDA_VER=10.2 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo
  • ステップ 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 メモリに応じて設定してください。head -1000 を変更することで設定できます。例えば、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_yoloV5.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 -c deepstream_app_config.txt

上記の結果は Jetson Xavier NX 上で INT8YOLOv5s 640x640 を使用して実行されています。FPS が約 60 であることが確認できます。

ベンチマーク結果

以下の表は Jetson Xavier NX 上で異なるモデルがどのように動作するかをまとめたものです。

モデル名精度推論サイズ推論時間 (ms)FPS
YOLOv5sFP32320x32016.6660
FP32640x64033.3330
INT8640x64016.6660
YOLOv5nFP32640x64016.6660

公開データセットとカスタムデータセットの比較

ここでは、公開データセットと独自のカスタムデータセットを使用した場合のトレーニングサンプル数とトレーニング時間の違いを比較します。

トレーニングサンプル数

カスタムデータセット

この Wiki では、植物データセットをまず動画として収集し、その後 Roboflow を使用して動画を一連の画像に変換しました。この方法で 542 枚の画像を取得しましたが、これは公開データセットと比較すると非常に小規模なデータセットです。

公開データセット

公開データセットには、Pascal VOC 2012Microsoft COCO 2017 データセットがあり、それぞれ約 17112 枚と 121408 枚の画像が含まれています。

Pascal VOC 2012 データセット
Microsoft COCO 2017 データセット

トレーニング時間

ローカルトレーニング

トレーニングは NVIDIA GeForce GTX 1660 Super グラフィックスカード(6GB メモリ)で実施しました。

カスタムデータセットを使用したローカルトレーニング
540 枚の画像データセット

植物のローカルトレーニングを以前に実施した結果は以下の通りです。

ここでは、100 エポックを実行するのに 2.2 時間 しかかかりませんでした。これは公開データセットを使用したトレーニングよりも比較的速いです。

240 枚の画像データセット

データセットを 240 枚に減らして再度トレーニングを実施した結果は以下の通りです。

ここでは、100 エポックを実行するのに約 1 時間 しかかかりませんでした。これも公開データセットを使用したトレーニングよりも比較的速いです。

Pascal VOC 2012 データセットを使用したローカルトレーニング

同じトレーニングパラメータを維持したまま Pascal VOC 2012 データセットを使用してトレーニングを実施しました。この場合、1 エポックを実行するのに約 50 分 (0.846 時間 * 60) かかることが分かったため、1 エポックでトレーニングを停止しました。

100 エポックのトレーニング時間を計算すると、約 50 * 100 分 = 5000 分 = 83 時間 かかることになり、カスタムデータセットのトレーニング時間よりもはるかに長いです。

Microsoft COCO 2017 データセットを使用したローカルトレーニング

同じトレーニングパラメータを維持したまま Microsoft COCO 2017 データセットを使用してトレーニングを実施しました。この場合、1 エポックを実行するのに約 7.5 時間 かかると推定されたため、1 エポックが終了する前にトレーニングを停止しました。

100 エポックのトレーニング時間を計算すると、約 7.5 時間 * 100 = 750 時間 かかることになり、カスタムデータセットのトレーニング時間よりもはるかに長いです。

Google Colab トレーニング

トレーニングは NVIDIA Tesla K80 グラフィックスカード(12GB メモリ)で実施しました。

カスタムデータセット
540 枚の画像データセット

Google Colab を使用して植物の 540 枚の画像でトレーニングを以前に実施した結果は以下の通りです。

ここでは、100 エポックを実行するのに約 1.3 時間 しかかかりませんでした。これも公開データセットを使用したトレーニングよりも比較的速いです。

240 枚の画像データセット

データセットを 240 枚に減らして再度トレーニングを実施した結果は以下の通りです。

ここでは、100 エポックを実行するのに約 42 分 (0.697 時間 * 60) しかかかりませんでした。これも公開データセットを使用したトレーニングよりも比較的速いです。

Pascal VOC 2012 データセットを使用した Google Colab トレーニング

同じトレーニングパラメータを維持したまま Pascal VOC 2012 データセットを使用してトレーニングを実施しました。この場合、1 エポックを実行するのに約 9 分 (0.148 時間 * 60) かかることが分かったため、1 エポックでトレーニングを停止しました。

100 エポックのトレーニング時間を計算すると、約 9 * 100 分 = 900 分 = 15 時間 かかることになり、カスタムデータセットのトレーニング時間よりもはるかに長いです。

Microsoft COCO 2017 データセットを使用した Google Colab トレーニング

同じトレーニングパラメータを維持したまま Microsoft COCO 2017 データセットを使用してトレーニングを実施しました。この場合、1 エポックを実行するのに約 1.25 時間 かかると推定されたため、1 エポックが終了する前にトレーニングを停止しました。

100 エポックのトレーニング時間を計算すると、約 1.25 時間 * 100 = 125 時間 かかることになり、カスタムデータセットのトレーニング時間よりもはるかに長いです。

トレーニングサンプル数とトレーニング時間のまとめ

データセットトレーニングサンプル数ローカル PC (GTX 1660 Super) でのトレーニング時間Google Colab (NVIDIA Tesla K80) でのトレーニング時間
カスタム5422.2 時間1.3 時間
2401 時間42 分
Pascal VOC 20121711283 時間15 時間
Microsoft COCO 2017121408750 時間125 時間

事前学習済みチェックポイントの比較

以下の表から、事前学習済みチェックポイントについて詳しく学ぶことができます。ここでは、Google Colabでトレーニングを行い、Jetson NanoおよびJetson Xavier NXで推論を実行した際のシナリオを、事前学習済みチェックポイントとしてYOLOv5n6を使用した場合に焦点を当てています。

モデルサイズ (ピクセル)mAPval 0.5:0.95mAPval 0.5スピード CPU b1 (ms)スピード V100 b1 (ms)スピード V100 b32 (ms)スピード Jetson Nano FP16 (ms)スピード Jetson Xavier NX FP16 (ms)パラメータ (M)FLOPs @640 (B)
YOLOv5n64028.045.7456.30.61.94.5
YOLOv5s64037.456.8986.40.97.216.5
YOLOv5m64045.464.12248.21.721.249.0
YOLOv5l64049.067.343010.12.746.5109.1
YOLOv5x64050.768.976612.14.886.7205.7
YOLOv5n664071.795.51538.12.147203.14.6
YOLOv5s6128044.863.73858.23.612.616.8
YOLOv5m6128051.369.388711.16.835.750.0
YOLOv5l6128053.771.3178415.810.576.8111.4
YOLOv5x6 + [TTA]1280 153655.0 55.872.7 72.73136 -26.2 -19.4 -140.7 -209.8 -

参考: YOLOv5 GitHub

ボーナスアプリケーション

上記で説明したすべての手順は、どの種類の物体検出アプリケーションにも共通しているため、自分の物体検出アプリケーションに合わせてデータセットを変更するだけで済みます!

道路標識の検出

ここでは、Roboflowの道路標識データセットを使用し、NVIDIA Jetsonで推論を実行しました!

山火事の煙の検出

ここでは、Roboflowの山火事の煙データセットを使用し、NVIDIA Jetsonで推論を実行しました!

リソース

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

弊社製品をお選びいただきありがとうございます!製品のご利用がスムーズに進むよう、さまざまなサポートをご提供しています。お客様の好みやニーズに応じた複数のコミュニケーションチャネルをご用意しています。

Loading Comments...