cuda10.0が入っているJetson NanoにYOLOv4-tinyを入れる

# 背景
やむを得ない理由で、cuda10.0が入っているJetsonNanoにdarknetとyolov4-tinyを入れる必要があったのですが、その際ちょっと手間取ったのでそのメモ。

# 環境
```
$ jetson_release
 - NVIDIA Jetson NANO/TX1
   * Jetpack 4.3 [L4T 32.3.1]
   * CUDA GPU architecture 5.3
 - Libraries:
   * CUDA 10.0.326
   * cuDNN 7.6.3.28-1+cuda10.0
   * TensorRT 6.0.1.10-1+cuda10.0
   * Visionworks 1.6.0.500n
   * OpenCV 4.1.1 compiled CUDA: YES
 - Jetson Performance: inactive
```

# 手順
## 1. フレームワークであるdarknetを入れる
```
$ git clone https://github.com/AlexeyAB/darknet
```
## 2. Makefileを修正する
```
$ cd darknet
$ vim Makefile
```
以下の様に修正
```:darknet/Makefile
GPU=1  
CUDNN=1  
CUDNN_HALF=0  # jetson nanoの場合は0でok 
OPENCV=1  
libso=1

# 64行目あたり
NVCC=/usr/local/cuda/bin/nvcc
```
## 3. yolov4-tinyを入れる
```
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.weights
```
## 4. コンパイルする
```
$ make -j5
```
※時短の為に5スレッドでの分散ビルドをしています(以下記事参考)

http://lpha-z.hatenablog.com/entry/2018/12/30/231500

### ビルドの途中でエラー
このまま上手くいけばいいな～と思っていたら案の定、途中で`identifier "cudaStreamCaptureModeGlobal" is undefined`というエラーが出ました
```
./src/network_kernels.cu(721): error: identifier "cudaStreamCaptureModeGlobal" is undefined

./src/network_kernels.cu(721): error: too many arguments in function call

2 errors detected in the compilation of "/tmp/tmpxft_00005fdb_00000000-6_network_kernels.cpp1.ii".
Makefile:184: recipe for target 'obj/network_kernels.o' failed
make: *** [obj/network_kernels.o] Error 1
```
<br>

### 原因
調べたらgithubのissueにちゃんと書いてありました
このissueでのやり取りを見ていくと大体つかめると思います

https://github.com/AlexeyAB/darknet/issues/7452

**原因となっていたのは**`network_kernels.cu`**の以下の部分**
```cuda: darknet/src/network_kernels.cu
CHECK_CUDA(cudaStreamBeginCapture(stream0,cudaStreamCaptureModeGlobal));
```
↑は**CUDA10.1以降向け**に追加されたもので、CUDA10.0の際に発生していたissueを解決するための関数
この関数によって推論の実行スピードが20%上昇するとの事
> It seems yes, it was added in CUDA 10.1, because there was an issue for CUDA 10.0 triton-inference-server/server#635 (comment)
>
> In general this is related to this feature, that can accelerate any neural network +20% for Inference (Detection): #7444

### 解決策
因みに無くても動くとの事なので、コメントアウトしてもう一度makeしてみます

```cuda: ./src/network_kernels.cu
// CHECK_CUDA(cudaStreamBeginCapture(stream0,cudaStreamCaptureModeGlobal));
```

```
$ make clean
$ make -j5
```
今度はエラーが起きず無事に終了しました(darknetという名前のファイルが出来ていれば成功です)

## 5. 正常に動作するか確認
```
$ ./darknet detect cfg/yolov4-tiny.cfg yolov4-tiny.weights data/dog.jpg
```
こんな感じのログが出ます
```
 CUDA-version: 10000 (10000), cuDNN: 7.6.3, GPU count: 1  
 OpenCV version: 4.1.1
 0 : compute_capability = 530, cudnn_half = 0, GPU: NVIDIA Tegra X1 
net.optimized_memory = 0 
mini_batch = 1, batch = 1, time_steps = 1, train = 0
...
(途中略)
...
[yolo] params: iou loss: ciou (4), iou_norm: 0.07, obj_norm: 1.00, cls_norm: 1.00, delta_norm: 1.00, scale_x_y: 1.05
nms_kind: greedynms (1), beta = 0.600000 
Total BFLOPS 6.910 
avg_outputs = 310203 
 Allocate additional workspace_size = 26.22 MB 
Loading weights from weights/yolov4-tiny.weights...
 seen 64, trained: 0 K-images (0 Kilo-batches_64) 
Done! Loaded 38 layers from weights-file 
 Detection layer: 30 - type = 28 
 Detection layer: 37 - type = 28 
data/dog.jpg: Predicted in 67.070000 milli-seconds.
bicycle: 60%
dog: 84%
truck: 79%
car: 46%
```
無事動作しました！
ちなみに推論のスピードは67ミリ秒(0.067秒)でした
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2357932/a7331a43-8180-6133-f74b-d72d6dbb1240.png" width=50%>

# 参考

https://zenn.dev/rain_squallman/articles/eec4916653d1bdcb2550

https://denor.jp/jetson-nano%E3%81%A7yolov4%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F