#Ultra96v2向けVitis AI のデモ(SDカードイメージ)2020.1版
XILINX社のVitis AIは、FPGAで、AIができるとあって、注目を集めています。
ただ、資料をみても、どうやって動かせばいいのかが、わからないことも多いです。
今回は、Ultra96V2で、AIを動かすためのデータを用意しました。
FPGAでAIが動くことが、確認できたら幸いです。
目標
Ultra96v2を使って、AIが動作できることを確認する。
Vitis AI Github mpsocの内容をUltra96V2で動くようにしたものです。
#必要なもの
はじめてのUltra96 AI EDGEに挑戦編。(シリーズ紹介)の必要な環境 を参照してください。
Ultra96V2が必要です。
今回は開発ツールは使いません。
確認用にUSB3.0がついたWindows10または、Ubuntu18.04LTSが搭載したパソコンが必要になります。
####ハードウェア
- Ultra96V2
- USB-JTAG/UART pod
- USBケーブル TypeA-microTypeB USB2.0
- USBケーブル TypeA-microTypeB USB3.0
- USBカメラ
- 電源12V2A以上
- [電源変換ケーブル](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=2AD6-DEK3 "cable change")
使用するパソコンはWindows10とUbuntu18.04LTSでのご紹介になります。以下のツール(無料ツール)を使うことを前提に話を進めていきます。
####Windows10の場合
####Ubuntu 18.04 LTSの場合
- Etcher SDカードイメージを書き込む あれば便利
#手順
ここでは、次のことを行っていきます。
1.SDカードイメージ、設定ファイルをダウンロードする。
2.SDカードイメージを書き込む。
3.Ultra96V2に電源を入れる。
4.Ultra96V2に使えるSDカードの容量を増やす。
5.Ultra96v2とパソコンを接続させる(SSH接続)
6.パソコンから、Ultra96v2にファイルを転送する。
7.Ultra96V2をAIが動くようにの準備をする。
8.用意したプログラムをビルドする。
9.プログラムを動かして、AI動作を確認する。
10.電源を切る。
#実際の操作
1.SDカードイメージ、設定ファイルをダウンロードする。
1.1. Ultra96v2を動かすため、いくつかファイルが必要です。
パソコンにダウンロードしてください。
ファイル名 | サイズ | 内容 |
---|---|---|
sd_card.img.zip | 324Mバイト | Ultra96v2向けSDカードイメージ |
vitis-ai_v1.2_dnndk.tar.gz | 296Kバイト | AI向けライブラリー、ツール環境 |
vitis-ai_v1.2_dnndk_sample_img.tar.gz | 172Mバイト | AIテスト用画像 |
vitis_ai_dnndk_samples_u96v2.zip | 475Mバイト | Ultra96V2のAIプログラム |
各、ファイル名のリンクをクリックするとダウンロードできます。 |
###2.SDカードイメージを書き込む。
2.1 SDカードイメージをSDカードに書き込みます。ダウンロードした SD カードイメージsd_card.img.zipをEtcherを使って書き込みます。 Linux の方はコマンド dd コマンドでも大丈夫です。
2.2 Etcherはここからからダウンロードできます。ダウンロード後インストールしてください。
https://www.balena.io/etcher/
2.3 インストール後、次のアイコンで起動します。
2.3 Windows でも Linux でも使えます。使い方は簡単で、ファイルを選択し、SDカードを入れて、フラッシュボタンことによって、書き込みが始まります。数分待つと書き込みが終了します。次にEthcerの画面を示します。
2.4 Ethcer が起動しましたら、[Flash from file]ボタンを押して、
ファイルを選択します。今回の場合はsd_card.img.zip です。Zipファイルのままで大丈夫です。その後 SD カードを挿入します SD カードが正しいことを確認したら、[Flash!]ボタンを押します。SD カードに書き込みが始まります。
2.5 なお、Winodwsの場合「このアプリがデバイスに変更を加えることを許可しますか?」と出ますが、そのまま、はい、を押してください。Linuxの場合はパスワードを聞いてきます。
2.6 SD カードが書き終わりましたら取り出します。これがそのまま Ultra 96v2に動作します。Windowsの場合、途中で、フォルダーが認識したり、「ドライブX:を使うにはフォーマットする必要があります。」、と出たりしますが、無視してください。Ultra96V2向けのLinuxフォーマットのためWinodwsで読み込めないため出てきます。
その後、SDカードを取り出します。
######Ubuntu で、ddコマンドを使う方。
2.7 Ubuntu の方はまずは解凍が必要になります。解凍後ddコマンドを使って SD カードイメージをを書き込んでください
$ unzip sd_card.img.zip
$ dd if=sd_card.img of=/dev/sdb bs=4096
###3.Ultra96V2に電源を入れる。
3.1 Ultra 96v2を用意します。2で書き込んだ、SDカードを入れます。
3.2 写真のように Ultra 96v2にケーブル接続してください。USB ケーブルは2本とも接続します。 USB 3.0以上が必要になります。電源は12V電源が必要です。USB カメラを持ってる方は USB カメラを Ultra 96v2に接続してください。BOOT MODEスイッチ(SW3)はSDに合わせます。デフォルトでそうなっています。
3.3 パソコン側でターミナルソフトを立ち上げます。
Windows の方は Teraterm 等のアプリを立ち上げてください。ポートは一番大きい番号にしてください。スピードは115200です。TeraTerm立ち上げ後、メニューから[設定]→[シリアルポート...]で設定できます。
3.4 Ubuntuの方は、gtkterm 等で実現してください。sudo コマンドを使うのは、USBアクセスにルート権限が必要だからです。
$ sudo gtkterm --port /dev/ttyUSB1 --speed 115200
3.5 Ultra96v2に電源を入れます。電源は3つある、青いボタンの真ん中を押すと、起動します。
3.6 次の画面が出るまで待ちます。30秒ほどで出てきます。出てきましたらキーボードから、Enter キーを押してください Ultra 96v2通常の Linux でコマンド入力ができるようになります。
###4.Ultra96V2に使えるSDカードの容量を増やす。
4.1 SD カードイメージの容量を小さくするためわざと SD カードイメージを小さくしています。Ultra 96v2では使いづらいので残りの容量を拡張します。
4.2 Ultra 96v2のコマンド入力ができましたら、次のコマンドを入力します。
parted
4.3 次のコマンドを順番に入力します。
resizepart
2
Yes
100%
quit
4.4 実際にサイズの大きさを変更するコマンドを入力します。
resize2fs /dev/mmcblk0p2
画面表示は次のようになります。
root@u96v2:~# parted
GNU Parted 3.2
Using /dev/mmcblk0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) resizepart
Partition number? 2
Warning: Partition /dev/mmcblk0p2 is being used. Are you sure you want to
continue?
Yes/No? Yes
End? [3326MB]? 100%
(parted) quit
Information: You may need to update /etc/fstab.
root@u96v2:~# resize2fs /dev/mmcblk0p2
resize2fs 1.45.3 (14-Jul-2019)
Filesystem at /dev/mmcblk0p2 is mounted on /media/sd-mmcblk0p2; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/mmcblk0p2 is now 3615104 (4k) blocks long.
root@u96v2:~#
###5.Ultra96v2とパソコンを接続させる(SSH接続)
パソコンとのやり取りを便利にするため、Ultra 96v2との接続を SSH 接続します。 SSH 接続ができますとファイルの転送コマンド入力画像表示などが、パソコン側からできるようになります。
5.1 Ultra 96v2側で USB をイーサネットに接続できるようにします。Ethernet Over USB という技術です。 Ultra 96v2で次のコマンドを入力します。
modprobe g_ether idVendor=0x0924 idProduct=0x1200
5.2 イーサーネットを有効にします。次のコマンドを入力します。
ifup usb0
画面は次のようになります。
root@u96v2:~# modprobe g_ether idVendor=0x0924 idProduct=0x1200
root@u96v2:~# ifup usb0
5.3.Ultra 96v2の TCP IP アドレスは192.168.7.2で固定のになります。そのため、パソコン側でも IP アドレスを設定する必要があります。
Ubuntuの方は、5.16まで飛んでください。
######Windowsの場合
5.4 Windows の場合はスタートメニューから 設定 ネットワーク とインターネット アダプターのオプションを変更するを実行します。
5.5 ネットワークの接続で、[OpenCable Receiver Preproduction..]を見つけて、ダブルクリックします。
5.6 細かい設定を行います。プロパティーをクリックしてください。
5.7インターネットプロトコルバージョン4(TCP/IP4)を選択してから、プロパティーをクリックします。
5.8 IPアドレスの設定をします。次のIPアドレスを使うをクリックします。その後IPアドレスを192.168.7.10に設定します。サブネットマスクは255.255.255.0で行います。設定が終わりましたら、OKをクリックして、設定を完了します。
5.9 設定が終わりましたので、いらないウインドウは閉じてください。
5.10.SSHターミナルを立ち上げます。MobaXterm を立ち上げます。このアプリ Windows で X ターミナルとして使用できます。SSHターミナルとして動作して、ファイルの転送と、画面の共有などができます。インストールをするには次のところをからクリックしてダウンロードしてインストールしてください
MobaXterm
5.11.このアイコンでMobaXtermが立ち上がります
5.12.MobaXtermがたちあがりましたら、Xウィンドウで画像が使えるように設定します。メニューから[Settings]→[Configuration]をクリックします。その後 x11のタブを押してください。X11 remote access を full にした後、OK を押します。
5.13 Ultra96v2 SSH 接続をします。MobaXtermのSessionのアイコンを押します。
5.14 SSHの接続先情報を入力します。SSHのアイコンを押します。 Remoto host に 192.168.7.2を、Specifly username にrootを入力します。その後、OKです。
5.15 MobaXtermで、Ultara96v2が接続されます。もし、パスワードを聞いてきたときは、root と入力してください。Linuxコマンドを入力してお試ししても。大丈夫です。
Windowsの方は、次の6章まで進んでください。
######Ubuntuの場合
5.16.Ubuntuの場合も、IP アドレスを固定します。設定画面から、ネットワークを選んでください。USB Ethernetが見えますので、設定のアイコンをクリックしてください。
5.17 IPアドレスを固定します。IPv4のタブを開いてます。手動にチェックを入れた後、アドレスに192.168.7.3 ネットワークマスクに255.255.255.0を入力後、適用を入力します。
5.18 ターミナルから、SSH コマンドで接続します
ssh -X root@192.168.7.2
なお次のWirningメッセージが出るときは、一度、公開鍵を消す必要がありますので、次のコマンドで、削除してください。
ssh-keygen -f $HOME/.ssh/known_hosts -R 192.168.7.2
その後、SSHの接続を行ってください。途中で、yesを入力する必要があります。
$ssh -X root@192.168.7.2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:3m+N700rnmEMvNtDtkqIuJrpjceFVx4SpES7llcwkoE.
Please contact your system administrator.
Add correct host key in /home/tadaaki/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/tadaaki/.ssh/known_hosts:6
remove with:
ssh-keygen -f "/home/tadaaki/.ssh/known_hosts" -R "192.168.7.2"
RSA host key for 192.168.7.2 has changed and you have requested strict checking.
Host key verification failed.
$ ssh-keygen -f $HOME/.ssh/known_hosts -R 192.168.7.2
###6.パソコンから、Ultra96v2にファイルを転送する。
WindowsとUbuntuでは別れます。
######Windowsの場合
6.1 フォルダーの上の矢印のところから、ファイルをアップロードします。
6.2 ファイルは次のものを選択して、送ってください。
vitis-ai_v1.2_dnndk.tar.gz
vitis-ai_v1.2_dnndk_sample_img.tar.gz
vitis_ai_dnndk_samples_u96v2.zip
これで、自動的にUltra96v2にファイルが送られます。
Windowsの方は、7章までと飛ばします。
######Ubuntuの場合
6.3Ubuntuの場合はコマンドでファイル転送を行います。Ubuntu上のターミナルからSCPコマンドを使います。
$ scp vitis-ai_v1.2_dnndk.tar.gz vitis-ai_v1.2_dnndk_sample_img.tar.gz vitis_ai_dnndk_samples_u96v2.zip root@192.168.7.2:~
6.4パスワードを聞いてきますので、root と入力してください。
ファイル転送が終わります。
###7.Ultra96V2をAIが動くようにの準備をする。
7.1 ここからは Ultra 96v2での操作になります。 Windows ではMobaXterm から Ubuntu では SSH ターミナルから操作を行います。
root@u96v2:~# tar xzf vitis-ai_v1.2_dnndk.tar.gz
root@u96v2:~# tar xzf vitis-ai_v1.2_dnndk_sample_img.tar.gz
root@u96v2:~# unzip vitis_ai_dnndk_samples_u96v2.zip
7.1 AI のライブラリやツールをインストールします。vitis-ai_v1.2_dnndk ディレクトリーに入りまして、インストールコマンドを実行します。
cd vitis-ai_v1.2_dnndk
./install.sh
root@u96v2:~# cd vitis-ai_v1.2_dnndk/
root@u96v2:~/vitis-ai_v1.2_dnndk# ./install.sh
Usage 1: ./install (install on the target board)
Usage 2: ./install [sysroot_dir] (install to the sysroot of cross compiler)
Start installing Vitis AI DNNDK on the target board ...
Processing ./pkgs/python/Edge_Vitis_AI-1.2-py2.py3-none-any.whl
Installing collected packages: Edge-Vitis-AI
Successfully installed Edge-Vitis-AI-1.2
Complete installation successfully.
root@u96v2:~/vitis-ai_v1.2_dnndk#
###8.用意したプログラムをビルドする。
8.1.Ultra 96v2ではセルフコンパイルができるようになっています。
8.2.まずディレクトリーを移動します
cd ~/vitis_ai_dnndk_samples/
cd resnet50
8.3.その後ビルドコマンドでコンパイルがスタートします。
./build.sh u96v2
root@u96v2:~/vitis-ai_v1.2_dnndk# cd ~/vitis_ai_dnndk_samples/
root@u96v2:~/vitis_ai_dnndk_samples# cd resnet50
root@u96v2:~/vitis_ai_dnndk_samples/resnet50# ./build.sh u96v2
copy u96v2 model file...
build model...
mkdir -p /home/root/vitis_ai_dnndk_samples/resnet50/build
g++ -c -O2 -Wall -Wpointer-arith -std=c++11 -ffast-math -I../common/ -mcpu=cortex-a53 /home/root/vitis_ai_dnndk_samples/resnet50/src/main.cc -o /home/root/vitis_ai_dnndk_samples/resnet50/build/main.o
g++ -c -O2 -Wall -Wpointer-arith -std=c++11 -ffast-math -I../common/ -mcpu=cortex-a53 /home/root/vitis_ai_dnndk_samples/common/dputils.cpp -o /home/root/vitis_ai_dnndk_samples/resnet50/build/dputils.o
g++ -O2 -Wall -Wpointer-arith -std=c++11 -ffast-math -I../common/ -mcpu=cortex-a53 /home/root/vitis_ai_dnndk_samples/resnet50/build/main.o /home/root/vitis_ai_dnndk_samples/resnet50/build/dputils.o /home/root/vitis_ai_dnndk_samples/resnet50/model/dpu_resnet50_0.elf -o resnet50 -ln2cube -lhineon -lopencv_videoio -lopencv_imgcodecs -lopencv_highgui -lopencv_imgproc -lopencv_core -lpthread
root@u96v2:~/vitis_ai_dnndk_samples/resnet50#
###9.プログラムを動かして、AI動作を確認する。
9.1 プログラムを動かします。
./resnet50
9.2各種、映像が出てくると同時に結果が表示されます。
エラーになる場合。
一度ディスプレイの設定をやり直します。
次のコマンドを打ってから、実行します。
export DISPLAY=:0.0
export DISPLAY=localhost:10.0
###10.電源を切る。
10.1 Ultra96で電源を切るときは、shutdownコマンドを入力します。
shutdown -h now
root@u96v2:~# shutdown -h now
Broadcast message frostem is going down for system halt NOW!
INIT: Sending processes the TERM signal
root@u96v2:~# Stopping haveged:
Stopping Dropbear SSH server: stopped /usr/sbin/dropbear (pid 546)
dropbear.
* Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon [ ok ]
Stopping bluetooth: bluetoothd.
Stopping system message bus: dbus.
Stopping internet superserver: inetd.
stopping mountd: done
stopping nfsd: done
Stopping syslogd/klogd: stopped syslogd (pid 575)
stopped klogd (pid 578)
done
Stopping tcf-agent: OK
Stopping internet superserver: xinetd.
Stopping XServer
xinit: connection to X server lost
waiting for X server to shut down (II) Server terminated successfully (0). Closing log file.
xinit: unexpected signal 15
stopping statd: done
Stopping rpcbind daemon...
done.
Deconfiguring network interfaces... ifdown: interface eth0 not configured
done.
Stopping watchdog daemon...Sending all processes the TERM signal...
logout
Sending all processes the KILL signal...
Unmounting remote filesystems...
Deactivating swap...
Unmounting local filesystems...
[ 9493.857227] reboot: Power down
10.2 Ultra96v2のSDカード横のLEDが赤くなってから、電源をオフにします。
#デモプログラム
今回のデータは、Viti AI ユーザー資料に書いてあるものを、Ultra96v2に変更して、作り直したものをご提供しています。
このページのDNNDKのサンプル(表4)を参考にしていただければと思います。
このサンプルを使うには、それぞれ、コンパイルが必要になります。最初に使う前に、次のコマンドを入力してください。
./build.sh u96v2
サンプルの場所は、~/vitis_ai_dnndk_samples にあります。それぞれ移動して、使用してください。
Ultra96v2での動作確認ができたものと、その時のコマンドを入力しておきます。終了したいときは、キーボードからqを押すと終了します。
サンプル名 | モデル | フレームワーク | 説明 | 実行コマンド |
---|---|---|---|---|
resnet50 | ResNet50 | Caffe | C++ API を使用する画像分類 | ./resnet50` |
resnet50_mt | ResNet50 | Caffe | C++ API を使用するマルチスレッドの画像分類 | ./resnet50 2 |
tf_resnet50 | ResNet50 | TensorFlow | Python API を使用する画像分類 | ./tf_resnet |
mini_resnet_py | Mini-ResNet | TensorFlow | Python API を使用する画像分類 | 現在調整中 |
inception_v1 | Inception-v1 | Caffe | C++ API を使用する画像分類 | ./inception_v1 |
inception_v1_mt | Inception-v1 | Caffe | C++ API を使用するマルチスレッドの画像分類 | ./inception_v1 2 |
inception_v1_mt_py | Inception-v1 | Caffe | Python API を使用するマルチスレッドの画像分類 | python3 inception_v1_mt.py 2 |
mobilenet | MobilNet | Caffe | C++ API を使用する画像分類 | ./mobilenet |
mobilenet_mt | MobileNet | Caffe | C++ API を使用するマルチスレッドの画像分類 | ./mobilenet 2 |
face_detection | DenseBox | Caffe | C++ API を使用する顔検知 USBカメラ使用 | ./face_detection |
pose_detection | SSD、姿勢検出 | Caffe | C++ API を使用する姿勢検出 | ./pose_detection video/pose.webm |
video_analysis | SSD | Caffe | C++ API を使用するトラフィック検知 | ./video_analysis video/structure.webm |
adas_detection | YOLO-v3 | Caffe | C++ API を使用する ADAS 検知 | ./adas_detection video/adas.webm |
segmentation | FPN | Caffe | C++ API を使用するセマンティックセグメンテーション | ./segmentation video/traffic.webm |
split_io | SSD | TensorFlow | C++ API でプログラミングされた DPU スプリット IO メモリ モデル | 現在確認中 |
debugging | Inception-v1 | TensorFlow | C++ API を使用する DPU デバッグ | 実施していません |
tf_yolov3_voc_py | YOLO-v3 | TensorFlow | Python API を使用する物体検出 | python3 tf_yolo3_voc.py |
アプリケーションは全て、ソースコードがついています。自由に変更して、試してみたください。
なお、映像ファイルは、今の所、Webm形式のファイルしか、受け付けません。
実際の行った、Video_analysisの例を示します。
#参考資料
Visit AI Github https://github.com/Xilinx/Vitis-AI