Windows環境でdarknet使ってYOLOv3の学習、kerasでの実行。コマンドメモ。

#闇の使者ダークネット
かっこいいよね

##はじめに
darknetのビルドは済んでる前提
ビルドについての記事はこちら：[Windows環境でdarknet使って学習、ビルド編](https://qiita.com/seisantaro/items/ee2ce5712b5a1db8f423)

学習データのアノテーション作業も済んでる前提
データ作成についての記事はこちら：[Windows環境でdarknet使って学習、データ作成編](https://qiita.com/seisantaro/items/96e2a71b1ad656696c5d)


AlexeyABさんのGitHubを読みたい人はここからどうぞ
https://github.com/AlexeyAB/darknet

##環境
・Windows10
・GeForce GTX1080
・Python3.6.9

##学習用
※tiny-yolo使うときも大体同じ。使う重みファイルが変わるくらい。

まずはエクスプローラを開いて `darknet-master\build\darknet\x64`へ移動

用意するファイル
**・objフォルダ** (`×64\data`フォルダ内に配置)
**・hogehoge.data**　(`×64\data`フォルダ内に配置、ファイル名は自分が分かりやすいものに。.namesファイルなどの参照先ファイルも同じ階層に置くこと)
**・yolov3-hogehoge.cfg**　(コンフィグファイル。darknet.exeと同じ階層に配置)
**・darknet53.conv.74**　(初期の重みファイル。darknet.exeと同じ階層に配置。AlexyABのgitからダウンロードする。直リンクはここ:https://pjreddie.com/media/files/darknet53.conv.74)

dataファイルとかcfgファイルについてはいろんな人が記事にしてるのと、AlexyABさんがgithubで説明してくれてるので割愛
https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects
全部英語だけどchromeで開いて翻訳かければ大丈夫！


プロンプトでdarknet.exeのあるディレクトリに行く

```:コマンドプロンプト
C:\Users>cd C:\Users\darknet-master\build\darknet\x64
```
移動先でプロンプトにこれをコピペして実行

```
darknet.exe detector train data/hogehoge.data yolov3-hogehoge.cfg darknet53.conv.74
```

あとは、待つ。
エラーが出たら学習用データとかcfgファイルとかにミスがあるので確認しましょう。
ちなみにyoloフルモデルだとGPU環境でも5種類くらいの学習で24時間かかっちゃいました。
学習が終わると/64/backupフォルダに重みファイルが保存されます(.weightsファイル)
～～_final.weightsってやつが最終的な重みファイルなんで基本的にそれ使ってます。


##実行用(Keras用)
cv2と組み合わせるやり方が良くわからなかったり色々な理由から推論はKerasで実行してるのでその際のメモ。
YOLOv3のkeras用のあれこれはqqwweeeさん(人？)が提供してくれているのでここからクローンorダウンロードします。
https://github.com/qqwweee/keras-yolo3

おっしゃ早速チェンジディレクトリや！
というのは嘘です。
用意するものがあります

**・yolov3-hogehoge.cfg**　(学習に使ったコンフィグファイル。keras-yolo3フォルダ内に配置)
**・yolov3-hogehoge_final.weights**　(学習済みの重みファイル。keras-yolo3フォルダ内に配置)

準備ができたらkeras-yolo3フォルダに飛びます

```:コマンドプロンプト
cd C:\Users\keras-yolo3
```

darknet用の重みファイルをkeras用に変換するためのpyファイルがあるので、次のコマンドをコピペして実行します

```
python convert.py yolov3-hogehoge.cfg yolov3-hogehoge_final.weights model_data/hogehoge.h5
```
コマンド最後のhogehoge.h5はkerasでyolo使うときの重みファイルの名前になるので分かりやすい名前にしておくといいと思います。
これで終わり。
ではない。
kerasでの実行にはclass名を羅列したテキストファイルを自分で用意する必要があります。
**keras-yolo3/model_data**のフォルダ内にcoco_classesとかvoc_classesってファイルがあるのでそれを参考に学習させたラベル名を羅列したものを作ります。

５種類の果物(りんご、バナナ、いちご、パイナップル、ぶどう)を学習させたならこんな感じ↓

```:hogehoge_classes.txt
apple
banana
raspberry
pineapple
grape

```

ここまできたらあとは実行するのみ！
と言いたいがまだダメだ
**keras-yolo3**フォルダ内の**yolo.py**を編集します
以下は変更場所だけコピペしたもの

```:yolo.py
class YOLO(object):
    _defaults = {
        "model_path": 'model_data/hogehoge.h5', #ここを自前のやつに
        "anchors_path": 'model_data/yolo_anchors.txt',
        "classes_path": 'model_data/hogehoge_classes.txt', #ここも自前のやつに
        "score" : 0.3,
        "iou" : 0.45,
        "model_image_size" : (416, 416),
        "gpu_num" : 1,
    }
```


あとはkeras-yolo3フォルダ内にテスト用の写真ファイルを用意します。(hogehoge.jpg)
同フォルダに飛んで**yolo-video.py**を実行します

```:コマンドプロンプト
cd keras-yolo3
python yolo_video.py --image
```
ズラーッといろんなログが出たあとに

```:コマンドプロンプト

Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
Input image filename:
```
って画面が出ればオーケー
プロンプトにhogehoge.jpgを打ち込んでやりましょう！


学習データ作成とかcv2組み込みとかはまた別の記事に書きます。