物体認識のYOLO V4を試してみる。yolov3_5lに比べて精度と速度は良い。

# YOLO　V4が出たので試してみる
本家が出してるわけではないらしい。
お世話になっているhttps://github.com/AlexeyAB
に上がっていたので試してみた。

結果から書くとyolov3_5l.cfgに比べてv4は精度と速度両方とも良い。:grin:

AlexeyABさんありがとう！

早速自分のサービスに乗っけてみました。
https://funnel-service.com/

類似度モデルがまだ甘いので:thinking::thinking::thinking:
ただいま改善中！:sob::sob::sob:



# 動機
自分のサービスでyolov3_5lを使っていたのですが、夜な夜な作業で教師データを整理して精度を上げたので再学習が必要になった。
せっかくなので最新のフレームワークで学習。そしたらめっちゃ遅い。
AlexeyABさんに質問したらバグかも・・とのこと。
最終的に５レイヤーは重いからv4も試してみろとのとこと。
100%google翻訳で質問しましたが・・・・なんとか・・・
AlexeyABさん親切です！

# ビルドとか
Windowsでclone>sln openして・・いろいろ設定して・・ではビルドできなくて
cmakeでやらないとダメだった。

cmakeでやるとサクサクやってくれる
~~~RTX TaitanならTensor Coreも自動でONにしてくれるっぽい。~~~
うそでした。Tensor Core入ってるならCUDNN_LIBRARY_DLLをチェックすべし。

こりゃいいわ。:grin:

https://github.com/AlexeyAB/darknet
をよく読んでおけばOK。

ちなみに、
Release\pthreadGC2.dll
Release\pthreadVC2.dll
のようにdllを入れておく必要がある。

2021/02/23　追記
自分の環境が壊れてとても大変だったのでやっぱりメモは必要！
（システム環境変数を吹っ飛ばしてしまいどうにもならなくなった。:joy:）

手順は
・Windowsインストール
・Visual Studio 2019インストール（CUDAより先に入れる）
・CUDA11.0と対応するCUDNNインストール
・opencv-4.5.1-vc14_vc15インストール
・・システム環境変数に追加
・・C:\opencv\build\x64\vc15\lib
・・C:\opencv\build\x64\vc15\bin
・cmake-3.19.4-win64-x64インストール
とりあえずこれだけ入れればOK！



## コードの修正
多コアなCPUの場合は

darknet/src/detector.cのLines 152 あたりにある

``` c
 args.threads = 6 * ngpus;   // 3 for - Amazon EC2 Tesla V100: p3.2xlarge (8 logical cores) - p3.16xlarge 
 //args.threads = 12 * ngpus;    // Ryzen 7 2700X (16 logical cores) 
```

を適当に修正するが・・そんなに変わらない。
2019/06あたりのソースコードだと倍くらい早くなったのに。:thinking:

同じソースの
383行付近

```c
        //if (i % 1000 == 0 || (i < 1000 && i % 100 == 0)) {
        if (iteration % 100 == 0) {
        //if (iteration >= (iter_save + 1000) || iteration % 1000 == 0) {
```
重みの保存間隔を変える



## windows用のdllはどこ？Pythonで使うには？
cmakeで作ったprojectではdllの名前が
「Release\dark.dll」という名前で作成されている。:grin:
これを、Pythonで使うには
yolo_cpp_dll.dllにリネームしてdarknet.pyから読める位置においておけばOK！



# カスタムモデルを学習してみた


ずいぶん前に学習したyolov3_5lモデルの結果は
https://qiita.com/mokoenator/items/6807132ce59913186a9b
を参考にしてください。

![1chart_yolov4-custom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185049/11519d2f-9814-c15d-59bc-ec8563b09c41.png)

いままでのモデルから比べるとLossの下がり方が違う:thermometer_face::thinking:
いつもなら、1～0.5くらいまで下がるのに、6～4をうろうろしている。
しかし、mAPは85％もでてる:thermometer_face::thinking:

これが当たり前なんだろうか？？


## cfg
lossの出方がいつもと違うので


```
[net]
max_chart_loss=10
```
とかしとくといいかも

## pngの保存




## Class毎の精度
１００iteration毎に保存している重みを全部計算してみる。（1000以下は無駄なので省略）
![YoloV4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185049/4addcef4-a242-9656-5913-3d6e2797729e.png)

和装の画像をほとんど入れてないので、学習させたらもうちょい上がるかな・・

Faceについては・・・前回では男女、美男美女の４種類で判別していたのをFaceに統一したら99％付近を張り付くようになった。


## サンプル（出典：Pixabay）


![v4_1sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185049/2770afed-302d-595b-a22c-42353d45e074.jpeg)
↓↓↓↓
![1predictions.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185049/659de293-40ff-4f23-b215-9d6a895b7966.jpeg)
---
![v4_2sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185049/b8b668fe-e820-961c-a0d4-54cf3f0dd947.jpeg)
↓↓↓↓
![2predictions.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185049/4f9ac319-6f87-066e-f9da-ae40d9df10b2.jpeg)
---
![v4_3sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185049/2b74bd2c-09c1-bd71-1fc0-db42c77b6563.jpeg)
↓↓↓↓
![3predictions.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185049/b40de428-6eb8-fef6-572c-d2e93b71f0b1.jpeg)




まぁまぁかな。今後も教師データの見直ししなきゃ:thermometer_face::thermometer_face::thermometer_face: