前の記事「Vitis,Petalinuxのインストールから、Vivadoの起動まで【FPGA】-VitisPlatform作りpart2」でVivado, vitis, Petalinuxの環境構築をした。
PetaLinuxの環境構築をしておくことで、linux(PetaLinux)上から直接、ultra96ボードにアクセスできるらしい。
少なくともVivado, vitis, Petalinuxの環境構築さえしてしまえば、PetaLinuxを通して、直接ultra96を動かして性能を確かめられる。
今回は物体検出で有名なyolov3とtiny-yolov3をPetaLinux上で動かし、ultra96v2の性能を試してみた。
目次
1.Yolov3の準備
2.使う画像
3.ultra96v2でYolov3の性能検証
4.ultra96v2でTiny-Yolov3の性能検証
5.gprofでYolov3の処理性能可視化
1.Yolov3の準備
簡単にコマンド操作で完了。# darknetをgit clone $ git clone https://github.com/pjreddie/darknet # Yolov3の動作環境構築 $ cd darknet; make # 学習済みyolov3の重みをdownload $ cd darknet $ wget https://pjreddie.com/media/files/yolov3.weights
これでyolov3の動作環境ができた。PetaLinuxの環境構築をしておけば簡単。
2.使う画像
拾ってきたこの画像。test1.jpeg
test2.jpeg
これでyolov3とtiny-yolov3の性能を比較してく。
3.ultra96v2でYolov3の性能検証
test1.jpegでトライ
# yolov3で物体検出 $ cd darknet $ ./darknet detect cfg/yolov3.cfg yolov3.weights /home/[host-name]/test1..jpeg >>> ../test1.jpeg: Predicted in 41.924274 seconds. truck: 79% car: 93% car: 85% car: 83% car: 78% car: 67% person: 100% person: 99%
推論にかかった処理時間(予測時間)は41.924274秒
予測結果画像
test2.jpegでトライ
$ cd darknet $ ./darknet detect cfg/yolov3.cfg yolov3.weights /home/[host-name]/test2..jpeg >>> ../test2.jpeg: Predicted in 37.329435 seconds. backpack: 80% person: 100% person: 100% person: 99% person: 98% person: 93% person: 87%
予測結果画像
推論にかかった処理時間(予測時間)は37.329435秒
かなりいい具合に検出できてる。
ラズパイだとYolov3に213.6秒くらいかかるらしいから、ultra96v2がかなり高速で推論可能なことがわかる。
4.ultra96v2でTiny-Yolov3の性能検証
# 学習済みTiny-Yolov3の重みをdownload $ wget https://pjreddie.com/media/files/yolov3-tiny.weights # test1.jpegで物体検出 $ ./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights /home/[host-name]/test1.jpeg >>> Loading weights from yolov3-tiny.weights...Done! ../test1.jpeg: Predicted in 1.380456 seconds. car: 65% car: 55% person: 94%
処理速度(推論速度)は1.380456 seconds(ほぼ1秒)
かなり高速
予測結果画像
結果は本家Yolov3と比べてあまり良くないけど、簡単な画像なら十分な気がする。
ちなみにターミナル上での可視化は下コマンドで。
$ sudo apt install imagemagick $ display predictions.jpg
5.gprofでYolov3の処理性能可視化
gprofでYolov3のtest1.jpeg, test2.jpeg処理性能を可視化してみる。
gprofでの可視化は「System-on-Chip (SoC) Design」を参考に。
'gprof2dot.py'はgprof2dot.pyの配布サイトから持ってきた。
gprofで可視化するまでの手順
# gprof2dot.pyをダウンロード $ git clone https://github.com/jrfonseca/gprof2dot $ mv gprof2dot/gprof2dot.py gprof2dot.py; chmod 755 gprof2dot.py # yolov3をダウンロード $ git clone https://github.com/pjreddie/darknet $ cd darknet; make
ここでMakeファイルを書き換える。CFLAGSライン全部に "-pg" オプションをつける。
$ sudo vi Makefile >>> # CFLAGSライン全てに -pgをつける GPU=0 CUDNN=0 OPENCV=0 〜 LDFLAGS= -lm -pthread COMMON= -Iinclude/ -Isrc/ CFLAGS=-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -pg ifeq ($(OPENMP), 1) CFLAGS+= -fopenmp -pg endif ifeq ($(DEBUG), 1) OPTS=-O0 -g endif CFLAGS+=$(OPTS) -pg ifeq ($(OPENCV), 1) COMMON+= -DOPENCV CFLAGS+= -DOPENCV -pg LDFLAGS+= `pkg-config --libs opencv` -lstdc++ COMMON+= `pkg-config --cflags opencv` endif ifeq ($(GPU), 1) COMMON+= -DGPU -I/usr/local/cuda/include/ CFLAGS+= -DGPU -pg LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand endif ifeq ($(CUDNN), 1) COMMON+= -DCUDNN CFLAGS+= -DCUDNN -pg LDFLAGS+= -lcudnn endif 〜〜〜
# 再ビルド $ make clean; make # yolov3を動かして「gmon.out」を出力させる $ ./darknet detect cfg/yolov3.cfg ../yolov3.weights ../street.jpeg >>>> ../street.jpeg: Predicted in 35.500371 second # 確認 $ ls gmon.out predictions.jpg darknet 〜 # 可視化画像(output.png)を作成 $ cp ../gprof2dot.py gprof2dot.py $ gprof ./darknet | ./gprof2dot.py | dot -Tpng -o output.png
Yolov3のtest1.jpegの処理性能の可視化
Yolov3のtest2.jpegの処理性能の可視化
Yolov3のNN以外のCPUの処理性能部分で高速化できる要素は、「gemm_nn」の部分。
ここがCPU部分の処理性能の90%以上を占めてるので、vivadoで高速化できる。
Tiny-Yolov3のtest1.jpegの処理性能の可視化
今回はultra96v2でyolov3の物体検出をしてみた。
PetaLinuxの環境構築をしておけば、linux(PetaLinux)上から簡単にultra96v2を動かせるので便利。
今度は、USBカメラにつけてもっと実用的に動かしてみる。
参考サイト
・Ultra96 PYNQ Darknet Google-Colabo