アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

PetaLinux上からultra96v2ボードでYolov3の物体検出【FPGA, hardware, AI】

前の記事「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.jpegf:id:trafalbad:20200413114840j:plain


test2.jpegf:id:trafalbad:20200413114915j:plain

これで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秒

予測結果画像f:id:trafalbad:20200413115150j:plain






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%

予測結果画像f:id:trafalbad:20200413115320j:plain

推論にかかった処理時間(予測時間)は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秒)
かなり高速

予測結果画像f:id:trafalbad:20200413115547j:plain

結果は本家Yolov3と比べてあまり良くないけど、簡単な画像なら十分な気がする。


ちなみにターミナル上での可視化は下コマンドで。

$ sudo apt install imagemagick
$ display predictions.jpg

f:id:trafalbad:20200413120009p:plain




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=0LDFLAGS= -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の処理性能の可視化f:id:trafalbad:20200413123603p:plain


Yolov3のtest2.jpegの処理性能の可視化f:id:trafalbad:20200413124300p:plain


Yolov3のNN以外のCPUの処理性能部分で高速化できる要素は、「gemm_nn」の部分。
ここがCPU部分の処理性能の90%以上を占めてるので、vivadoで高速化できる。




Tiny-Yolov3のtest1.jpegの処理性能の可視化f:id:trafalbad:20200413123746p:plain





今回はultra96v2でyolov3の物体検出をしてみた。
PetaLinuxの環境構築をしておけば、linux(PetaLinux)上から簡単にultra96v2を動かせるので便利。

今度は、USBカメラにつけてもっと実用的に動かしてみる。



参考サイト



Ultra96 PYNQ Darknet Google-Colabo

System-on-Chip (SoC) Design

gprof2dotのgithub