YOLOv4の学習確認

#1.この記事の内容

YOLOv4のDetectorの学習を実施してみて，環境構築や学習実行方法についてまとめます．

[YOLOv4の推論環境まとめは記事にした](https://qiita.com/ryoma-jp/items/7d287f38c52d2cce0a14)ので，Detectorの学習確認を記事にするところまで実施して，YOLOv4の確認を終えようと思いました．

学習に時間がかかって，記事投稿時点では終わっていないですが，完了次第更新予定です．

##1-1.使用環境

* Ubuntu 18.04 (Windows 10 WSL2)
* GeForce RTX 2070 SUPER

#2.学習実行手順

[Train Detector on MS COCO (trainvalno5k 2014) dataset](https://github.com/AlexeyAB/darknet/wiki/Train-Detector-on-MS-COCO-(trainvalno5k-2014)-dataset)記載の手順で学習開始まではできました．

ただ，学習ログでnan表示される為，正しく学習が進んでいるかは不明で，完了後にmAPを計測して確認予定です．ググるとlearning_rateを下げると解消できるという記事をいくつか見かけましたが，今回の試行ではlearning_rateをdefault値の1/100以下やゼロにしても解消できませんでした．

## 2-1. darknetコードの取得とビルド

<pre>
$ git clone https://github.com/AlexeyAB/darknet
$ vim Makefile
※GPU，CUDNN，OPENCVを有効化
GPU=0
CUDNN=0
OPENCV=0
　↓
GPU=1
CUDNN=1
OPENCV=1
$make
</pre>

## 2-2.Detectorの学習

<pre>
$ export DARKNET_DIR=< path to your darknet directory >
$ export DATASET_DIR=< path to your dataset directory >
$ export PRETRAINED_MODELS_CLASSIFICATION=< path to your pretrained-models directory >
$ cd ${PRETRAINED_MODELS_CLASSIFICATION}
Google Drive（ https://drive.google.com/open?id=18jCwaL4SJ-jOvXrZNGHJ5yz44g9zi8Hm ）から分類モデルをダウンロードする
$ cd ${DARKNET_DIR}
$ ./darknet partial cfg/csdarknet53-omega.cfg ${PRETRAINED_MODELS_CLASSIFICATION}/csdarknet53-omega_final.weights ${PRETRAINED_MODELS_CLASSIFICATION}/csdarknet53-omega.conv.105 105
$ cd ${DATASET_DIR}
$ wget https://raw.githubusercontent.com/AlexeyAB/darknet/master/scripts/get_coco_dataset.sh
$ ./get_coco_dataset.sh
${DARKNET_DIR}/cfg/coco.dataのtrainvalno5k.txtのパスを，${DATASET_DIR}/coco/trainvalno5k.txtに変更
$ cd ${DARKNET_DIR}
$ ./darknet detector train cfg/coco.data cfg/yolov4.cfg ${PRETRAINED_MODELS_CLASSIFICATION}/csdarknet53-omega.conv.105 -dont_show
※GUIが使えない環境で実行した為，「-dont_show」オプションを付加
</pre>

## 2-3.記事投稿時点での実行ログ

<pre>
 CUDA-version: 10020 (11030), cuDNN: 7.6.5, GPU count: 1  
 OpenCV version: 3.2.0
 0 : compute_capability = 750, cudnn_half = 0, GPU: GeForce RTX 2070 SUPER 
   layer   filters  size/strd(dil)      input                output
   0 conv     32       3 x 3/ 1    512 x 512 x   3 ->  512 x 512 x  32 0.453 BF
   1 conv     64       3 x 3/ 2    512 x 512 x  32 ->  256 x 256 x  64 2.416 BF
   2 conv     64       1 x 1/ 1    256 x 256 x  64 ->  256 x 256 x  64 0.537 BF
   3 route  1 		                           ->  256 x 256 x  64 

・・・（中略）

v3 (iou loss, Normalizer: (iou: 0.07, obj: 1.00, cls: 1.00) Region 161 Avg (IOU: 0.000000), count: 17, class_loss = -nan, iou_loss = -nan, total_loss = -nan
 total_bbox = 46351381, rewritten_bbox = 2.532557 %
v3 (iou loss, Normalizer: (iou: 0.07, obj: 1.00, cls: 1.00) Region 139 Avg (IOU: 0.000000), count: 16, class_loss = -nan, iou_loss = -nan, total_loss = -nan
v3 (iou loss, Normalizer: (iou: 0.07, obj: 1.00, cls: 1.00) Region 150 Avg (IOU: 0.000000), count: 30, class_loss = -nan, iou_loss = -nan, total_loss = -nan
v3 (iou loss, Normalizer: (iou: 0.07, obj: 1.00, cls: 1.00) Region 161 Avg (IOU: 0.000000), count: 14, class_loss = -nan, iou_loss = -nan, total_loss = -nan
 total_bbox = 46351441, rewritten_bbox = 2.532553 %
v3 (iou loss, Normalizer: (iou: 0.07, obj: 1.00, cls: 1.00) Region 139 Avg (IOU: 0.000000), count: 56, class_loss = -nan, iou_loss = -nan, total_loss = -nan
v3 (iou loss, Normalizer: (iou: 0.07, obj: 1.00, cls: 1.00) Region 150 Avg (IOU: 0.000000), count: 44, class_loss = -nan, iou_loss = -nan, total_loss = -nan
v3 (iou loss, Normalizer: (iou: 0.07, obj: 1.00, cls: 1.00) Region 161 Avg (IOU: 0.000000), count: 35, class_loss = -nan, iou_loss = -nan, total_loss = -nan
 total_bbox = 46351576, rewritten_bbox = 2.532570 %
</pre>

#3.さいごに

まずは，cfg/yolov4.cfgをデフォルト値で試して，mAP計算含めてうまくいっていないことを確認した後，対策を実施して記事を更新しようと思います．

対策の候補は，cfg/yolov4.cfgのstepsとscalesの調整です．

#4.関連リンク

* [darknet](https://github.com/AlexeyAB/darknet)
* [Training and Evaluation of speed and accuracy on MS COCO](https://github.com/AlexeyAB/darknet/wiki#training-and-evaluation-of-speed-and-accuracy-on-ms-coco)
* [Train Detector on MS COCO (trainvalno5k 2014) dataset](https://github.com/AlexeyAB/darknet/wiki/Train-Detector-on-MS-COCO-(trainvalno5k-2014)-dataset)
* [Getting -NaN during DARKNET training, what am i doing wrong?](https://stackoverflow.com/questions/60158549/getting-nan-during-darknet-training-what-am-i-doing-wrong)
* [yolov3で独自データ学習中ログのIOUがnan状態を解消したい](https://teratail.com/questions/242322)
* [YOLOv4をRaspberryPi上で動かせなかった件まとめ](https://qiita.com/ryoma-jp/items/7d287f38c52d2cce0a14)