Vitis AI Libraryを使ったアプリケーションを作って性能比較

コードとか。→ https://github.com/nv-h/Vitis_AI_Library_apps
2020/7/5 マルチスレッド化したので測定したfpsを追記。Xilinxのdemo.hppには追い付かないが、ポータブルにできた気がする。

# Vitis AI Library Applications

Vitis AI Libraryを使用したアプリケーションを作成、動作確認する。
ハードウェア環境の構築などは以下を参照。

* [DNNDK on Vitis AI on Ultra96v2](https://qiita.com/nv-h/items/7525c9319087a3f51755)
* [Vitis AI Library on Ultra96v2](https://qiita.com/nv-h/items/8f3b05e4e47928718992)

# Usage

Xilinxが用意しているデモ

```sh
video_demo_app <model_name> <video_num> [-t <thread_num>]
```

シングルスレッド

```sh
video_single_th_app <model_name> <video_num>
```

* `model_name` : 使用できるモデルは、`/usr/share/vitis_ai_library/models`にあるものだけと思われる。現状、以下に対応。  
    + Yolo v2: `yolov2_voc` `yolov2_voc_pruned_0_66` `yolov2_voc_pruned_0_71` `yolov2_voc_pruned_0_77`
    + Yolo v3: `yolov3_adas_pruned_0_9` `yolov3_bdd` `yolov3_voc` `yolov3_voc_tf`
    + SSD Caffe:`ssd_adas_pruned_0_95` `ssd_mobilenet_v2` `ssd_pedestrain_pruned_0_97` `ssd_traffic_pruned_0_9`
    + SSD Tensorflow:`ssd_mobilenet_v1_coco_tf` `ssd_mobilenet_v2_coco_tf` `ssd_resnet_50_fpn_coco_tf`
* `video_num` : Integer (X of `/dev/videoX`)
* `thread_num` : Xilinxが用意しているデモライブラリでのスレッド指定。DPUとのデータのやり取りが高速になる。

動作イメージ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Vitis AI Libraryを使ったYolo v2/v3, SSD Caffe/Tensorflowのアプリケーションできた。 <a href="https://t.co/MM1na64Yfj">pic.twitter.com/MM1na64Yfj</a></p>&mdash; nv-h (@saido_nv) <a href="https://twitter.com/saido_nv/status/1279340163169087488?ref_src=twsrc%5Etfw">July 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# Performance (fps) on ultra96v2 @ 640*360

Using USB Web Camera C615 (X forwarding).
fpsは小数点以下切り捨てで測定した。同一条件でもけっこうばらつきがあると思われる。


## video_demo_app using `vitis::ai::main_for_video_demo()`

ultra96v2ではDPUが一つしか実装できないのでDPUで律速になるような、重いモデルではマルチスレッドがほとんど効果がない。
スレッド構成は以下のようになっていて、DPUスレッドの数を引数で変更できるようになっている。

```
capture thread ---> DPU Threads(-t N) ---> imshow thread
```

|            model             | -t 1 | -t 2 | -t 4 |
|------------------------------|------|------|------|
| `yolov2_voc`                 |    8 |    9 |    9 |
| `yolov2_voc_pruned_0_66`     |   21 |   23 |   24 |
| `yolov2_voc_pruned_0_71`     |   24 |   26 |   28 |
| `yolov2_voc_pruned_0_77`     |   27 |   28 |   29 |
| `yolov3_adas_pruned_0_9`     |   11 |   11 |   12 |
| `yolov3_bdd`                 |    4 |    5 |    5 |
| `yolov3_voc`                 |    5 |    5 |    5 |
| `yolov3_voc_tf`              |    5 |    5 |    5 |
| `ssd_adas_pruned_0_95`       |   29 |   29 |   30 |
| `ssd_mobilenet_v2`           |   10 |   10 |   10 |
| `ssd_pedestrain_pruned_0_97` |   30 |   30 |   30 |
| `ssd_traffic_pruned_0_9`     |   20 |   27 |   27 |
| `ssd_mobilenet_v1_coco_tf`   |   21 |   21 |   22 |
| `ssd_mobilenet_v2_coco_tf`   |   20 |   21 |   22 |
| `ssd_resnet_50_fpn_coco_tf`  |    0 |    0 |    1 |

## video_single_th_app / video_multi_th_app

single_thはシリアル処理。

```
capture, DPU, imshow (serial processing)
```

multi_thは下記のようなマルチスレッド処理。

```
capture thread ---> DPU Thread ---> imshow thread
```

|            model             | single thread | multi threads |
|------------------------------|---------------|---------------|
| `yolov2_voc`                 |             5 |             8 |
| `yolov2_voc_pruned_0_66`     |             9 |            19 |
| `yolov2_voc_pruned_0_71`     |             9 |            23 |
| `yolov2_voc_pruned_0_77`     |             9 |            26 |
| `yolov3_adas_pruned_0_9`     |            10 |            11 |
| `yolov3_bdd`                 |             3 |             4 |
| `yolov3_voc`                 |             3 |             5 |
| `yolov3_voc_tf`              |             3 |             5 |
| `ssd_adas_pruned_0_95`       |            12 |            27 |
| `ssd_mobilenet_v2`           |             7 |            10 |
| `ssd_pedestrain_pruned_0_97` |            13 |            29 |
| `ssd_traffic_pruned_0_9`     |            10 |            20 |
| `ssd_mobilenet_v1_coco_tf`   |            12 |            19 |
| `ssd_mobilenet_v2_coco_tf`   |            11 |            20 |
| `ssd_resnet_50_fpn_coco_tf`  |             0 |             0 |

# Demo pictures

yolov3_voc
![yolov3_voc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139130/ff02328d-f352-5c04-e54a-358da57ab669.png)


yolov2_voc
![yolov2_voc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139130/729c7777-0d6a-d0ce-4ee8-0cf610e18989.png)


ssd_mobilenet_v2
![ssd_mobilenet_v2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139130/804c7c7c-8c9d-6180-0f75-cfe6c7624297.png)


ssd_mobilenet_v2_coco_tf
![ssd_mobilenet_v2_coco_tf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139130/54deada9-9cab-15f0-b105-de8d0423cc35.png)