LoginSignup
7
5

More than 3 years have passed since last update.

Ultra96v2向けVitis AI のデモ(SDカードイメージ)2020.1版

Last updated at Posted at 2020-11-04

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が搭載したパソコンが必要になります。

image.png

ハードウェア

使用するパソコンはWindows10とUbuntu18.04LTSでのご紹介になります。以下のツール(無料ツール)を使うことを前提に話を進めていきます。

Windows10の場合

  • MobaXterm 多機能Xターミナル
  • TeraTerm ターミナルソフト
  • Etcher SDカードイメージを書き込む

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 インストール後、次のアイコンで起動します。
image.png

2.3 Windows でも Linux でも使えます。使い方は簡単で、ファイルを選択し、SDカードを入れて、フラッシュボタンことによって、書き込みが始まります。数分待つと書き込みが終了します。次にEthcerの画面を示します。

image.png

2.4 Ethcer が起動しましたら、[Flash from file]ボタンを押して、
ファイルを選択します。今回の場合はsd_card.img.zip です。Zipファイルのままで大丈夫です。その後 SD カードを挿入します SD カードが正しいことを確認したら、[Flash!]ボタンを押します。SD カードに書き込みが始まります。image.png
2.5 なお、Winodwsの場合「このアプリがデバイスに変更を加えることを許可しますか?」と出ますが、そのまま、はい、を押してください。Linuxの場合はパスワードを聞いてきます。
2.6 SD カードが書き終わりましたら取り出します。これがそのまま Ultra 96v2に動作します。Windowsの場合、途中で、フォルダーが認識したり、「ドライブX:を使うにはフォーマットする必要があります。」、と出たりしますが、無視してください。Ultra96V2向けのLinuxフォーマットのためWinodwsで読み込めないため出てきます。
その後、SDカードを取り出します。

Ubuntu で、ddコマンドを使う方。

2.7 Ubuntu の方はまずは解凍が必要になります。解凍後ddコマンドを使って SD カードイメージをを書き込んでください

dd
$ 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に合わせます。デフォルトでそうなっています。

image.png

3.3 パソコン側でターミナルソフトを立ち上げます。
Windows の方は Teraterm 等のアプリを立ち上げてください。ポートは一番大きい番号にしてください。スピードは115200です。TeraTerm立ち上げ後、メニューから[設定]→[シリアルポート...]で設定できます。

image.png

3.4 Ubuntuの方は、gtkterm 等で実現してください。sudo コマンドを使うのは、USBアクセスにルート権限が必要だからです。

gtketerm
$ sudo gtkterm --port /dev/ttyUSB1 --speed 115200 

3.5 Ultra96v2に電源を入れます。電源は3つある、青いボタンの真ん中を押すと、起動します。

3.6 次の画面が出るまで待ちます。30秒ほどで出てきます。出てきましたらキーボードから、Enter キーを押してください Ultra 96v2通常の Linux でコマンド入力ができるようになります。

image.png

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

画面表示は次のようになります。

parted
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
画面は次のようになります。

g_ether
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..]を見つけて、ダブルクリックします。
image.png
5.6 細かい設定を行います。プロパティーをクリックしてください。
image.png
5.7インターネットプロトコルバージョン4(TCP/IP4)を選択してから、プロパティーをクリックします。
image.png

5.8 IPアドレスの設定をします。次のIPアドレスを使うをクリックします。その後IPアドレスを192.168.7.10に設定します。サブネットマスクは255.255.255.0で行います。設定が終わりましたら、OKをクリックして、設定を完了します。
image.png
5.9 設定が終わりましたので、いらないウインドウは閉じてください。

5.10.SSHターミナルを立ち上げます。MobaXterm を立ち上げます。このアプリ Windows で X ターミナルとして使用できます。SSHターミナルとして動作して、ファイルの転送と、画面の共有などができます。インストールをするには次のところをからクリックしてダウンロードしてインストールしてください
MobaXterm
5.11.このアイコンでMobaXtermが立ち上がります
image.png
5.12.MobaXtermがたちあがりましたら、Xウィンドウで画像が使えるように設定します。メニューから[Settings]→[Configuration]をクリックします。その後 x11のタブを押してください。X11 remote access を full にした後、OK を押します。

image.png

5.13 Ultra96v2 SSH 接続をします。MobaXtermのSessionのアイコンを押します。

image.png

5.14 SSHの接続先情報を入力します。SSHのアイコンを押します。 Remoto host に 192.168.7.2を、Specifly username にrootを入力します。その後、OKです。

image.png

5.15 MobaXtermで、Ultara96v2が接続されます。もし、パスワードを聞いてきたときは、root と入力してください。Linuxコマンドを入力してお試ししても。大丈夫です。
image.png

 Windowsの方は、次の6章まで進んでください。

Ubuntuの場合

5.16.Ubuntuの場合も、IP アドレスを固定します。設定画面から、ネットワークを選んでください。USB Ethernetが見えますので、設定のアイコンをクリックしてください。
Screenshot from 2020-11-04 17-23-03.png
5.17 IPアドレスを固定します。IPv4のタブを開いてます。手動にチェックを入れた後、アドレスに192.168.7.3 ネットワークマスクに255.255.255.0を入力後、適用を入力します。
Screenshot from 2020-11-04 17-26-41.png

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-keygen
$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 フォルダーの上の矢印のところから、ファイルをアップロードします。
image.png
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
$ 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 ターミナルから操作を行います。

tar
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

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

build
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各種、映像が出てくると同時に結果が表示されます。

image.png

エラーになる場合。
一度ディスプレイの設定をやり直します。
次のコマンドを打ってから、実行します。

export DISPLAY=:0.0
export DISPLAY=localhost:10.0

10.電源を切る。

10.1 Ultra96で電源を切るときは、shutdownコマンドを入力します。
shutdown -h now

shutdown
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の例を示します。

image.png

segmentationはこの通り実施してます。
image.png

参考資料

Visit AI Github https://github.com/Xilinx/Vitis-AI

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5