TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

DarknetをWindowsにインストールする

以前に行ったマンガの顔パーツ検出では、顔の領域の検出にdlibのHOG+SVMを使った方法で矩形領域を抽出してから、DCNNで顔パーツ検出を行っていた。
HOG+SVMである程度マンガから顔の領域を抽出できるが、少なからず検出漏れがあった。
また、スライディングウィンドウを使用しているため、処理時間がかかる問題もある。

領域の検出自体もディープラーニングで行うことができれば精度が上がるかもしれない。
ディープラーニングを使用した領域の検出にどのような方法があるか調べたら、YOLOv2というアルゴリズムが現時点で最も精度が高く高速で動作するようだ。

YOLOv2の実装は、YOLOv2の作者自身によるC言語で記述されたDarknetというフレームワークが使われている。

pjreddie.com

ビルド環境はLinux向けになっており、Windowsで試すにはプロジェクトの修正が必要になる。

すでにWindows向けにポーティングされていないか調べたら、フォークされたリポジトリがあった。

github.com

これをありがたく使用させていただき、Windowsでビルドを行った。

ビルドは、README.mdの通りに行えば問題なく成功した。

以下に実施した手順を示す。

環境

ビルド手順

Gitリポジトリのclone
git clone https://github.com/AlexeyAB/darknet.git
Visual Studioでプロジェクトを開く

git cloneしたディレクトリ配下の
darknet\build\darknet\darknet.sln
Visual Studioで開く。

ビルド構成設定

ビルド構成を「Release/x64」に変更する。

OpenCVのパス設定

README.mdに書かれているとおり、OpenCV 2.4.9をダウンロードして任意のディレクトリに展開する。
https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.9/opencv-2.4.9.exe/download

プロジェクトのプロパティ->VC++ディレクトリから、OpenCVを展開したディレクトリ配下のopencv\build\includeをインクルードディレクトリに追加する。

ライブラリディレクトリに、OpenCVを展開したディレクトリ配下のopencv\build\x64\vc12\libを追加する。

なお、ディレクトリ名がvc12になっているが、Visual Studio 2015でも問題なく使用できた。

ビルド

ソリューションのビルドを実行する。

成功すると、
darknet\build\darknet\x64
にdarknet.exeができる。

学習済みモデルダウンロード

README.mdに書かれているURLから学習済みモデルをダウンロードして、darknet.exeと同じディレクトリに格納する。
モデルファイルは、4種類ある。
モデルごとに使用メモリサイズ、精度、速度に違いがある。

とりあえずサンプル実行に必要な
yolo-voc.weights
をダウンロードした。
http://pjreddie.com/media/files/yolo-voc.weights

サンプル実行

画像ファイルからオブジェクトを検出するサンプルを試す。

コマンドプロンプトを起動する。

環境変数PATHにOpenCVのパスを設定する。

set path=%path%;H:\src\opencv\build\x64\vc12\bin

OpenCVをH:\srcに展開した場合の例
※システムのプロパティで環境変数PATHに追加してもよい。その場合、設定後はコマンドプロンプトの再起動が必要。

darknet.exeのあるディレクトリに移動する。

cd darknet\build\darknet\x64

サンプルを実行する。

darknet_voc.cmd

以下のような出力がされた後、画像ファイルのパスの入力プロンプトが表示される。

layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  32
    1 max          2 x 2 / 2   416 x 416 x  32   ->   208 x 208 x  32
    2 conv     64  3 x 3 / 1   208 x 208 x  32   ->   208 x 208 x  64
    3 max          2 x 2 / 2   208 x 208 x  64   ->   104 x 104 x  64
    4 conv    128  3 x 3 / 1   104 x 104 x  64   ->   104 x 104 x 128
    5 conv     64  1 x 1 / 1   104 x 104 x 128   ->   104 x 104 x  64
    6 conv    128  3 x 3 / 1   104 x 104 x  64   ->   104 x 104 x 128
    7 max          2 x 2 / 2   104 x 104 x 128   ->    52 x  52 x 128
    8 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256
    9 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128
   10 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256
   11 max          2 x 2 / 2    52 x  52 x 256   ->    26 x  26 x 256
   12 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512
   13 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256
   14 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512
   15 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256
   16 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512
   17 max          2 x 2 / 2    26 x  26 x 512   ->    13 x  13 x 512
   18 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024
   19 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512
   20 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024
   21 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512
   22 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024
   23 conv   1024  3 x 3 / 1    13 x  13 x1024   ->    13 x  13 x1024
   24 conv   1024  3 x 3 / 1    13 x  13 x1024   ->    13 x  13 x1024
   25 route  16
   26 reorg              / 2    26 x  26 x 512   ->    13 x  13 x2048
   27 route  26 24
   28 conv   1024  3 x 3 / 1    13 x  13 x3072   ->    13 x  13 x1024
   29 conv    125  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 125
   30 detection
Loading weights from yolo-voc.weights...Done!
Enter Image Path: 

画像ファイルのパスを入力してEnterを押すと、コンソールに以下のような結果が出力され、検出された領域がウィンドウに表示される。

****.jpg: Predicted in 0.187000 seconds.
boat: 11%
person: 12%
person: 11%
person: 69%
person: 28%

 SRC output_video = 0000000000000000

 cvCreateVideoWriter, DST output_video = 000001D281CC12F0

 cvWriteFrame

また、結果が画像として、darknet.exeのあるディレクトリにpredictions.jpgというファイル名で保存される。

ウィンドウを閉じると次の画像のパスを入力するプロンプトが表示される。
Ctrl+Cで終了する。