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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/ebb74f0a-cff8-bd49-f01b-831e0f898777.jpeg)

## ChainerでVGG16を使って推論

詳細は[Jetson NanoでVGG16を試す](https://qiita.com/yamamo-to/items/d66845a1cd561bebaf86)を参照。

```
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モデルによる画像判別](https://qiita.com/yamamo-to/items/02bf9b066891cd5831df)を参照。

```bash:ターミナル
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 CC[^1] >= 3.0 | 5.3 |
| on Linux GCC or Clang, on Windows MSVC 2015/2017/2019 | gcc |

[^1]: CCはCコンパイラではなくCompute Capabilityの略

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

```bash:ターミナル
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を取ると以下のよう。

```bash:ターミナル
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]
```

```bash:ターミナル
yamamo-to@jetson-nano:~/Documents/darknet$ make
```

あとは待つだけ。

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

```bash:ターミナル
yamamo-to@jetson-nano:~/Documents/darknet$ wget https://pjreddie.com/media/files/yolov3.weights
```

# Darknet + YOLOv3 の結果

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

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

結果は・・・

![predictions_boss.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/b6ab366e-a40b-4f99-cedb-5573e3a39b2a.jpeg)

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

# 参考文献
- https://github.com/AlexeyAB/darknet
- http://takesan.hatenablog.com/entry/2019/04/09/001852
- https://toramamma.blogspot.com/2019/04/jetson-nano-darknet.html