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

#Ultra96v2向けVitis AI のデモ（SDカードイメージ）2020.1版
XILINX社のVitis AIは、FPGAで、AIができるとあって、注目を集めています。

ただ、資料をみても、どうやって動かせばいいのかが、わからないことも多いです。
今回は、Ultra96V2で、AIを動かすためのデータを用意しました。
FPGAでAIが動くことが、確認できたら幸いです。

# 目標
Ultra96v2を使って、AIが動作できることを確認する。
[Vitis AI Github mpsoc](https://github.com/Xilinx/Vitis-AI/tree/v1.2.1/mpsoc)の内容をUltra96V2で動くようにしたものです。


#必要なもの

[はじめてのUltra96  AI EDGEに挑戦編。(シリーズ紹介）の必要な環境](https://qiita.com/basaro_k/items/f07302657273edb084da#%E5%BF%85%E8%A6%81%E3%81%AA%E7%92%B0%E5%A2%83) を参照してください。


Ultra96V2が必要です。
今回は開発ツールは使いません。
確認用にUSB3.0がついたWindows10または、Ubuntu18.04LTSが搭載したパソコンが必要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/3d287c2a-d645-7aae-9083-e4c0801e7c0a.png)

####ハードウェア

* [Ultra96V2](https://www.avnet.com/shop/japan/products/avnet-engineering-services/aes-ultra96-v2-g-3074457345644050668/ "Ultra96V2")
* [USB-JTAG/UART pod](https://www.avnet.com/shop/japan/products/avnet-engineering-services/aes-acc-u96-jtag-3074457345636446168/ "USB JTAG/UART pod")
* USBケーブル [TypeA-microTypeB USB2.0](https://www.elecom.co.jp/products/U2C-AMB015BK.html "USB2.0 microTypeB")
* USBケーブル [TypeA-microTypeB USB3.0](https://www.elecom.co.jp/products/DH-AMB3N05BK.html "USB3.0 microTypeB")
* [USBカメラ](https://www.logicool.co.jp/ja-jp/product/hd-webcam-c270n "Logicool C270")
* [電源１２V２A以上](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5AW4 "12V2A power supply")
* [電源変換ケーブル](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=2AD6-DEK3　"cable change")



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

####Windows10の場合

*  [MobaXterm](https://mobaxterm.mobatek.net/ "MobaXterm") 多機能Xターミナル
*  [TeraTerm](https://ja.osdn.net/projects/ttssh2/ "TeraTerm")　ターミナルソフト
* [Etcher](https://www.balena.io/etcher/ "balena Etcher") SDカードイメージを書き込む

####Ubuntu 18.04 LTSの場合

* [Etcher](https://www.balena.io/etcher/ "balena Etcher") SDカードイメージを書き込む あれば便利


#手順
ここでは、次のことを行っていきます。

[1.SDカードイメージ、設定ファイルをダウンロードする。](https://qiita.com/basaro_k/items/06080c68e4450e074761#1sd%E3%82%AB%E3%83%BC%E3%83%89%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B)
[2.SDカードイメージを書き込む。](https://qiita.com/basaro_k/items/06080c68e4450e074761#2sd%E3%82%AB%E3%83%BC%E3%83%89%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80)
[3.Ultra96V2に電源を入れる。](https://qiita.com/basaro_k/items/06080c68e4450e074761#3ultra96v2%E3%81%AB%E9%9B%BB%E6%BA%90%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B)
[4.Ultra96V2に使えるSDカードの容量を増やす。](https://qiita.com/basaro_k/items/06080c68e4450e074761#4ultra96v2%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8Bsd%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AE%E5%AE%B9%E9%87%8F%E3%82%92%E5%A2%97%E3%82%84%E3%81%99)
[5.Ultra96v2とパソコンを接続させる（SSH接続）](https://qiita.com/basaro_k/items/06080c68e4450e074761#5ultra96v2%E3%81%A8%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%82%92%E6%8E%A5%E7%B6%9A%E3%81%95%E3%81%9B%E3%82%8Bssh%E6%8E%A5%E7%B6%9A)
[6.パソコンから、Ultra96v2にファイルを転送する。](https://qiita.com/basaro_k/items/06080c68e4450e074761#6%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%81%8B%E3%82%89ultra96v2%E3%81%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B)
[7.Ultra96V2をAIが動くようにの準備をする。](https://qiita.com/basaro_k/items/06080c68e4450e074761#7ultra96v2%E3%82%92ai%E3%81%8C%E5%8B%95%E3%81%8F%E3%82%88%E3%81%86%E3%81%AB%E3%81%AE%E6%BA%96%E5%82%99%E3%82%92%E3%81%99%E3%82%8B)
[8.用意したプログラムをビルドする。](https://qiita.com/basaro_k/items/06080c68e4450e074761#8%E7%94%A8%E6%84%8F%E3%81%97%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B)
[9.プログラムを動かして、AI動作を確認する。](https://qiita.com/basaro_k/items/06080c68e4450e074761#9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6ai%E5%8B%95%E4%BD%9C%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B)
[10.電源を切る。](https://qiita.com/basaro_k/items/06080c68e4450e074761#10%E9%9B%BB%E6%BA%90%E3%82%92%E5%88%87%E3%82%8B)

#実際の操作
### 1.SDカードイメージ、設定ファイルをダウンロードする。
1.1. Ultra96v2を動かすため、いくつかファイルが必要です。
パソコンにダウンロードしてください。

| ファイル名 |サイズ| 内容 |
|:-:|:-:|:-:|
|  [sd_card.img.zip](https://www.fpga.co.jp/u96v2_vitisai_2020.1/sd_card.img.zip) |324Mバイト| Ultra96v2向けSDカードイメージ|
|  [vitis-ai_v1.2_dnndk.tar.gz](https://www.fpga.co.jp/u96v2_vitisai_2020.1/vitis-ai_v1.2_dnndk.tar.gz) |  296Kバイト  |AI向けライブラリー、ツール環境|
|  [vitis-ai_v1.2_dnndk_sample_img.tar.gz](https://www.fpga.co.jp//u96v2_vitisai_2020.1/vitis-ai_v1.2_dnndk_sample_img.tar.gz) |  172Mバイト | AIテスト用画像 |
|   [vitis_ai_dnndk_samples_u96v2.zip](https://www.fpga.co.jp//u96v2_vitisai_2020.1/vitis_ai_dnndk_samples_u96v2.zip)| 475Mバイト  |Ultra96V2のAIプログラム| 
各、ファイル名のリンクをクリックするとダウンロードできます。

###2.SDカードイメージを書き込む。
2.1 SDカードイメージをSDカードに書き込みます。ダウンロードした SD カードイメージ[sd_card.img.zip](https://fpga.co.jp/u96v2_vitisai_2020.1/sd_card.img.zip)をEtcherを使って書き込みます。 Linux の方はコマンド dd コマンドでも大丈夫です。
2.2 Etcherはここからからダウンロードできます。ダウンロード後インストールしてください。
https://www.balena.io/etcher/
2.3 インストール後、次のアイコンで起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/b005e84e-230f-a603-238a-edfb065912c6.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c5c1cd7b-736f-afd7-d111-54106e918c6a.png)

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

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

```linux: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/fba88037-625e-f675-6493-4a10478a8caa.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c9698beb-ce15-b1e7-e134-8f2e7440f0a6.png)

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

```ubuntu:gtketerm
$ sudo gtkterm --port /dev/ttyUSB1 --speed 115200 
```

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/937f9e29-6ef8-28c0-3627-cce0a8196c32.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`

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

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

```Ultra96v2: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/28966855-cbaa-6832-0d00-9f72446f6d0b.png)
5.6 細かい設定を行います。プロパティーをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/13dd2955-c095-8482-20ac-d839e12dd486.png)
5.7インターネットプロトコルバージョン４（TCP/IP4)を選択してから、プロパティーをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/e10f092b-d89d-0039-b945-cc1cd8c608be.png)

5.8 IPアドレスの設定をします。次のIPアドレスを使うをクリックします。その後IPアドレスを192.168.7.10に設定します。サブネットマスクは255.255.255.0で行います。設定が終わりましたら、OKをクリックして、設定を完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/75cfca37-56b2-eb37-e9b3-d631efc462d0.png)
5.9 設定が終わりましたので、いらないウインドウは閉じてください。

5.10.SSHターミナルを立ち上げます。MobaXterm を立ち上げます。このアプリ Windows で X ターミナルとして使用できます。SSHターミナルとして動作して、ファイルの転送と、画面の共有などができます。インストールをするには次のところをからクリックしてダウンロードしてインストールしてください
[MobaXterm](https://mobaxterm.mobatek.net/ "MobaXterm")
5.11.このアイコンでMobaXtermが立ち上がります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/76f516f1-9622-0ab0-8905-b8ce1b1cba4d.png)
5.12.MobaXtermがたちあがりましたら、Xウィンドウで画像が使えるように設定します。メニューから[Settings]→[Configuration]をクリックします。その後 x11のタブを押してください。X11 remote access を full にした後、OK を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/670d55c3-871a-c4f8-dd6b-35a2daa726ac.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/8fc66d86-87ab-cb9c-3ea6-5f68d492cf6e.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/18249d7b-1bc8-af28-8d79-c187d89ab61e.png)

5.15 MobaXtermで、Ultara96v2が接続されます。もし、パスワードを聞いてきたときは、root と入力してください。Linuxコマンドを入力してお試ししても。大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/862637db-6658-2350-d196-af18d07fbc98.png)

　Windowsの方は、[次の6章](https://qiita.com/drafts/06080c68e4450e074761#6%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%81%8B%E3%82%89ultra96v2%E3%81%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B)まで進んでください。

######Ubuntuの場合

5.16.Ubuntuの場合も、IP アドレスを固定します。設定画面から、ネットワークを選んでください。USB Ethernetが見えますので、設定のアイコンをクリックしてください。
![Screenshot from 2020-11-04 17-23-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/192f3e03-786e-96e7-c25a-f5d85e8bef79.png)
5.17　IPアドレスを固定します。IPｖ４のタブを開いてます。手動にチェックを入れた後、アドレスに192.168.7.3 ネットワークマスクに255.255.255.0を入力後、適用を入力します。
![Screenshot from 2020-11-04 17-26-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/93e245e8-a365-36a6-542c-61f7775e8db3.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を入力する必要があります。

```ubuntu: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/eb110e29-e8c2-c243-6d70-004312baf472.png)
6.2 ファイルは次のものを選択して、送ってください。
[vitis-ai_v1.2_dnndk.tar.gz](https://www.fpga.co.jp/u96v2_vitisai_2020.1/vitis-ai_v1.2_dnndk.tar.gz) 
[vitis-ai_v1.2_dnndk_sample_img.tar.gz](https://www.fpga.co.jp//u96v2_vitisai_2020.1/vitis-ai_v1.2_dnndk_sample_img.tar.gz)
 [vitis_ai_dnndk_samples_u96v2.zip](https://www.fpga.co.jp//u96v2_vitisai_2020.1/vitis_ai_dnndk_samples_u96v2.zip)
これで、自動的にUltra96v2にファイルが送られます。

Windowsの方は、7章までと飛ばします。
######Ubuntuの場合
6.3Ubuntuの場合はコマンドでファイル転送を行います。Ubuntu上のターミナルからSCPコマンドを使います。

```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 ターミナルから操作を行います。

```ultra96v2: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`

```ultra96v2: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`

```ultra96v2: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/ed8b5550-a658-d1ee-25f6-13ad67e94688.png)

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

`export DISPLAY=:0.0`
`export DISPLAY=localhost:10.0`

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

```ultra96v2: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 ユーザー資料](https://japan.xilinx.com/html_docs/vitis_ai/1_2/runningexamples.html#ump1570690283280)に書いてあるものを、Ultra96v2に変更して、作り直したものをご提供しています。
このページのDNNDKのサンプル(表4）を参考にしていただければと思います。
このサンプルを使うには、それぞれ、コンパイルが必要になります。最初に使う前に、次のコマンドを入力してください。
`./build.sh u96v2`
サンプルの場所は、~/vitis_ai_dnndk_samples　にあります。それぞれ移動して、使用してください。

Ultra96v2での動作確認ができたものと、その時のコマンドを入力しておきます。終了したいときは、キーボードからｑを押すと終了します。

| サンプル名 | モデル | フレームワーク |説明|実行コマンド|
|:----------:|:-----------:|:------------:|:------------:|:-------------|
|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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/9e276560-7bc3-c109-1c88-a49041782c67.png)

segmentationはこの通り実施してます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/62ee5b91-3c67-540b-b0f2-0ba0d874629f.png)

#参考資料
Visit AI Github https://github.com/Xilinx/Vitis-AI