Windows10でYOLOv3を動作させるまでに苦労した話(対処したこと)

# はじめに

今回、物体検出ライブラリのYOLOv3をインストールしてみました。ただ、実際に何点か苦労したので、作業時にひっかかったこと、対処したことをまとめてみました。

# YOLOv3とは

・リアルタイムの物体検出を行う
・認識した物体は、bounding boxとラベルをつけて表示される
・DarknetというC言語製のニューラルネットワークフレームワークの一部の機能(※)として実装されている。
　※Darknetは他にもRNN(自然言語処理)などの処理を含んでいる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555643/72319408-31c2-7c4a-e5dc-f4d80fbdbcb6.jpeg" width=80%>


# インストール環境
・Windows 10 Home 64bit
・Intel Corei7-8750H
・16GB RAM
・NVIDIA GeForce GTX 1070

# 今回インストールしたもの
・YOLOv3 Windows版のGithubリポジトリ(https://github.com/AlexeyAB/darknet)
・CUDA Toolkit 10.0
・cuDNN v7.4.1 for CUDA 10.0
・OpenCV 3.4.0
・MS Visual Studio 2017 Community Edition

# インストール手順

インストール手順については、下記の講座を参考にしました。

 [**【YOLO v3で実践】ディープラーニングによる物体検出入門**](https://www.udemy.com/course/yolov3_objectdetection/)

また、darknetの『How to compile on Windows (legacy way)』に沿っています。
https://github.com/AlexeyAB/darknet


おおまかな手順は下記となります。

・Visual Studio 2017のインストール
・CUDA Toolkit 10.0のインストール
・cuDNN のファイルコピー
　　展開されたディレクトリ内にあるファイルをCUDAの対応するディレクトリにコピーする
・OpenCVのインストール
・環境変数でOpenCVとcuDNNのパスを通す
・Visual Studioにてdarknetのslnファイルを開く
・ビルド時のエラー対処
　・CUDA10.0.propsが見つからない
　　・CUDAのインストールの不具合
　　　CUDAのインストーラに含まれているため、展開されたファイルから手動でコピーする
　　　コピー先は[Visual StudioのBuildCustomizations]
　　・opencvのエラー
　　　・C:\opencv_3.0\opencvというフォルダ構成が想定されているためそれに合わす
　　　・環境変数のパスもそれに合わせる
・ビルドし、exeを作る
・darknetの学習済みモデルをダウンロード
・コマンドプロンプトでYOLOv3の実行

# いろいろつまずいた点

上記の流れに沿ってインストールを行いましたが、自分の環境ではそれ以外にもいろいろつまずきました。

## v140 (プラットフォーム ツールセット = 'v140') のビルド ツールが見つかりません。

【状況】Visual Studioにてdarknetのビルドした際に発生。
【対応】(1)[ソリューション エクスプローラー]の[darknet]を右クリック、[プロパティ]を選択。
　　　　(2)[全般]内の[プラットフォーム ツールセット]にて[Visual Studio(v141)]を選択。
　　　　(3)[適用]を選択。

## Windows SDK バージョン 8.1 が見つかりませんでした。

【状況】Visual Studioにてdarknetのビルドした際に発生。
【対応】下記、ページを参考にしました。
http://tooljp.com/qa/MSB8036-build-compile-error-88E1.html

> (1)Visual Studio 2017のメニューから [ファイル] - [新規作成] - [プロジェクト] を選択します。
(2)[Visual Studio インストーラを開く]を選択します。
(3)[個別コンポーネント]タブを選択します。
(4)[Windows 8.1SDK]のチェックをオンにします。

## 'corecrt.h':No such file or directory

【状況】Visual Studioにてdarknetのビルドした際に発生。
【対応】下記、ページを参考にしました。
https://nmrnbpw.blog.fc2.com/blog-entry-356.html

(1)Visual Studio 2017のメニューから [ファイル] - [新規作成] - [プロジェクト] を選択。
(2)[Visual Studio インストーラを開く]を選択。
(3)各アイテムをチェック。

>C++ ユニバーサル Windows プラットフォーム ツール
デスクトップ C++ x86およびx64用Windows 10 SDK (10.0.15063.0)
VC++ 2017 v141 ツールセット (x86,x64)

## MRVCR100.dllが見つからないため、コードの実行を続行できません。

【状況】コマンドプロンプトでYOLOv3の実行した際に発生。
【対応】下記のパッケージをインストール
 [**Microsoft Visual C++ 2010 再頒布可能パッケージ (x64)**]
(https://www.microsoft.com/ja-jp/download/details.aspx?id=14632)

## CUDA status Error

【状況】コマンドプロンプトでYOLOv3の実行した際に発生。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555643/9c76a23d-40e5-917c-1405-7d2ec9294209.jpeg" width=100%>

【対応】デバイスマネージャーの[ディスプレイアダプター]を確認。
　　　　[ディスプレイ アダプター]の[NVIDIA GetForce GTX 1070]を確認したところ、
　　　　警告アイコンがついていた。右クリックし[ドライバの更新]を選択。

【余談】自分はデュアルディスプレイで作業をしているんですが、CUDA ドライバを入れた時点で、
　　　　サブのモニタが映らなくなったんですよね。ドライバとの整合性に問題があったのでしょうか。
　　　　現在、自分のPCにはVersion10.1がはいっているようです。

# まとめ

上記を対処することにより、無事動かすことができました。現在、画像ファイルを指定しての物体検知はもちろん、内蔵のカメラでもリアルタイムに物体検知をしてくれます。
個人のPCでこんなにもレスポンスよく反応してくれるのには正直驚かされます。
今回は提供されている学習モデルをそのまま使っていますが、個人で学習モデルを作りそれを利用することも可能ということで、「ベルトコンベアに流れる不良品を検知する」なんてのも作れるかもしれません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555643/75fbb87f-83c3-e545-f83e-e8549cc75097.jpeg" width=80%>