以前に行ったマンガの顔パーツ検出では、顔の領域の検出にdlibのHOG+SVMを使った方法で矩形領域を抽出してから、DCNNで顔パーツ検出を行っていた。
HOG+SVMである程度マンガから顔の領域を抽出できるが、少なからず検出漏れがあった。
また、スライディングウィンドウを使用しているため、処理時間がかかる問題もある。
領域の検出自体もディープラーニングで行うことができれば精度が上がるかもしれない。
ディープラーニングを使用した領域の検出にどのような方法があるか調べたら、YOLOv2というアルゴリズムが現時点で最も精度が高く高速で動作するようだ。
YOLOv2の実装は、YOLOv2の作者自身によるC言語で記述されたDarknetというフレームワークが使われている。
ビルド環境はLinux向けになっており、Windowsで試すにはプロジェクトの修正が必要になる。
すでにWindows向けにポーティングされていないか調べたら、フォークされたリポジトリがあった。
これをありがたく使用させていただき、Windowsでビルドを行った。
ビルドは、README.mdの通りに行えば問題なく成功した。
以下に実施した手順を示す。
環境
- Windows 10 Home 64bit
- Visual Studio 2015 Community
- CUDA 8.0 (GPUはGeForce 1080を使用)
ビルド手順
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
サンプル実行
画像ファイルからオブジェクトを検出するサンプルを試す。
コマンドプロンプトを起動する。
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で終了する。