PYNQでYOLOX-nano + PyTorchの物体検出してみた

本サイトはアフィリエイト広告を利用しています。
AI

KR260のDPUを使って、物体検出をしました。

YOLOX-nano+Pytorchの軽量のモデルを使用してます。

YOLOv3とYOLOXの実行速度の比較までした旨を紹介します。

 

スポンサーリンク

PYNQでYOLOX-nano + PyTorchの物体検出してみた

KR260のDPUを使って、物体検出をしました。

「YOLOX-nano」+「Pytorch」の軽量のモデルを使用してます。

PYNQ上で動作するプログラム(.ipynb)を作成して、動作することが出来ました。

 

旧プログラムのYOLOv3との検出速度の比較もしました。

新プログラムのYOLOXが約5倍ほど高速化していることも確認しています。

 

実行+速度比較したテスト動画が下記となります。

 

モデル作成からプログラムの内容まで一連の流れを紹介します。

 

YOLOX

学習済のコンパイル前のモデルは、Xilinx(AMD)からサンプルが提供されています。

今回使用するサンプルは下記にあります。

 https://github.com/Xilinx/Vitis-AI/tree/master/model_zoo/model-list/pt_yolox-nano_3.5

 

YOLOv3

DPU-PYNQのサンプルプログラムとしてYOLOv3-tinyがあります。

KR260+DPU環境で実行する方法は下記記事で紹介しています。

KR260とDPU-PYNQでYOLOv3の物体検出してみる

KR260とDPU-PYNQでYOLOv3の物体検出してみる
KR260で360°カメラの画像を物体検出してみました。DPU-PYNQのサンプルプログラムを使って、YOLOv3でテストしています。KR260で360°カメラの画像をYOLOv3の物体検出してみるKR260から360°カメラを撮影してみま...

 

但しYOLOv3も大分古いVerのため、実際に使っていて検出速度が遅かったです

そのため比較的新しい+軽量のモデルであるYOLOX-nanoを使用しました。

折角なので、速度比較のベンチマーク対象としています。

 

Vitis AIでYOLOX-nanoのモデルを作成する

最初にLinux環境でKR260用のYOLOXのモデルを作成(コンパイル)します。

YOLOXのサンプルのモデルをダウンロードして解凍します。

 

 

Vitis AIでコンパイル

Vitis AIを使ってコンパイルします。今回はpytorchのCPU版のVitis AIを立ち上げています。

(コンパイル自体はCPU版でもGPU版でも変わりありません。)

 

先ほど作ったarch,jsonも引数にして、コンパイルします。

ここではDPUのサイズはB4096に合わせています。

必要に応じてファイルを移動させてください。コンパイルは下記のように実行できました

 

コンパイル後に作成されるフォルダの中に.xmodelが作成されます。

 

PYNQでのプログラム作成

PYNQ上で動作するプログラムを作成します。今回は.ipynbで作っています。

サンプルプログラムのYOLOv3とはアルゴリズムが違うので、ある程度修正する必要がありました。

実際に動作させたプログラムは下記GitHubに置いています。詳細は下記を参考ください。

 https://github.com/iotengineer22/AMD-Pervasive-AI-Developer-Contest/blob/main/jupyter_notebooks/pynq-yolox/dpu_yolox-nano_pt_coco2017.ipynb

 

概要としては、通常のYOLOX-nanoの処理を行っています。

前処理→DPUでの入出力→後処理→BBOX書き出しを行っています。

通常だとCPUかGPUで推論する箇所を、DPU推論させています。(あと実行時間の測定もしています)

  • 前処理…416x416に画像をリサイズ+空いたスペースにパディング処理(114)
  • DPU推論…モデル入出力 (1,416,416,3) → ((1, 52, 52, 85) (1, 26, 26, 85) (1, 13, 13, 85))
  • 後処理…グリッド・ストライド・nmsなどの処理
  • BBOX書き出し…バウンディングボックスを写真に追加

 

プログラムの一部ですが、下記がメイン箇所です。

 

KR260でテスト

冒頭でも紹介しましたがテスト動画は下記です。

 

Webブラウザ経由でKR260のipynbファイルを開いています。

 

Pytorchで変換したYOLOXのモデルを使用しています。

 

入出力のTensorを確認しています。

(1,416,416,3) → ((1, 52, 52, 85) (1, 26, 26, 85) (1, 13, 13, 85))を確認しています。

 

今回のYOLOXはCOCOの80カテゴリで物体検出をしています。

 

物体検出のテストです。テーブルに乗ったオレンジボールで確認しています。

しっかりオレンジ[49]とダイニングテーブル[60]が検出できています。

 

物体検出した結果をresult.pngで保存するようにしています。

 

YOLOX-nanoとYOLOv3-tinyの検出速度比較

今回のYOLOX-nanoと古いYOLOv3-tinyで、検出速度の比較してみました。

(あくまで写真1枚の比較例です。)実行環境は同じDPU(B4096)で実施しています。

  • DPUの実行時間…0.1168→0.0154 約1/8の検出時間
  • CPUの後処理時間…0.1303→0.0303 約1/4の検出時間
  • Totalの処理時間…3.30→18.6(FPGA) 約5倍の速度

 

YOLOX-nanoが下記になります。

 

YOLOv3-tinyが下記になります。

 

360°の物体検出にもYOLOXを展開してみる

今回のYOLOXを360°ライブストリーミングの物体検出にも応用してみました。

YOLOXのテストプログラムが下記となります。

 https://github.com/iotengineer22/AMD-Pervasive-AI-Developer-Contest/blob/main/src/yolox-test/app_gst-yolox-real-360-2divide.py

 

テストした動画が下記となります。

 

元々360°カメラが古くUSB2.0のタイプのため、単純なライブストリーミングでも6fps程度でした。

1920x960の画像を前後で2分割して、960x960の画像を2つ表示してます。

 

実行速度が遅いYOLOv3の物体検出を実装すると、約1.5fpsまで低下しました。

毎回2枚分の画像を物体検出していますので、影響を大きいです。

 

YOLOXに変更すると1.5fps→3.5fps程度になり、大分改善されました。

更に効率よくスレッド化したりすれば、より6fpsに近づいていけそうです。

 

参照先

・YOLOX-ONNX-TFLite-Sample

 https://github.com/Kazuhito00/YOLOX-ONNX-TFLite-Sample/

YOLOv3→Xにして高速化しましたが、この方のコードを本当に参考にさせていただきました。

 

まとめ

KR260のDPUを使って、物体検出をしました。

YOLOX-nano+Pytorchの軽量のモデルを使用してます。

YOLOv3とYOLOXの実行速度の比較までした旨を紹介しました。

 

今回のKR260で実施した内容は、下記記事で紹介したテストの一部です。

AMD(Xilinx)のFPGAコンテストに参加した感想

AMD(Xilinx)のFPGAコンテストに参加した感想
AMD(Xilinx)とHackster(Avnet)が合同主催する、海外のコンテストに参加していました。AMD Pervasive AI Developer Contest の「Robotics AI」部門です。KR260というFPGAボ...

コメント