Vitis™ AI (1.4)を用いて、So-One KITで物体検出AIを動かしてみた ~作業編~
-
皆さまこんにちは!TEPPE-AIです!
更新頻度を上げていきたいと思っており、奮闘している状態でございます!!
今回のタイトルはこちら!!
「Vitis™ AI (1.4)を用いて、
So-One KITで物体検出AIを動かしてみた
~作業編~」
前回は、Vitis™ AI(1.3)のサンプルモデルをSo-One KIT上で動作した報告をさせていただきました。
※前回の記事は、こちらからどうぞ!
Vitis™ AIを用いてSo-One KITで物体検出AI(YOLOなど)を動かしてみた
今回は、実際にコンパイルから実装までを試していきますが、その前に1点ご報告です!
タイトルにもございますが、今回のTECHブログでは、Vitis™ AIの最新版である(※) ver1.4で試してみました!(※2021/9現在)
(提供リファレンスデザイン完成間近に、1.4のリリースがあり、急ぎ対応しておりました。。。orz)
記載通りにお試しいただければ、So-One KIT上でVitis™ AIを用いてAI Model Zooの様々なサンプルモデルを動かすことができるようになります。
AI Model Zooでは、今回試した物体検出以外にも、姿勢推定やナンバープレート検知など実運用を想定したモデルなど、幅広く用意されています。
https://github.com/Xilinx/Vitis-AI/tree/master/tools/Vitis-AI-Library
今回は、物体検出AI「YOLOv3」を試しますが、最後までチェックしていただければ流れを把握でき、そのほかのモデルも動かすことができると思いますので、是非最後までご覧ください!
それでは参りましょう。
目次
今回の作業について
今回は、リファレンスデザインと付随している当社作成の手順書に沿って進めていきます!
※手順書名:So-One 推論アプリ実行手順書
各工程の注意事項などを詳細に記載していますので、慣れていない方でも触れやすいかと思います。
ご購入いただいたお客様は、手順書と併せてご参照ください。
使用機材
HostPC | OS : Ubuntu18.04 | 今回は、Linux環境が必須となりますので、ご準備をよろしくお願いいたします! このPCでモデルのコンパイルを行います。 |
---|---|---|
評価ボード操作用PC | OS:Windows10 | 評価ボードを操作するために用います。 今回は、Tera Termといったコンソール接続ソフトを用いて評価ボードを操作しました。 |
評価ボード | So-One KIT | ※So-One KITにご興味があるお客様はこちら! |
microSDカード | Micron製 industrial micro SD card 32GB | SDブートモードを用いて起動するので、microSDカードを用意しました。 ※So-One KITはeMMCブートでの起動も可能です。 |
USBwebカメラ | Logicool製 C615 | カメラを用いた物体検出のAIモデルを動作させるので、USBWebカメラを用意しました。 |
モニタ | 今回のデモはモニタ出力となるため、モニタも用意します。 |
事前準備
HostPC
・SDイメージファイル書き込みツールをインストールEtcherを用いて、microSDカードへ書き込みを行いました。
・リファレンスデザインのダウンロードリファレンスデザインをダウンロードします。
PALTEK webサイトからダウンロード可能となっています。
まず、こちらにアクセスいただき、「ご購入済みのお客様へ」までスクロールします。
以下図にもある通り、「So-One KIT リファレンスデザイン(AI用途向け(Xilinx DPU搭載))」 をクリックし、アクセスします。
※アクセスにはご購入時にご案内するパスワードが必要になります。
正常にアクセスできると、以下の画面が表示されます。
「Rev1.0」「readme.txt」をまとめてダウンロードして完了です!
作業(HostPC)
Vitis™ AIダウンロード(手順書P5)
-
モデルのコンパイルを行うための環境整備を行います!
-初めに、今回の作業ディレクトリを作成しGitHubからVitis™ AIリポジトリをダウンロードします。
$ mkdir ~/Vitis/vitis_r1.4
$ git clone --recurse-submodules -b v1.4 https://github.com/Xilinx/Vitis-AI.git
-次にVitis AIのDockerイメージをダウンロードします。
(このイメージは18GBと非常に大きいので、だいぶ時間かかります…)
Dockerイメージなので、ダウンロード時のカレントディレクトリは任意で大丈夫です!
$ docker pull xilinx/vitis-ai-cpu:1.4.916
※正常にダウンロードできているか心配なので、以下のコマンドで入っているか確認しました。
$ docker image ls
※ご参考「現行ユーザーでのdockerコマンド使用について」
dockerコマンドは、rootユーザーのみ使用となっていますが、グループを作ってそこに現行ユーザーを追加すれば、現行ユーザーでも使用可能です!
詳細は、こちらをご参照ください!
-続いて、Vitis™ AIランタイムをダウンロードします。
こちらは圧縮ファイルをダウンロードするのみで、解凍は評価ボード上で行います。
$ cd ~/Vitis/vitis_r1.4
$ url=https://www.xilinx.com/bin/public/openDownload?filename=vitis-ai-runtime-1.4.0.tar.gz
$ wget -O ${url##*=} ${url}
※画像クリックで大きな画像が表示されます。
その後、作業ディレクトリ内に「vitis-ai-runtime-1.4.0.tar.gz」があればOKです!
urlというシェル変数を定義して、wgetコマンドでダウンロードを実行しています。
CUI環境で行っているので、コマンドを用いていますが、デスクトップ環境であれば、
https://www.xilinx.com/bin/public/openDownload?filename=vitis-ai-runtime-1.4.0.tar.gz
をwebブラウザのアドレスバーにコピペするのみで、ダウンロード可能です!
これにて本行程は完了です。お疲れ様でした!!
モデル変換(手順書P6~P10)
-
構築した環境を使用して、モデルの変換を行います。
-またまたその前に、変換用のディレクトリの作成を行います。
$ cd ~/Vitis/vitis_r1.4
$ mkdir -p work_so-one/compiled_output
※このディレクトリ名は、手順書と同じ名前にしましょう!
-次に、用いるDPU情報が記載されたファイルをHostPCへコピーします。
このファイルは、リファレンスデザイン内にあります。
“so-one_dpu_arch_v1.0.1.tar.gz”が該当します。
$ cd ~/Vitis/vitis_r1.4/Rev1.0/v1.0.1/040_dpu_archtecture
$ tar -zxvf so-one_dpu_arch_v1.0.1.tar.gz
※展開すると、so-one_dpu_archディレクトリが生成され、その中の”arch.json”が目的のファイルとなります。
$ cp so-one_dpu_arch/arch.json ~/Vitis/vitis_r1.4/Vitis-AI/work_so-one/
-モデルを変換するためのスクリプトファイルを作成します。
これを実行することで、モデルの変換が行えます。
記載内容はすべて手順書通りに書けばOKです!楽々ですね~!
今回は、CaffeのAIモデルを用いるので、Caffe用のみ作成します。
$ cd ~/Vitis/vitis_r1.4/Vitis-AI/work_so-one
$ vim compile_cf_model.sh
※上記のような感じで記載できればOKです!
-では、環境構築は完了しましたので、早速変換に取り掛かりましょう!
-まずは、用いるモデルを確認し、ダウンロードを行います。
今回用いるのは、「dk_tiny-yolov3_416_416_5.46G_1.4」です!
https://github.com/Xilinx/Vitis-AI/tree/master/models/AI-Model-Zoo/model-list
上記ディレクトリ内に、モデルのダウンロード先URLが記載しています。
まずはそちらをコマンドで確認してみましょう!
$ cd ~/Vitis/vitis_r1.4
$ less Vitis-AI/models/AI-Model-Zoo/model-list/dk_tiny-yolov3_416_416_5.46G_1.4/model.yaml
コマンドを実行すると、以下のような画面が出力されます。
こちらは、動作デバイスごとにモデルのダウンロード先が記載しており、Zynq® UltraScale+™ MPSoC だけでなくAlveo™やVersal™ AI コア シリーズ VCK190 評価キットなども対応しています!
※ご注意!!
今回用いるのは、少々複雑にはなりますが…
上記の四角で囲まれた、「board:GPU」 「board:ZCU102 & ZCU104 & kv260」の2種類です。理由として、実行時に必要なファイルが1つのディレクトリにまとまっていないためです。まず各々主に以下が格納されています。
・board:GPU(dk_tiny-yolov3_416_416_5.46G_1.4.zip)
→量子化完了済みのモデルが格納
・board:ZCU102 & ZCU104 & kv260(tiny_yolov3_vmss-zcu102_zcu104_kv260-r1.4.0.tar.gz)
→モデル実行用パラメータ記載テキスト(prototxt)が格納
このprototxtが「board:ZCU102 & ZCU104 & kv260」に格納されています。
そのため、2種類をダウンロードする必要があるのですね~
と、いうことで早速ダウンロードしていきましょう!
”download link”と記載された箇所があるので、リンクをコピーしてwgetコマンドでダウンロードします。
※「board:ZCU102 & ZCU104 & kv260」のダウンロード
$ cd ~/Vitis/vitis_r1.4/Vitis-AI/work_so-one
$ url=https://www.xilinx.com/bin/public/openDownload?filename=tiny_yolov3_vmss-zcu102_zcu104_kv260-r1.4.0.tar.gz
$ wget -O ${url##*=} ${url}
上記コマンドを実施すると、以下のように出力されます。
※画像クリックで大きな画像が表示されます。
その後、作業ディレクトリ内に
「tiny_yolov3_vmss-zcu102_zcu104_kv260-r1.4.0.tar.gz」があればOKです!
※「board:GPU」のダウンロード
$ cd ~/Vitis/vitis_r1.4/Vitis-AI/work_so-one
$ url=https://www.xilinx.com/bin/public/openDownload?filename=dk_tiny-yolov3_416_416_5.46G_1.4.zip
$ wget -O ${url##*=} ${url}
同じく実行すると、以下の画面が出力されます。
※画像クリックで大きな画像が表示されます。
同様に作業ディレクトリ内に
「dk_tiny-yolov3_416_416_5.46G_1.4.zip」があればOKです!
これでダウンロードが完了です。
-さぁ!ようやく変換と参りましょう!
以下コマンドでダウンロードしたファイルを初めに解凍します。
$ cd ~/Vitis/vitis_r1.4/Vitis-AI/work_so-one
$ unzip dk_tiny-yolov3_416_416_5.46G_1.4.zip
コマンド実行後、以下のように出力されます。
※画像クリックで大きな画像が表示されます。
作業ディレクトリ内に解凍後の「dk_tiny-yolov3_416_416_5.46G_1.4」ディレクトリが存在していればOKです!
-コンパイルを行うために、Vitis™ AIのDockerコンテナを起動します。
以下コマンドで実行します。
$ cd ~/Vitis/vitis_r1.4/Vitis-AI
$ bash docker_run.sh Xilinx/vitis-ai:1.4.916
以下が出力されれば正常に起動しています!
-起動完了後、いよいよ変換です!
以下コマンドを入力して、実行していきます!!
$ conda activate vitis-ai-caffe
$ cd work_so-one
$ bash compile_cf_model.sh tiny-yolov3_416_416 dk_tiny-yolov3_416_416_5.46G_1.4
正常に完了すると、以下のような画面が出力されます。
※画像クリックで大きな画像が表示されます。
そして、work_so-oneディレクトリ内にcompiled_outputディレクトリが生成され、その中に変換されたAIモデルが格納されています。
以下が実行後のwork_so-oneディレクトリ内部です!
※「tiny-yolov3_416_416.xmodel」が変換済みAIモデルに該当します。
これにて変換は完了です!
-最後に、実機動作に必要なファイルをSDイメージファイル内にコピーします。
SDイメージファイル内にアクセスするために、手順の通りにいくと、当社提供SDイメージファイルをmicroSDに書き込み、カードリーダを介してマウントさせる方法になっています。
が、しかし、現状在宅勤務を継続しており、手元にHostPCがない…!
そのため、こんな状況でも作業できる別な方法で試します!!
※詳細は、こちらがご参考になるかと思います。
(※こちらの作業を試される場合、自己責任でお願いいたします!)
mountコマンドを用いて、/mntディレクトリに一時的にマウントします!
事前準備として、パーディション情報から、マウント先の開始位置を確認します。
その前に、イメージファイルを解凍して、
$ cd ~/Vitis/vitis_r1.4/Rev1.0/v1.0.1/030_sd-image_vitis-output
$ gunzip so-one_dpu_sd-card_v1.0.1.img.gz
fdiskコマンドでimgファイルのパーディション情報を確認します。
$ fdisk so-one_dpu_sd-card_v1.0.1.img
すると、以下のように出力されます。
情報から、マウントするポイントは、512*2000896となりますので、こちらを指定してマウントしていきましょう。
その前に、マウントするにあたり、
/mntディレクトリ内にマウント用のディレクトリを作ることをお勧めします。
ディレクトリを作成し、マウントをしていきましょう。
$ mkdir /mnt/sd_card_img
$ sudo mount -o loop,offset=$[512*2000896] ./so-one_dpu_sd-card_v1.0.1.img /mnt/sd_card_img
すると、あら不思議!
/mnt/sd_card_imgディレクトリ内に、/ディレクトリが!
ということで、本題に戻りまして…
イメージファイル内に無事アクセスできたので、実機動作に必要なファイルをコピーします。
こちらは手順書通りに行えばOKです!
$ cd ~/Vitis/vitis_r1.4
$ sudo mkdir -p /mnt/sd_card_img/home/root/work_so-one
$ sudo cp -a vitis-ai-runtime-1.4.0.tar.gz /mnt/sd_card_img/home/root/work_so-one/
$ cd ~/Vitis/vitis_r1.4/Vitis-AI/work_so-one
$ sudo cp -a densebox_640_360-zcu102_zcu104_kv260-r1.4.0.tar.gz /mnt/sd_card_img/home/root/work_so-one
$ sudo cp -a compiled_output /mnt/sd_card_img/home/root/work_so-one/
これにてコピーは完了です!
最後に、アンマウントだけは確実に行って終了します!
さよならSDイメージ~♪
$ sudo umount /mnt/sd_card_img
コピーが完了したイメージファイルを圧縮して、Etcherソフトで書き込んで完了です!
$ cd ~/Vitis/vitis_r1.4/Rev1.0/v1.0.1/030_sd-image_vitis-output
$ gzip so-one_dpu_sd-card_v1.0.1.img
圧縮すると、「so-one_dpu_sd-card_v1.0.1.img.gz」が生成されます。
Etcherソフトを用いてmicroSDに書き込みます。
※書き込みに関しては、手順書のP11にも記載しておりますので、ご参照ください。
これにて、HostPCでの作業は完了です。
次は、実機動作確認です。
早速試してみましょう。
作業(評価ボード)
評価ボード起動(手順書P13)
用意したmicroSDを用いて起動させます。
・SDブート
・Windows10搭載のPC上で、コンソール接続ソフト経由で操作
-手順書には、今回の環境での起動方法が詳細に記載されているので、安心しながら作業できます。
事前準備(手順書P14)
推論実行する前の準備を行います。
最適化に使用するスクリプトを解凍し、実行して完了です。
# tar zxf /media/sd-mmcblk1p1/app/dpu_sw_optimize.tar.gz
# bash dpu_sw_optimize/zynqmp/zynqmp_dpu_optimize.sh
完了後、以下のように出力されます。
-続いて、HostPCでダウンロードしていたランタイムをインストールします。
解凍した後、含まれているセットアップ用スクリプトを実行して完了です。
# cd /home/root/work_so-one
# tar zxf vitis-ai-runtime-1.4.0.tar.gz
# cd vitis-ai-runtime-1.4.0/2020.2/aarch64/centos/
# bash setup.sh
セットアップ用スクリプトを実行すると、以下のようにインストール画面が表示されます。
※画像クリックで大きな画像が表示されます。
-最後に、推論実行に必要なファイルを各々のディレクトリに配置します。
# cd /home/root/work_so-one
# tar zxf tiny_yolov3_vmss-zcu102_zcu104_kv260-r1.4.0.tar.gz
# mkdir -p /usr/share/vitis_ai_library/models
# cp -a compiled_output/tiny-yolov3_416_416 /usr/share/vitis_ai_library/models/
# cp -a tiny_yolov3_vmss/tiny_yolov3_vmss.prototxt /usr/share/vitis_ai_library/models/tiny-yolov3_416_416/
さまざまなファイルを扱ったので、一度整理しますね。
/usr/share/vitis_ai_library/modelsディレクトリの構成はこんな感じです。
※評価ボードのLinux OS上にtreeコマンドがなかったため、findコマンドにて代用しました。
※画像クリックで大きな画像が表示されます。
※ご注意!!
prototxtについて、
おそらく「tiny-yolov3_vmss.prototxt」となっているかと思います。
こちらは「tiny-yolov3_416_416.prototxt」にリネームお願いいたします!!
-これにて事前準備完了です。お疲れ様でした!
推論デモ実行(手順書P15)
いよいよ、作成したデモを実行します。
# cp -a /mnt/sd-mmcblk1p1/dpu.xclbin /usr/lib/
# export XLNX_VART_FIRMWARE=/usr/lib/dpu.xclbin
-続いて、画面表示について設定します。以下のコマンドを実行します。
# export DISPLAY=:0.0
# xrandr --output DP-1 --mode 640x480
-これでフィニッシュです!!以下のコマンドでデモを実行します。
# cd
#/usr/share/vitis_ai_library/samples/yolov3/test_video_yolov3 test_video_yolov3_416_416 0
実行後、コンソールに以下が出力され、約1秒後にデモ画面がモニタに表示されます。
モニタにはこのように表示されます。
※プライバシー保護のため、顔付近は黒く塗りつぶさせて頂きましたm(__)m
左斜め下あたりに、ペットボトルを認識したバウンディングボックスが表示されています!
今回はサンプルモデルのため、精度に関して実行環境(外部)の影響により良いときと良くないときそれぞれありますが、 処理速度に関しては、23FPSとなかなか良い結果が出ているのではと思います!
これにて作業完了です!
上記のような流れで、その他のAI Model Zooのモデルも動作させることが可能です。
※姿勢推定(open pose)や、ナンバープレート検知(plate detect)など…
サンプルとなりますが、変換~実装までの流れは把握できるため、独自モデルを動かす際にも参考になるのではと考えております。
最後に
今回も最後までご覧いただきありがとうございました~
公開されているAI Model ZooのサンプルモデルをSo-One KITで動かしてみましたが、エラーなどでつまることなく作業ができました!
当社にて、手順書やリファレンスデザインもご用意していますので、So-One KITをご購入頂ければ、スピーディーに検証に取り掛かることができると思います。
「エッジAIをFPGAで試してみたいが、どれを試せば良いか分からない・・・」
「ザイリンクスのFPGAを用いてみたいが、どれから取り組めばよいか分からない・・・」
などお困りごとがございましたら、So-One KITに限らずご相談いただければと思います。
次回は、量子化も含めた、AIモデルのSo-One KIT実装について紹介していけたらと思います。
※変更する可能性もございます!m(__)m
それではまた!TEPPE-AIでした~