1. 株式会社PALTEK
  2. TECHブログ
  3. 技術情報
  4. Vitis™ AI ver1.2でVitis AI Libraryサンプルアプリを動かしてみた

TECHブログ

Vitis™ AI ver1.2でVitis AI Libraryサンプルアプリを動かしてみた

Vitis™ AI ver1.2でVitis AI Libraryサンプルアプリを動かしてみた

皆さまこんにちは!TEPPE-AIです!
前回の記事から少し時間がたちましたが、皆さまいかがお過ごしでしょうか。
誰も経験したことのないウィズコロナの世界。 明けない夜はない!を信じて一歩ずつ日常を取り戻していきましょう!

今回は、Vitis™ AI ver1.2がリリースされましたので、最新情報をお伝えしたいと思います。
では、まいりましょう。

Vitis™ AI ver1.2リリース

2020年7月にVitis AI ver1.2がリリースされました。
GitHub内のSee What's Newをみると、アップデートとして

  • Vitis AI Quantizer オープンソース化(学習済みモデルコンパイルツール)
  • Vitis AI Profiler実装
  • PyTorch対応(Alveo™ アクセラレータ カードのみ)

などなど、いろいろなアップデート内容が記載されていました。
その中でも私が一番注目していた、PyTorch対応ですが
残念ながら、エッジデバイスには現在未対応とのこと・・・orz

ただ、サンプルアプリのリストを見てみると、ver1.2で新たに登場したものが複数ありましたのでこちらのサンプルアプリを前回同様Zynq® UltraScale+™ MPSoC ZCU102評価キット上で動作させてみたいと思います。
前置きが長くなってしまいましたが、今回はこちら!!
「Vitis AI ver1.2でVitis AI Libraryサンプルアプリを動かしてみた!!」
をお伝えします!

 

ザイリンクス社Vitis™ AI ver1.2で Vitis AI Libraryサンプルアプリを動かしてみた

今回は、

  • サンプルアプリのビルド
  • サンプルアプリの実行

の2行程となります。
前回行っていた、「学習済みモデルのコンパイル」ですが、ver1.2でガラッと変わっていました。
※前回の記事は、こちらをご参照ください!!

コンパイルについて最初にお話ししたのち、サンプルアプリ実行について紹介したいと思います!

それでは、まいりましょう!!

※以降、前回同様Vitis AI GitHubのページ(https://github.com/Xilinx/Vitis-AI) に沿って解説を行います。Vitis AI GitHubをGitHubと表現しますので、よろしくお願いいたします。

1.学習済みモデルのコンパイル(ver1.2)について

ver1.1では、GitHubに「Tool-Example」というリポジトリに、コンパイルツールと手順が公開されていました。

※Vitis AI GitHub(ver1.1) メインリポジトリ

https://github.com/Xilinx/Vitis-AI/tree/v1.1 より抜粋(引用)

※Vitis AI GitHub(ver1.1) Tool-Exampleリポジトリ

https://github.com/Xilinx/Vitis-AI/tree/v1.1/Tool-Example
より抜粋(引用)

ver1.2では「Vitis AI Quantizer」という名前でコンパイルツールが公開されています。
READMEにはツールのビルド方法が記載されていましたが、使用手順の記載がなかったため今回は検証に含みませんでした。

Vitis AI Quantizerには、「Pruning」「Quantization」の2step存在しており、
目的は

  • Pruning :ハイパーパラメータの最適化
  • Quantization :INT8量子化による高速演算実装

といった、認識精度はあまり落とさず演算規模を縮小させる機能があります。

※Vitis AI Quantization 処理フロー

その中でも今回のGitHubには、「Quantization」のみ公開されています。
「Pruning」については、別途サポートチームにコンタクトしてくださいと記載されていました。

※Pruningにご興味がある方は PALTEK WEBサイトよりお気軽にお問合せください!

学習済みモデルのコンパイルは、手順が公開され次第取り組んでみようと思います!
さあ、ではサンプルモデルをZCU102上で動かしてみましょう!!

2.使用機材

  • hostPC

    OS : Ubuntu18.04 LTS
    →前回同様、開発マシンとしてLinux搭載が必須になります。
    windowsPCでは開発できませんので、ご注意願います!

  • windowsPC

    OS:windows10
    →今回は、ZCU102 コマンドベース操作用として用います。
    Tera Termを用いてUART,SSH経由で操作するため、用意しました。

  • 評価ボード

    Zynq UltraScale+ MPSoC ZCU102評価キット

  • SDカード

    Micron製 industrial micro SD card 32GB
    →ZCU102はSDカード必須なので、今回もmicroSD→SD変換アダプタを用いました。

3.事前準備

◆ hostPC

  • Vitis AI GitHubのインストール
    参照しているGitHubのリポジトリをcloneします。
    今回は、hostPCのhomeディレクトリ直下に作業ディレクトリ”Vitis”を作成し、 その中にcloneを行いました。
    $ mkdir ~/Vitis 
    $ git clone https://github.com/Xilinx/Vitis-AI

◆ windowsPC

◆ 評価ボード ZCU102

※ZCU102用imageファイルダウンロードリンクページ

https://github.com/Xilinx/Vitis-AI/blob/master/Vitis-AI-Library/README.md より抜粋(引用)

 

前回同様、Etcherを用いて、SDカードへ書き込みを行いました。
https://www.balena.io/etcher/


4.Vitis AI Libraryサンプルアプリのビルド

作業に取り掛かる前に、エッジデバイス上で動かせるサンプルアプリについて簡単に解説します。
GitHub上には

  • VART sample
  • Vitis AI Library sample
  • Vitis AI DNNDK sample

複数存在しており、今回はVitis AI Library sampleを選択しました。

Vitis AI Libraryは、実運用を想定したDeepLearningアプリとなります。
以下が、Vitis AI Libraryのサンプルアプリ一覧です。

 

ver1.1でも存在していましたが、ver1.2になって新たに公開されたものもあります。
では早速、こちらのサンプルアプリをビルドしてみようと思います!

◆ hostPC ビルド環境の構築

 

※ダウンロード先は任意です。私は、作業ディレクトリ”Vitis”を選択しました
以下コマンドで、インストールを行います。権限操作を忘れずに!!

$ ./sdk-2020.1.0.0.sh

実行すると、toolのインストール先を聞かれます。
任意に決定可能ですが、参照ページでは「~/petalinux_sdk」を推奨していますので 指示どおり、入力をします。

完了後、以下のように出力され、homeディレクトリ直下に「petalinux_sdk」が生成されます。

最後に、以下のコマンドを実行します。

$ source ~/petalinux_sdk/environment-setup-aarch64-xilinx-linux

・追加パッケージインストール
参照 : https://github.com/Xilinx/Vitis-AI/tree/master/Vitis-AI-Library#setting-up-the-host

追加でパッケージをダウンロードします。 参照ページにある”vitis_ai_2020.1-r1.2.0.tar.gz”をクリックし、実行します。

https://github.com/Xilinx/Vitis-AI/tree/master/Vitis-AI-Libraryより抜粋(引用)

※ダウンロード先は、sdk同様、作業ディレクトリ”Vitis”にしました。
以下コマンドで解凍し、インストールします。

$ tar -xzvf vitis_ai_2020.1-r1.2.0.tar.gz -C ~/petalinux_sdk/sysroots/aarch64-xilinx-linux

これにてビルド環境の構築は完了です!
ver1.1と比べて大分簡素化されていますねー!
ビルドはdocker不要なので、サクッと進められます。

◆サンプルアプリのビルド
構築した環境で早速ビルドしていきます!
サンプルアプリのビルドは簡単です!既に用意されているtoolを実行していきます。

ビルドtoolは、「Vitis-AI-Library/overview/samples」に存在する、 サンプルアプリのリポジトリに存在しています。
「Vitis-AI-Library」直下のサンプルアプリのリポジトリには存在していませんので、ご注意を!

※ビルドtool内装サンプルアプリのディレクトリ

https://github.com/Xilinx/Vitis-AI/tree/master/Vitis-AI-Library/overview/samplesより抜粋(引用)

以下のコマンドでビルドを行います。例として、classificationのビルドを行います。

$ cd ~/Vitis/Vitis-AI/Vitis-AI-Library/overview/samples/classification
$ sh build.sh

ビルドが成功すると、以下のように無拡張子の実行ファイルが生成されます。
※実行ファイルは緑色でハイライトされているものになります。


その他サンプルアプリについても、同様の手順でビルド可能です。

overview/samples内にあるサンプルアプリをいくつか、別途ビルド用にディレクトリをコピーしてビルドしました。

$ cd ~/Vitis/Vitis-AI/Vitis-AI-Library/overview/
$ cp -r samples samples_pal

※コピーディレクトリ名は、「samples_pal」にしました。

アプリのビルド方法は、各ディレクトリのREADMEに記載されていますので、そちらをご参照ください!
※ありがたいことに、全て「$ sh build.sh」ですけどね!

さあ!
ビルドもできたことですし、早速ZCU102上で実行してみましょう~!

5.Vitis AI Libraryサンプルアプリのインストール

では、ビルドしたサンプルアプリをZCU102上で動かしていきましょう!
動かす前に、ZCU102に必要なパッケージをインストールしていきます。

◆ ZCU102セットアップ

  • IPv4の設定

    UART経由でZCU102起動後、scpにてファイルを転送できるようIPアドレスを設定します。 /etc/network/interfaceを操作し、各自任意に設定してください。

以下が、interfaceとなります。

私は、dhcpを有効にして社内ネットワークに接続して操作しました!

https://github.com/Xilinx/Vitis-AI/tree/master/Vitis-AI-Libraryより抜粋(引用)

※ダウンロード先は、作業ディレクトリ”Vitis”です。
以下コマンドで、ZCU102へコピーします。

$ scp xilinx_model_zoo_zcu102-1.2.0-1.aarch64.rpm root@IP_OF_BOARD:~/

※IP_OF_BOARDは、先ほど設定したIPアドレスを入力します。

以下コマンドで、ZCU102上にインストールします。操作は、ZCU102上です。

# rpm -ivh --force xilinx_model_zoo_zcu102-1.2.0-1.aarch64.rpm

※少し時間がかかります。↓の画像が展開完了時の出力です

https://github.com/Xilinx/Vitis-AI/tree/v1.2.1-old1/Vitis-AI-Libraryより抜粋(引用)

※ダウンロード先は、作業ディレクトリ”Vitis”です。
以下コマンドで解凍し、 一部ファイルをhostPCからZCU102へファイルをコピーします

$ cd ~/Vitis
$ tar -xzvf vitis-ai-runtime-1.2.0.tar.gz
$ scp -r vitis-ai-runtime-1.2.0/aarch64/centos root@IP_OF_BOARD:~/

※IP_OF_BOARDは、先ほど設定したIPアドレスを入力します。

以下コマンドで、ZCU102上にインストールします。操作は、ZCU102上です。

# cd ~/centos
# rpm -ivh --force libunilog-1.2.0-r10.aarch64.rpm
# rpm -ivh --force libxir-1.2.0-r12.aarch64.rpm
# rpm -ivh --force libtarget-factory-1.2.0-r10.aarch64.rpm
# rpm -ivh --force libvart-1.2.0-r16.aarch64.rpm
# rpm -ivh --force libvitis_ai_library-1.2.0-r15.aarch64.rpm
  • Vitis AI Library、サンプル画像のインストール
    参照: https://github.com/Xilinx/Vitis-AI/tree/master/Vitis-AI-Library#running-vitis-ai-library-examples

    サンプルアプリを実行時に使用する画像等をインストールします。 Vitis AI Runtime同様、hostPCにダウンロードし、その後ZCU102へインストールします。

    参照ページにある” vitis_ai_library_r1.2.x_images.tar.gz”,
    ” vitis_ai_library_r1.2.x_video.tar.gz”をクリックし、ダウンロードします。
    ※試した当初は、「x」は0でした。

https://github.com/Xilinx/Vitis-AI/tree/master/Vitis-AI-Libraryより抜粋(引用)

以下コマンドでhostPCからZCU102へコピーします。

$ scp vitis_ai_library_r1.2.0_images.tar.gz root@IP_OF_BOARD:~/
$ scp vitis_ai_library_r1.2.0_video.tar.gz root@IP_OF_BOARD:~/

※IP_OF_BOARDは、先ほど設定したIPアドレスを入力します。

以下コマンドで、ZCU102上で解凍します。

# tar -xzvf vitis_ai_library_r1.2.0_images.tar.gz -C Vitis-AI/vitis_ai_library
# tar -xzvf vitis_ai_library_r1.2.0_video.tar.gz -C Vitis-AI/vitis_ai_library
  • hostPC上でビルドしたサンプルアプリをコピー
    前行程でビルドしたサンプルアプリをZCU102へコピーします。 ビルドしたアプリが入っているディレクトリ「samples_pal」をコピーします。
$ cd ~/Vitis/Vitis-AI/Visit-AI-Library/overview/
$ scp -r samples_pal root@IP_OF_BOARD:~/Vitis-AI/vitis_ai_libary/

※IP_OF_BOARDは、先ほど設定したIPアドレスを入力します。

6.Vitis AI Libraryサンプルアプリの実行

準備が整いました!早速試してみます!
実行方法は、いたって簡単です!
各サンプルアプリのディレクトリ内のREADMEに実行方法が記載されています。
試しに、1つplatedetectを実行してみます!

READMEをみると、以下のコマンドで実行できるとのことなのでー

https://github.com/Xilinx/Vitis-AI/tree/master/Vitis-AI-Library/overview/samples/platedetectより抜粋(引用)

そちらに従って実行してみます!
実行前に、サンプル画像(sample_platedetect.jpg)があることを確認します!

以下コマンドで実行すると、
同ディレクトリに”sample_platedetect_result.jpg”が生成されます。

# cd Vitis-AI/vitis_ai_library/samples_pal/platedetect
# ./test_jpeg_platedetect plate_detect sample_platedetect.jpg

元画像と結果画像(sample_platedetect_result.jpg)を比べてみましょうか!

platedetect

左が元画像、右画像が結果画像となります。
少し見えづらいかもですが、しっかりナンバープレート付近に赤いBBが重畳されていますね!

こんな感じで、一部を除きREADMEに記載している実行方法で実行すると 出力結果として、画像が出力されます。
他のサンプルアプリも同じ手順で実施すると、以下のような結果になりました!

medicalsegmentation

この画像は、喉?何かガンを領域分割で発見するものですかね?
2種の色のBBがありますが、こちらも何か意味しているのでしょうか・・

multitask

物体検出と領域分割両方の結果をマージしたものですね!
物体検出は、personやcarなどラベル分類はしていないようです。

lanedetect

車道のラインを検知していますね!
左側の青ラインをみると、途切れていたらラインがない箇所は検知していないように見えます
これは、なかなか精度が高そうです。

openpose

きれいに姿勢推定できてますね!

posedetect

縦長でびっくりしましたが。。
ただ骨格を検知するだけでなく、前後ろ?で区別しているようにもみえます。

facedetect

顔付近にBBがしっかり重畳されています!

facelandmark

faedetectとは別で、おそらく顔のパーツ(目,鼻,口)の位置を検出していますね。

ssd

物体検出の王道のSSD。
車の検知のみ?となっていますが、結構小さいものも検知できていますね!

refinedet

物体検出の王SSDの改良版といわれているRefineDet。
SSDと画像こそ違いますが、こちらも劣らず人をしっかり検知できていますね!

ざっとこんな感じです。
ビルドアプリの中で、”test_performance_***”のような精度や処理速度を出力してくれそうなものがあり、試しにSSDとRefineDetで比較してみようと思ったのですが

# cd ~/Vitis-AI/vitis_ai_library/samples_pal/refinedet
# ./test_performance_refinedet refinedet_pruned_0_8 sample_refinedet.jpg

以下のように、文字化けした結果が出力され、アプリがフリーズしました・・・
リダイレクトで、txtへ出力しようとしましたがエラーなので何も記載されずでした。
※「Ctrl + c」で強制終了させました。

途中、”can not read image・・”と表記がありましたが、しっかりサンプル画像を選択しました。
READMEには、画像を出力する実行コマンドしか方法が記載されていなかったので もしかしたら、何か足りなかったのかもしれません。

※以下が、サンプルアプリ実行のREADMEです。(refinedetの場合) 結果画像を出力する”test_jpeg_refinedet”のみの記載ですね。

https://github.com/Xilinx/Vitis-AI/blob/v1.2.1-old1/Vitis-AI-Library/overview/samples/refinedet/readme より抜粋(引用)

処理速度、精度の比較は今後のアップデートをみて試してみたいと思います!!

7.作業を振り返って

今回も最後までご覧いただき、誠にありがとうございました。
リリースしたてということもあり、まだ完全ではないですが、今後のアップデートが楽しみですね!

(お気づきの方もいるかもしれませんが、、執筆中にver1.2.1がリリースされてました…orz)

サンプルアプリの豊富さから、様々なレイヤーに対応してそうな雰囲気です。
研究フェイズのアルゴリズムが、実運用フェイズに採用されているものも増えてきているので、 対応可能なアルゴリズムが多いのは、とても大きいメリットかと思います!

私個人としては、

  • PyTorchモデルの実装
  • ver1.2でモデルのコンパイル
  • 専用APIを用いてアプリの作成

を早くやってみたいです!

しっかりとアップデートをチェックしていこうと思います!

それでは、またお会いしましょう!!TEPPE-AIでした!!