Windows10環境でdarknet使って学習、ビルド編

#WindowsでYOLOv3を使うためのあれこれ
darknetで学習するために必要なのは

**・AlexyABさんのWindows版darknetのビルド**
**・学習データ作成**

このふたつ。
両方結構大変なので簡単な流れと参考URLを書いておく。
##darknetのビルド
これがかなりつらみ。Visual Studio使ったことない人には分からないことだらけだと思う。僕もそうだった。というか一回諦めた。インストールするものが沢山あるけど頑張りましょう。
※NVIDIAのGPUを前提としてます。

自分でできるからファイルだけくれって人はここからクローンしてね
https://github.com/AlexeyAB/darknet

###STEP1 いろいろダウンロード
英語大丈夫な人はここを参照
https://github.com/AlexeyAB/darknet#requirements

※全てCドライブ上に展開すること。

**・Visual Studio 2017
・darknetビルド用ファイル
・Nvidiaドライバ
・CUDA Toolkit 10.0
・cuDNN　(for CUDA 10.0)
・OpenCV (C/C++の方)
・CMake**

以上！多い！
1つ1つ説明するでよ。
あと**Visual StudioはCUDAより先**に入れること。すでにCUDA10.0が入ってる人はインストールしなおしましょう。
各**ファイルのインストール先はメモ**っておくこと。

**darknetビルド用ファイル**
AlexyABさんが提供してます。リンク先のgitでクローン or ZIPダウンロード。
https://github.com/AlexeyAB/darknet

**Visual Studio 2017**
2020年1月現在、最新版はVisual Studio 2019だけど2017を入れる。DLはここから。
https://docs.microsoft.com/ja-jp/visualstudio/releasenotes/vs2017-relnotes
![VSimage1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/5f60b27d-215e-7171-94a1-57f23413a3f8.png)
Visual Studio Installer が起動したらC++によるデスクトップ開発にチェックを入れてインストール。

**Nvidiaドライバ**
自分のGPUに合ったドライバを入れます。
（何のGPUが入ってるか分からないときはコルタナさんに「dxdiag」を入力）
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

ここで一つ言っておかねばならないことがありまして、、
ドライバダウンロード時にこんな画面が出るのだけども
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/aac7b756-cf4f-071c-46c3-fb72fcf92418.png" width=50%>
ここのバージョンが**411.31以上**でないと、CUDA10.0が正常に動作しないと思われます。
なのでGPUがちょっと古すぎる人はここのやり方だと多分うまくいかない。

**CUDA Toolkit 10.0**
AlexyABさんがCUDA 10.0を指定しているので素直に従う。
https://developer.nvidia.com/cuda-10.0-download-archive

**cuDNN (for CUDA 10.0)**
cuDNNはCUDAのバージョンに合わせたものを入れる。CUDA10.0に対応した最新版を選びましょう。
https://developer.nvidia.com/rdp/cudnn-archive
ダウンロードにはNVIDIAの会員登録が必要。怖がらずパパっと登録しちゃう。

**OpenCV (C/C++の方)**
ここからWindows用のものを。
https://opencv.org/releases/
バージョンは2.4以上なら何でもいい、はず。最新版入れちゃう。

**CMake**
ビルドのために必要なソフトウェアらしい。最新版入れちゃう。
https://cmake.org/download/

ここまででSTEP1は終了。お疲れ様です。
ダウンロードした圧縮ファイルは全部展開しておいてね。

###STEP2 ビルドするための設定変更いろいろ
まずはvisual studio 2017を起動。
**1.ファイルを開く**
「プロジェクト/ソリューションを開く」からdarknet.slnを選択。
ファイルはgitから落としたフォルダのdarknet-master\build\darknetにある。
ファイルを開くとソリューションの再ターゲットとかいう画面が出るのでとりあえずSDKもプラットフォームもアップグレードしとく。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/9132f65c-d2be-b457-d19e-070e0528440e.png" width=50%>

**2.プラットフォームを変更**
visusal studio 上部のソリューション構成/プラットフォームを「Release/×64」に変更
![VSimage1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/1a260714-dffe-cbe1-c445-4ccf0cc8fbd8.png)

**3.プロパティのC/C++を変更**
※参照パスに日本語が入ってるとビルドに失敗する可能性があるので注意

Visual Studioの画面右側、ソリューションエクスプローラー内のdarknetファイルを右クリックしてプロパティを開く。
「構成プロパティ」→「C/C++」→「全般」
追加の**インクルードディレクトリ**に
・CUDA v10.0
・cudnn
・opencv
の**3つ**の**includeフォルダ**の**パス**を追加する。元から入ってるパスはそのままで無視して良い。
CUDA v10.0のincludeフォルダは `Program files/Nvidia Gpu Computing Toolkit/`～にあるはず。
各includeフォルダの場所が分からない場合は下のスクショを参考にどぞ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/46cb510f-4fac-e13d-9e9d-41e2fd046c70.png" width=50%>

**4.プロパティのリンカーを変更**
※参照パスに日本語が入ってるとビルドに失敗（以下略

さっきと同じくdarknetファイルの構成プロパティ内から
「リンカー」→「全般」
追加の**ライブラリディレクトリ**に
・CUDA v10.0
・cudnn
・opencv
の**3つ**の**libフォルダ**の**パス**を追加する。
CUDAとcudnnは `lib/×64`  まで入れちゃう。
opencvは `opencv/build/×64/vc14/lib` だけでいいと思う。不安ならvc15の方も追加しちゃいましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/899aa5f2-20aa-d233-7f5e-ca50227a22dd.png" width=50%>
###STEP4 ビルド
メニューバーの[ビルド]から[ソリューションのビルド]或いは[リビルド]を実行。
一発でうまくいくことはあまりない。
リビルドしないとエラーが分からなかったりするからそこは各自で適当に。
必要なものはインストールしてあるはずなので細かいエラーは各自で修正しましょう。
ビルドが完了すると `darknet-master\build\darknet\x64`内にdarknet.exeができる。
###STEP5 darknet.exeの実行　の前に、、
実はビルドができてもこのまま実行するとおそらくエラーが出る。
理由は、darknetがいろんなbinフォルダを参照したいのに環境変数にbinフォルダのパスを追加していないから。
ってことで
・CUDA v10.0
・cudnn
・opencv
の**3つ**の**binフォルダ**のパスを環境変数に追加する。
**openCV**のbinのパスは**注意**が必要。
**`opencv/build/×64/vc14/bin`**の方のパスを追加すること。`opencv/bin`の方じゃない。
###STEP6 darknet.exeの実行
STEP5までをちゃんとやったならもう大丈夫！
試しに学習済みモデルを使って画像を推論してみたい人は
https://github.com/AlexeyAB/darknet#pre-trained-models
からweightsファイルをダウンロードしてdarknet.exeと同じ階層に入れておく。
因みにcfgファイルそれぞれに対応したweightsファイルがあるので、好きなものを落として使うといいと思う。

**実行用のコマンド**はこんな感じ。（yolov3.cfgとyolov3.weightsを使った例）
コマンドプロンプトでdarknet-master\build\darknet\x64に移動した後
`darknet.exe detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -thresh 0.25`
を実行。そのあと画像のパスを入力して完了

他のコマンドについてはここ参照されたし。
https://github.com/AlexeyAB/darknet#improvements-in-this-repository
飛んだ先から少し下にスクロールしたとこにある"How to use on the command line"てとこに他のコマンドがいろいろ書いてある。

##おわりに
ビルドできた方、お疲れ様でした。
準備編②では学習データについて書くよー。