コードとか。→ https://github.com/nv-h/Vitis_AI_Library_apps
2020/7/5 マルチスレッド化したので測定したfpsを追記。Xilinxのdemo.hppには追い付かないが、ポータブルにできた気がする。
Vitis AI Library Applications
Vitis AI Libraryを使用したアプリケーションを作成、動作確認する。
ハードウェア環境の構築などは以下を参照。
Usage
Xilinxが用意しているデモ
video_demo_app <model_name> <video_num> [-t <thread_num>]
シングルスレッド
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
- Yolo v2:
-
video_num
: Integer (X of/dev/videoX
) -
thread_num
: Xilinxが用意しているデモライブラリでのスレッド指定。DPUとのデータのやり取りが高速になる。
動作イメージ
Vitis AI Libraryを使ったYolo v2/v3, SSD Caffe/Tensorflowのアプリケーションできた。 pic.twitter.com/MM1na64Yfj
— nv-h (@saido_nv) July 4, 2020
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 |