Edited at

Jetson NanoでDarknet+YOLOv3


はじめに

VGG16をChainerとTensorRTで実験したところ、用意した画像はそれぞれ「障子」と「ラケット」と推定された。もちろんこれは間違っていた。そこで今度はDarknetを試して同じ画像がどのように判定されるか確認する。


おさらい

これまでの作業結果はgithubにまとめた。フルスクラッチからpipenvを使って動くところまで確認している。また上位1件の表示だったランキングは上位10件まで表示するようにした。

https://github.com/yamamo-to/jetson_nano/tree/master/vgg16_example

問題:下記の画像は何ですか?

boss.jpg


ChainerでVGG16を使って推論

詳細はJetson NanoでVGG16を試すを参照。

yamamo-to@jetson-nano:~/Documents/jetson_nano/vgg16_example$ pipenv run python3 vgg16_test.py boss.jpg 

0.23183 789 n04201297 shoji
0.10520 910 n04597913 wooden spoon
0.04276 915 n04613696 yurt
0.03409 752 n04039381 racket, racquet
0.02754 440 n02823428 beer bottle
0.02448 746 n04019541 puck, hockey puck
0.02100 666 n03786901 mortar
0.02028 901 n04579145 whiskey jug
0.01489 722 n03942813 ping-pong ball
0.01293 737 n03983396 pop bottle, soda bottle

1位は障子で、2位は木のスプーンと出た。


TensorRTでVGG16を使って推論。

詳細はJetson NanoでTensorRTを使用したVGG16モデルによる画像判別を参照。


ターミナル

yamamo-to@jetson-nano:~/Documents/jetson_nano/vgg16_example$ pipenv run python3 trt_infer.py vgg16.trt boss.jpg 

[TensorRT] INFO: Glob Size is 587064608 bytes.
[TensorRT] INFO: Added linear block of size 12902400
[TensorRT] INFO: Added linear block of size 12845056
[TensorRT] INFO: Added linear block of size 1605632
[TensorRT] INFO: Deserialize required 3732959 microseconds.
0.12717 752 n04039381 racket, racquet
0.04638 440 n02823428 beer bottle
0.03672 898 n04557648 water bottle
0.03265 882 n04517823 vacuum, vacuum cleaner
0.02877 650 n03759954 microphone, mike
0.02658 907 n04591713 wine bottle
0.02322 619 n03637318 lampshade, lamp shade
0.01998 402 n02676566 acoustic guitar
0.01862 804 n04254120 soap dispenser
0.01577 512 n03109150 corkscrew, bottle screw

結果、1位はラケット、2位はビールのボトルと推論された。


Darknetの準備

https://github.com/AlexeyAB/darknet

を読むと要求条件は満たしているようだ。

要求
Jetson Nano (JetPack 4.2)

Windows or Linux
Linux (Ubuntu)

CMake >= 3.8 for modern CUDA support
3.10.2

CUDA 10.0
10.0.166

OpenCV >= 2.4
3.3.1

cuDNN >= 7.0 for CUDA 10.0
7.3.1.28

GPU with CC1 >= 3.0
5.3

on Linux GCC or Clang, on Windows MSVC 2015/2017/2019
gcc

まずはソースコードのダウンロード。


ターミナル

yamamo-to@jetson-nano:~/Documents$ git clone https://github.com/AlexeyAB/darknet.git

yamamo-to@jetson-nano:~/Documents$ cd darknet
yamamo-to@jetson-nano:~/Documents/darknet$

コンパイルは Makefile を直接編集した後、makeする。


  • GPU,CUDNN,OPENCV,LIBSOを1に変更

  • Tegra X1 (Jetson NanoのGPU)を探してコメントを取り有効化

diffを取ると以下のよう。


ターミナル

yamamo-to@jetson-nano:~/Documents/darknet$ git diff

diff --git a/Makefile b/Makefile
index 7f0547d..5b32de9 100644
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,10 @@
-GPU=0
-CUDNN=0
+GPU=1
+CUDNN=1
CUDNN_HALF=0
-OPENCV=0
+OPENCV=1
AVX=0
OPENMP=0
-LIBSO=0
+LIBSO=1
ZED_CAMERA=0

# set GPU=1 and CUDNN=1 to speedup on GPU
@@ -37,7 +37,7 @@ OS := $(shell uname)
# ARCH= -gencode arch=compute_60,code=sm_60

# For Jetson TX1, Tegra X1, DRIVE CX, DRIVE PX - uncomment:
-# ARCH= -gencode arch=compute_53,code=[sm_53,compute_53]
+ARCH= -gencode arch=compute_53,code=[sm_53,compute_53]

# For Jetson Tx2 or Drive-PX2 uncomment:
# ARCH= -gencode arch=compute_62,code=[sm_62,compute_62]



ターミナル

yamamo-to@jetson-nano:~/Documents/darknet$ make


あとは待つだけ。

またYOLOv3の重みを落としておく。


ターミナル

yamamo-to@jetson-nano:~/Documents/darknet$ wget https://pjreddie.com/media/files/yolov3.weights



Darknet + YOLOv3 の結果

先ほどの画像boss.jpgをdataディレクトリの中に入れた上で推論する。

yamamo-to@jetson-nano:~/Documents/darknet$ ./darknet detect cfg/yolov3.cfg YOLOv3.weights data/boss.jpg

結果は・・・

predictions_boss.jpg

おぉ、見事にボトルと出た。YOLOv3すごい!


参考文献





  1. CCはCコンパイラではなくCompute Capabilityの略