Windowsでdarknetのyolov3を使うことに成功した(Ubuntuでは失敗)

画像認識の人工知能の最新版「darknet yolov3」

従来のyolov2よりスピードが落ちたが認識率が高くなった。

f:id:Ryotaro_Kubo:20181225233136p:plain

 

このyolov3で自分の好きな画像を学習させると上の写真のように諸々写真を見せるだけで「dog」など識別してくれるようになる。

 

このyolov3のいいところは非常に楽に使える点であろう。

git clone https://github.com/pjreddie/darknet

cd darknet

ここでもしGPU環境を搭載しているのであればmakefileを開いて

GPU=0をGPU=1

また自分の環境に応じて、CUDNNやOpenCV等の値も変更するといいと思う。

変更を保存した後は

make

コンパイルをする。

次に、

wget https://pjreddie.com/media/files/yolov3.weights

でウェイトを入れればdarknet自体はもう使えるようになっている!何とも楽なもんだ。

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

試しにサンプル画像を入れてみると

f:id:Ryotaro_Kubo:20181225233136p:plain

こいつが無事darknet直下のprediction.jpgに出力される。

 

ちょっと今日は時間がないからdarknetでの自前学習データのtrainの注意点等は明日書くことにする。

 

ここからが本題。

Windows10の環境下でVertual box にUbuntu18.04を入れてdarknetをGPU環境で設定しようとしたのだがこれが難しい。試したことと成功失敗を書こうと思う。ちなみにGPUはGeForce980だったかな、、(あまり覚えていない)

 

①Ubuntu18.04上でNviida-driver396を入れて動かそうとした(全然無理だった)

そもそもNvidia-Driver396が入ってくれなかった。詳しい人に聞いてみたりググりま蹴ったりしたけどみんな無理って言ってるからVertual box上のUbuntuでCUDAをうまいことするようにしてやることはバージョン的に無理っぽい。

 

Nvidia Docker2を入れて動かそうとした(無理だった根本から)

なんかこれでできてる人とかネット上にいたので試してみた。だがしかし、、そもそもWindows10ではNvidia Docker2は動かないんだとさ。これでdarknet環境にGPUつけて整備するのは無理なんだってさ!というわけで撤退。

 

Windows直下にdarknetをぶち込む(大成功!!!!!)

これだった、しのごの言わずこれすりゃいけた。

 

github.com

このサイトにyolov3をWindows用にリポジトリしてくれたものがある。

インストールしなければならないものは、

Visual Studio community 2015 もしくは Visual Studio community 2017

・CUDA 9.2

・cuDNN 7.1 

OpenCV 3.4.0(Winpack)

上から順にインストールするのが無難かな。

 

インストールしたら、

Windows mark+pauseで環境設定を開いてpathに

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\bin

とcuDNNのbinのpathを追加する。

ただし2つ追加するのもややこしいので、cuDNNのbin,include,libをそれぞれCUDA/v9.2の中のbin,include,libに入れてしまうという(邪道な)裏技もある。

後はOpenCVの中のdllが存在するディレクトリ(例C:\opencv\build\x64\vc14\bin)にもPathを通しておく。

これで下準備は完了。

こっからソースコードをどかっとインストールして、

build/darknet/darknet.sln

を先ほど入れたVisual Studio community(2015か2017)で開く。

 

 まずはプロジェクト名を右クリックして「ビルドの依存関係」→「ビルドのカスタマイズ」→「CUDA9.1のチェックを外してCUDA9.2にチェックを入れる。」

そして右下あたりにある設定ボタンを押して、

構成→Release

プラットフォーム→x64

に変える。ここでポイントなのだが、基本的にデフォルトの設定はこの構成になっていない。

設定の様々な要素ごとにちまちま構成とプラットフォームを選択できるところがあるのだが、これらは全て上記のReleaseとx64に変えなければならない。じゃなきゃ変なもん参照してエラーが起きる。

 

それを終えたら後もう一息。

設定ボタンから

C/C++」→「全般」→「追加のインクルードディレクトリ」を編集して先ほどpathに追加した

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

こいつと後はincludeのpathを通す

そして同じく設定ボタンから

「リンカー」→「全般」→「追加のライブラリディレクトリ」を編集して

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\lib

C:\opencv\build\x64\vc14\lib

を追加する。

 

まあ要するに、include系のpathは全部追加のインクルードディレクトリに、lib系のpathは追加のライブラリディレクトリに入れましょうということです。

 

ここまでくればもう終わり。

後はビルドすれば

build\darknet\x64

このファイル下にdarknet.exeが出来上がる。コマンドプロントでこいつをひらけば晴れてyolov3はWindows直下で働くようになる。

 

結論引っかかりポイントだったのは

①ちゃんとパソコンの環境変数にpath通したか?

②構成とプラットフォーム全部ちゃんと変えたか?

③includeとlibのpathちゃんとC/C++とリンカーのところに追加したか?

 

この3つにつきたかなあ。いやあ長い戦いだったけど動いた時はなんかちょっと感動した。

 

明日はちょっと戻ってyolov3の環境の整え方(Linux編)でも書こう。