YoloV３をJetsonTX2（Jetpack4.2）で動かして、実行速度を確認する。

# 環境
- JetsonTX2
- Jetpack4.2
- Ubuntu 18.04 LTS
- Darknet:[Alexさんのリポジトリ](https://github.com/AlexeyAB/darknet#improvements-in-this-repository)
- OpenCV:3.3.1（Jetpack4.2標準）

# インストール
[Alexさんのリポジトリ](https://github.com/AlexeyAB/darknet#improvements-in-this-repository)からプロジェクトをダウンロロード

```bash
git clone https://github.com/AlexeyAB/darknet.git
```


# デバイスを動作モード変更
最速でデバイスを動作させるために設定を変更する。

```bash
sudo nvpmodel -m 0
sudo /usr/bin/jetson_clocks
```

# Make
Darknetリポジトリをgit cloneしてきたら、darknet/Makefileの設定を以下に

```makefile:darknet/Makefile
GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1
```
USBカメラ使うんなら、OPENCVのフラグ、GPU使うならGPUのフラグを立てる。CUDNN_HALF=1とすることで、16ビット浮動小数点演算を行うことが可能となり高速な演算が可能となる。
Makeすると。。。

```bash
$ cd darknet
$ make -j4
…
/bin/sh: 1: nvcc: not found
Makefile:152: recipe for target 'obj/convolutional_kernels.o' failed
```

nvccどこだよーとパスで怒られたので、

```bash
$ sudo find / -name "nvcc"
[sudo] password for nvidia: 
/usr/local/cuda-10.0/bin/nvcc
```
ってことで、/usr/local/cuda-10.0/bin/nvccにあることがわかりました。Makefileにパスを追加して、

```makefile
CC=gcc
CPP=g++
# NVCC=nvcc
NVCC=/usr/local/cuda-10.0/bin/nvcc
OPTS=-Ofast
```
再度コンパイルすれば通ります。

実行する前に、学習済み重みをダウンロードする。ダウンロードするのは、一般的なyolov3.weightとyolov3-tiny.weight

```bash
$ cd darknet
$ wget https://pjreddie.com/media/files/yolov3.weights
$ wget https://pjreddie.com/media/files/yolov3-tiny.weights
```


# 静止画（犬と車）の認識
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327375/d4f6b022-b522-64c8-6b40-896d99c6ac70.png)


## yolov3

実行

```bash
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg 

```

実行結果

```bash
[yolo] params: iou loss: mse, iou_norm: 0.75, cls_norm: 1.00, scale_x_y: 1.00
Total BFLOPS 65.864 
 Allocate additional workspace_size = 52.43 MB 
Loading weights from yolov3.weights...
 seen 64 
Done!
data/dog.jpg: Predicted in 267.771000 milli-seconds.
bicycle: 99%
dog: 100%
truck: 94%
```
複数回実行した結果
data/dog.jpg: Predicted in 295.361000 milli-seconds.
data/dog.jpg: Predicted in 342.763000 milli-seconds.
data/dog.jpg: Predicted in 280.382000 milli-seconds
data/dog.jpg: Predicted in 314.492000 milli-seconds.
data/dog.jpg: Predicted in 342.232000 milli-seconds.


## Yolov3-tiny
実行

```bash
./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
```

実行結果

```bash
[yolo] params: iou loss: mse, iou_norm: 0.75, cls_norm: 1.00, scale_x_y: 1.00
Total BFLOPS 5.571 
 Allocate additional workspace_size = 52.43 MB 
Loading weights from yolov3-tiny.weights...
 seen 64 
Done!
data/dog.jpg: Predicted in 93.378000 milli-seconds.
dog: 81%
bicycle: 38%
car: 71%
truck: 41%
truck: 62%
car: 39%
```
複数回実行した結果
data/dog.jpg: Predicted in 166.246000 milli-seconds.
data/dog.jpg: Predicted in 115.194000 milli-seconds.
data/dog.jpg: Predicted in 73.886000 milli-seconds.
data/dog.jpg: Predicted in 77.460000 milli-seconds.
data/dog.jpg: Predicted in 76.015000 milli-seconds.
data/dog.jpg: Predicted in 126.547000 milli-seconds.
data/dog.jpg: Predicted in 74.477000 milli-seconds.


# USBカメラでリアルタイム認識
Webカメラでの実行で実行してみる。
手元にZEDしかなかったので、解像度は Video stream: 1344 x 376 。
## yolov3

-cオプションを用いることで、入力のデバイスを指定可能。
device01として認識されているので、引数は-c 1としました。
deviceの確認は```v4l2-ctl --list-devices```で確認できる。

```bash
$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg ./yolov3.weights -c 1
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327375/43acf9b1-ca0d-400d-ec80-59255153199d.png)

```bash
FPS:4.4
Objects:

surfboard: 30% 
surfboard: 26% 
person: 95% 
person: 88% 
```
大体4.3FPS~4.4FPSと安定


## Yolov3-tiny
```bash
$ ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg ./yolov3-tiny.weights -c 1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327375/7010d027-7b5d-158e-30bf-fdd14979e341.png)

```bash

FPS:27.8
Objects:

keyboard: 25% 
person: 49% 

FPS:32.3
Objects:

keyboard: 26% 
person: 47% 

FPS:27.0
Objects:

keyboard: 27% 
person: 43% 
```

大体27fps~32fps。JetPack3.2よりも高速化している？


# 動画による検証
検証用動画は
https://drive.google.com/file/d/1rdxV1hYSQs6MNxBSIO9dNkAiBvb07aun/view
を利用。
検出動画はyolov3***-res.avi、標準出力はyolov3***-res.txtとして保存。

### yolov3-tiny
```bash
$ ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg ./yolov3-tiny.weights self_driving_valid.avi -out_filename yolov3-tiny-res.avi > yolov3-tiny-res.txt
```

### yolov3
```bash
$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg ./yolov3.weights self_driving_valid.avi -out_filename yolov3-res.avi > yolov3-res.txt
```

# TensorRTでYoloV3を試す
参考：https://devtalk.nvidia.com/default/topic/1050377/jetson-nano/deep-learning-inference-benchmarking-instructions

# 画像の連続読み込み
画像リストをもとに連続で画像を読みむ場合。-dont_showとすることで、処理結果が画像で表示されない。

```bash
./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -dont_show < test-list.txt > result-fp16-xavier-1920-1080.txt
```
処理速度の行だけ抽出。

```bash
cat result-fp16-xavier-1920-1080.txt | awk '/Enter/,/seconds./' > result-fp16-xavier-1920-1080-extract.txt
```