YOLO V4が出たので試してみる
本家が出してるわけではないらしい。
お世話になっているhttps://github.com/AlexeyAB
に上がっていたので試してみた。
結果から書くとyolov3_5l.cfgに比べてv4は精度と速度両方とも良い。
AlexeyABさんありがとう!
早速自分のサービスに乗っけてみました。
https://funnel-service.com/
類似度モデルがまだ甘いので
ただいま改善中!
動機
自分のサービスでyolov3_5lを使っていたのですが、夜な夜な作業で教師データを整理して精度を上げたので再学習が必要になった。
せっかくなので最新のフレームワークで学習。そしたらめっちゃ遅い。
AlexeyABさんに質問したらバグかも・・とのこと。
最終的に5レイヤーは重いからv4も試してみろとのとこと。
100%google翻訳で質問しましたが・・・・なんとか・・・
AlexeyABさん親切です!
ビルドとか
Windowsでclone>sln openして・・いろいろ設定して・・ではビルドできなくて
cmakeでやらないとダメだった。
cmakeでやるとサクサクやってくれる
うそでした。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毎の精度
100iteration毎に保存している重みを全部計算してみる。(1000以下は無駄なので省略)
![YoloV4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185049/4addcef4-a242-9656-5913-3d6e2797729e.png)
和装の画像をほとんど入れてないので、学習させたらもうちょい上がるかな・・
Faceについては・・・前回では男女、美男美女の4種類で判別していたのを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: