FPGAでYOLOXの物体検出をしてみました。
使用したFPGAの評価ボードはKV260です。
Vitis AIのサンプルを使って簡単にテストした内容を紹介します。
KV260でYOLOX+DPUの物体検出をしてみたメモ
KV260でYOLOXを使って、DPUによる物体検出を試してみました。
(KV260…Xilinx(AMD)のFPGAが搭載された評価ボード)
基本的にはVitis AIのサンプル使用して、簡単に練習・テストした内容を紹介します。
実行環境
KV260のFPGA評価ボードの環境でテストしています。
- 評価ボード…KV260
- DPU…DPUCZDX8G_ISA1_B4096
- Vitis AI…2.5
物体検出に必要なモデルはコンパイル済
下記記事にてKV260向けにYOLOXの物体検出のモデルをコンパイル済です。
Vitis AIでPytorchのcompileをしてみたメモ
ただし、Xilinx公式からコンパイル済のYOLOXのモデルも提供されています。
最初はXilinxの提供のYOLOXのモデルをダウンロードして使用していきます。
(最後にモデルを入れ替えて、筆者でコンパイルしたモデルでも動作するか確認します)
DPUはB4096を使用
KV260で使えるDPUが「DPUCZDX8G」という型番になります。
(DPU…Deep-Learning Processor Unit)
その中でも容量がB4096,B3136…と分かれています。
今回使用するのは「DPUCZDX8G_ISA1_B4096」です。
KV260で使える中では一番大きなDPUサイズを使用します。
Xilinx公式のコンパイル済のモデルサイズ設定がB4096のためです。
KV260のプラットフォーム
KV260のプラットフォーム作成・設定に関しては下記記事を参考にしています。
これ以降は、KV260でVitis AIのプラットフォームが設定済の旨で記載しています。
変更した箇所は、dpu_conf.vhのDPUのサイズの設定だけです。
define B3136 →
define B4096
プラットフォームは名は変えて「aiedge_4096」としています。
Vitis AIのコンパイル済のモデルでYOLOXをテストする
KV260にはLANコネクタ経由でPCから接続しています。
KV260でのコマンドの実行はMobaXtermのターミナルから実行しています。
コンパイル済のモデルをKV260に送る
Vitis AIのコンパイル済のモデルをダウンロードします。下記のyamlにリンク先があります。
https://github.com/Xilinx/Vitis-AI/tree/2.5/model_zoo/model-list/pt_yolox_TT100K_640_640_73G_2.5
LinuxもしくはWSL2でwgetでモデルを入手しています。
PCに一度ダウンロード・解凍してからKV260にフォルダごとscpで送っています。
フォルダ名はデフォルトだと「tsd_yolox_pt」でした。
1 2 3 |
wget https://www.xilinx.com/bin/public/openDownload?filename=tsd_yolox_pt-zcu102_zcu104_kv260-r2.5.0.tar.gz tar -xzvf openDownload\?filename\=tsd_yolox_pt-zcu102_zcu104_kv260-r2.5.0.tar.gz scp -r tsd_yolox_pt petalinux@192.168.11.13:~ |
物体検出する写真をKV260に送る
今回のYOLOXのモデルはTT100Kから作られています。
TT100Kは道路標識を検出・識別するためのデータセットです。下記記事で紹介しています。
Vitis AI Model ZooでPyTorch+YOLOXを動かそうとしたメモ
TT100K内にあるデータを使っても良いのですが、今回は別で2枚用意しました。
道路標識がある写真をピックアップしました。この2つもKV260に送ります。
n015-2018-07-24-11-22-45+0800__CAM_FRONT__1532402935662460.jpg
6dxeLhuoQr0JgHsLjUU6TmhF_77.jpg
KV260のvitis_ai_libraryの中にモデルと写真をコピーする
KV260での操作に移ります。
YOLOXのモデルのフォルダごと「/usr/share/vitis_ai_library/models/」にコピーします。
1 |
sudo cp -rf tsd_yolox_pt/ /usr/share/vitis_ai_library/models/ |
物体検出したい写真を「/usr/share/vitis_ai_library/samples/yolovx/」にコピーします。
1 2 |
sudo cp n015-2018-07-24-11-22-45+0800__CAM_FRONT__1532402935662460.jpg /usr/share/vitis_ai_library/samples/yolovx/ sudo cp 6dxeLhuoQr0JgHsLjUU6TmhF_77.jpg /usr/share/vitis_ai_library/samples/yolovx/ |
KV260でYOLOXで画像認識をする
B4096のDPUが搭載されたプラットフォーム(aiedge_4096)をロードします。
その後「/usr/share/vitis_ai_library/samples/yolovx/」に移動します。
1 2 3 4 |
sudo xmutil listapps sudo xmutil unloadapp sudo xmutil loadapp aiedge_4096 cd /usr/share/vitis_ai_library/samples/yolovx/ |
yolovxのフォルダ内にReadme含めて、ビルド済/前のテストプログラムがあります。
Vitis AIのGitHubの下記フォルダ内のファイルと同じはずです
https://github.com/Xilinx/Vitis-AI/tree/2.5/examples/Vitis-AI-Library/samples/yolovx
ビルド済のプログラムはそのまま使用できます。
Readmeに倣って、モデルのフォルダと写真を引数にして画像認識を試してみます。
sudo ./test_jpeg_yolovx tsd_yolox_pt n015-2018-07-24-11-22-45+0800__CAM_FRONT__1532402935662460.jpg
1 2 3 4 |
xilinx-k26-starterkit-20221:/usr/share/vitis_ai_library/samples/yolovx$ sudo ./test_jpeg_yolovx tsd_yolox_pt n015-2018-07-24-11-22-45+0800__CAM_FRONT__1532402935662460.jpg WARNING: Logging before InitGoogleLogging() is written to STDERR I0128 21:34:11.508499 2722 demo.hpp:1183] batch: 0 image: n015-2018-07-24-11-22-45+0800__CAM_FRONT__1532402935662460.jpg I0128 21:34:11.508729 2722 process_result.hpp:32] RESULT: 18 1131.04 232.68 1226.46 322.32 0.904166 |
実行結果からも「RESULT: 18…」と、何かしら物体検出できています。
プログラム実行後はフォルダ内に頭に「0_」が付いた写真ファイルが出来ています。
中身を確認すると、標識に緑線が囲われており物体認識できていることが確認できました。
画像認識後の写真は下記です。緑の線が細く、アップしないと分かりづらいです。
もう一枚の画像も試してみます。
sudo ./test_jpeg_yolovx tsd_yolox_pt 6dxeLhuoQr0JgHsLjUU6TmhF_77.jpg
1 2 3 4 |
xilinx-k26-starterkit-20221:/usr/share/vitis_ai_library/samples/yolovx$ sudo ./test_jpeg_yolovx tsd_yolox_pt 6dxeLhuoQr0JgHsLjUU6TmhF_77.jpg WARNING: Logging before InitGoogleLogging() is written to STDERR I0128 21:23:13.699226 2143 demo.hpp:1183] batch: 0 image: 6dxeLhuoQr0JgHsLjUU6TmhF_77.jpg I0128 21:23:13.699430 2143 process_result.hpp:32] RESULT: 16 385.44 176.94 523.56 315.06 0.412712 |
結果は「RESULT: 16…」と表示されており、物体認識しています。
(もし写真から何も標識が検出できなかった場合は、RESULTが出てきませんでした)
写真も確認すると、駐車禁止の標識を認識していることが分かります。
画像認識後の写真は下記です。
自分でコンパイルしたモデルで確認してみます
Xilinxのコンパイル済でモデルでYOLOXの動作を確認出来ました。
今度は下記記事で自分でコンパイルしたモデルを試してみます。
Vitis AIでPytorchのcompileをしてみたメモ
一度YOLOXのモデルを削除して、動かそうとどのようなエラーが出るのか確認してみます。
rmで「tsd_yolox_pt.xmodel」を削除した所、やはりモデルが無いよとエラーが発生しました。
1299 configurable_dpu_task_imp.cpp:106] cannot find model <tsd_yolox_pt>
1 2 3 4 5 6 7 8 9 10 |
xilinx-k26-starterkit-20221:/usr/share/vitis_ai_library/samples/yolovx$ sudo rm /usr/share/vitis_ai_library/models/tsd_yolox_pt/tsd_yolox_pt.xmodel xilinx-k26-starterkit-20221:/usr/share/vitis_ai_library/samples/yolovx$ sudo ./test_jpeg_yolovx tsd_yolox_pt 6dxeLhuoQr0JgHsLjUU6TmhF_77.jpg WARNING: Logging before InitGoogleLogging() is written to STDERR F0128 21:52:17.247812 1299 configurable_dpu_task_imp.cpp:106] cannot find model <tsd_yolox_pt> after checking following dir: . . /usr/share/vitis_ai_library/models /usr/share/vitis_ai_library/.models *** Check failure stack trace: *** Aborted |
その後コンパイルして作ったモデル「tsd_yolox_pt.xmodel」で確認してみました。
(量子化されたモデルまでは同じのため、同じ結果が返ってくるはず)
もちろんXilinxでコンパイルしたモデルと同じ結果が返ってきました。OKです。
1 2 |
sudo cp /home/petalinux/tsd_yolox_pt.xmodel /usr/share/vitis_ai_library/models/tsd_yolox_pt/ sudo ./test_jpeg_yolovx tsd_yolox_pt 6dxeLhuoQr0JgHsLjUU6TmhF_77.jpg |
まとめ
KV260でYOLOX+DPUの動作を確認できました。
また自分でコンパイルしたモデルでも同じ動作を確認できました。
次の記事ではKV260で3D物体検出(PointPillars)の動作を確認したいと思います。
KITTI形式の3D物体検出をKV260(FPGA)で試したメモ
今回の記事含めて、第6回AIエッジコンテストの一環でした。
下記にてコンテストでテスト・実施したことのまとめを紹介しています。
コメント