Windows環境でYOLO

#◆はじめに

専門知識が全くないのですが、YOLO（YOLOv3）について調べる機会があったので調査した内容を纏めておきます。
簡単な説明とWindows版の導入方法を記載致します。
**※画像やYOLOの学習方法などは後日追加しておきます。**

#◆YOLOとは
YOLOとはリアルタイム物体検出アルゴリズムです。
「You only look once」の頭文字を取って「YOLO」と呼ばれます。

それでは「物体検出アルゴリズム」とは何でしょう？
簡単に言ってしまえば、写真や動画内で存在している物体の位置と情報を検出する事を指します。
例えば、人と猫の写っている写真があるとします。
その写真に「物体検出アルゴリズム」を適用させると写真から「人」と「猫」という情報と、
それぞれの写真内の位置を自動的に検出されます。

YOLOはDarknetというフレームワークで開発されております。
DarknetはLinux環境動くのですが、ありがたい事にWindowでも動かす事が可能なので、
今回はWindow環境の導入手順を紹介致します。


#◆Darknetとは
上記に記載したYOLOで紹介したフレームワークのDarknetですが、
これは深層学習またはディープラーニング(deep learning)と呼ばれる機械学習を行うフレームワークです。

そもそも深層学習とはなんでしょう？
数年前、囲碁でAI(人工知能)が世界チャンピオンに勝ったというニュースがありました。
そのAIは数多くのプロ棋士の打ち筋から知識を学び取りました。
多数の情報（今回の例であれば囲碁の打ち筋）からパターンや情報を自動的に学習し、精度を高める事を深層学習といいます。
これは人間と同じで、数多くの事を経験する事で機械自ら考え学習し、その経験をもとに答えを導き出します。

Darknetではその深層学習をより簡単に実行する事ができるフレームワークとなっております。
YOLOに関しては既に幾つかの情報を学習済みとなっております。


#◆導入方法
Windows環境でのDarknet（YOLO）の導入方法します。
またYOLOでトレーニングを行う際に便利なLabelimgについてはまた別の記事で記載します。

※以下修正します。

##Visual Studio
**１．ダウンロード**
Visual Studio Communityを公式サイトからダウンロードしてください。
※バージョンは2015、または2017をダウンロードして下さい。
公式サイト：https://visualstudio.microsoft.com/ja/vs/older-downloads/

**2．インストール**
ダウンロードしたインストーラーを実行します。
ダイアログが表示され、ワークロードでは「C++によるデスクトップ開発」を選択。
右のインストールの詳細では「MSVC v140 - VS 2015 C++ ビルドツール」を選択。
※Visual Studio2015をダウンロードした場合は不要
「ダウンロードしながらインストールする」を選択するとインストールされます。
![WS000120.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254650/cad6c166-9a6a-673f-253c-e73b844d6e64.jpeg)


##CUDA、cuDNN、OpenCV
####■CUDAダウンロード
**１．ダウンロード**
NVIDIAの公式サイトからCUDAのインストーラーをダウンロードしてください。
~~推奨バージョンはCUDA 9.2となります。最新でも問題ないようです。~~
→バージョンは10.1でないとビルド時にエラーが発生しました。
~~CUDAダウンロード先：https://developer.nvidia.com/cuda-92-download-archive~~
CUDAダウンロード先：https://developer.nvidia.com/cuda-downloads

自分のPCの状況に応じて画面のボタンを選択してください。
Operating System：Windows
Architecture：x86_64
Version：自身のWindowsのバージョンを選択
Installer Type：好きな方を選択

画面でボタンを選択するとダウンロードボタンが表示されるので、ボタンを押下してダウンロードしてください。
※バッチがある場合はそれもダウンロードしてください。
![WS000099.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254650/cdb30710-df68-1746-6769-db37c8fcf76e.jpeg)


**2．インストール**
インストーラーをダウンロードしたら実行します。
NVIDIAソフトウェア使用許諾契約書を読み「同意して続行する」を押下。
インストールオプションではカスタムを選択。「CUDA」と「Driver components」を選択し「次へ」を押下。
![WS000111.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254650/eb888fa2-da57-37b1-714f-489ed2ad3d44.jpeg)

インストール場所を選択し「次へ」を押下したらインストールが実行されます。
インストール後にサマリーが出るので「次へ」、「NVIDIAインストールが終了しました」とでたら「閉じる」を押下します。

~~インストールが完了したら、環境変数のPathにC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\binを追加してください。~~
インストールが完了したら、環境変数のPathにC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\binを追加してください。
※「C:\Program Files」にインストールした場合。違う場合はインストール先を指定してください。

####■cuDNNダウンロード
**１．ダウンロード**
NVIDIAの公式サイトからcuDNNをダウンロードしてください。
cuDNNダウンロード先：https://developer.nvidia.com/cudnn

ダウンロードする為にはサイトへの登録が必要です。
登録が完了すれば、サイトでアンケートに答えます。
アンケートに答えるとcuDNNをダウンロードする事ができるようになります。
ダウンロードはWindows版を選択してください。
またバージョンの推奨はcuDNN 7.1ですが最新でも問題ないようです。
先ほどインストールしたCUDAとバージョンを合わせて下さい。

**2．解凍**
zipファイルがダウンロードできたら解凍します。
解凍したcuDNNフォルダーの中身をそれぞれCUDAの中のbin,include,libフォルダーに直接入れます。

####■OpenCVダウンロード
**１．ダウンロード**
サイトからOpenCVをダウンロードしてください。
バージョンは3.4.0(またはそれ以前)をダウンロードしてください。

**2．解凍**
zipファイルがダウンロードできたら解凍します。
解凍したら、環境変数のPathにC:¥opencv¥build¥x64¥vc14¥binを追加してください。
※「C:¥opencv」にインストールした場合。違う場合はインストール先を指定してください。

##Darknet（YOLO）
**１．ダウンロード**
YOLOを動かす為のフレームワークであるDarknetをGithubからダウンロード。
ダウンロードする際、「Clone or download」をクリックし「Download ZIP」を選択してzipファイルをダウンロードする。
ダウンロードをしたら、適当な場所へ解凍します。
GitHub：https://github.com/AlexeyAB/darknet
![WS000126.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254650/c0ce08d1-724f-60a0-ad76-49e33b83ab59.jpeg)
![WS000127.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254650/a59c932d-e789-c305-1cfd-82684017188e.jpeg)


**2．設定**
darknet.sln（D:\dev\darknet-master\build\darknet\darknet.sln）をVisual Studio2017で開きます。
Darknetをビルドする為、プロジェクトの設定を変更します。

プロジェクトを右クリック⇒ビルドの依存関係⇒ビルドのカスタマイズを開く。
先程入れたCUDA 10.1にチェックを入れ、「OK」ボタンを押下。
※CUDAのパスが違う、または無い場合「既存ファイル検索」からファイルを指定する事。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\visual_studio_integration\MSBuildExtensions\CUDA 10.1.targets
![WS000130.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254650/02c2694d-bfcf-60cf-1d68-8a99a9c6b7c3.jpeg)

メニューからビルド⇒構成マネージャーを開く。
構成を「Release」、プラットフォームを「x64」へ変更する。
![WS000131.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254650/0ca8c953-8c20-b9c7-a39d-e5b27790ff21.jpeg)

プロジェクトを右クリック⇒プロパティを開く。
「C/C++」→「全般」→「追加のインクルードディレクトリ」で以下を追加。
※既存は消さない。またパスが間違っていたら修正
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include
C:¥opencv\build\x64\vc14\include
C:¥opencv\build\include

「リンカー」→「全般」→「追加のライブラリディレクトリ」で以下を追加。
※既存は消さない。またパスが間違っていたら修正
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\lib
C:¥opencv\build\build\x64\vc14\lib

**3．ビルド**
プロジェクトを右クリックし、ビルドを実行します。
※メニューのビルドからでもビルド実施可能
Visual studio画面下部にある出力枠にエラーが表示されなければ、x64に「darknet.exe」が生成されます。

#◆実行方法
１．コマンドプロンプトを開く
２．「build\darknet\x64」へ移動（※今回の場合D:\dev\darknet-master\build\darknet\x64）
３．以下コマンドを実施

```
darknet.exe detector train 【DATAファイル】 【CFGファイル】 【weightsファイル】 検出対象ファイル名
例）「darknet.exe detector test data/coco.data yolov3.cfg yolov3.weights -i 0 -thresh 0.25 dog.jpg」
```

※dog.jpgを変更すると別の画像を検出対象とすることが可能
画像の格納先は：D:\dev\darknet-master\build\darknet\x64


#◆参照
**Darknet**
https://ch.nicovideo.jp/akiba-cyberspacecowboys/blomaga/ar1116319
**深層学習**
https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0
https://www.optim.cloud/blog/ai/ai-deeplearning/
https://jp.mathworks.com/discovery/deep-learning.html
**導入方法**
https://qiita.com/East_san/items/62adb216b0e6f801ae1d
https://www.kkaneko.jp/tools/win/cudnn.html
https://nixeneko.hatenablog.com/entry/2018/08/15/000000
https://blog-ryotaro-diary.hatenablog.com/entry/2018/12/26/002035