最近物体抽出の分野で割と名前を聞くことが多くなったYou Only Look Once(YOLO)を使ってみたくなったので、Windowsで環境構築をしてみることにしました。
今回は、特に最新のYOLOv2について試してみたいと思います。
論文は以下のリンクをご参照ください。
論文:YOLO9000: Better, Faster, Stronger
目次
YOLOについて
Deep Learningで画像中のオブジェクトの抽出と分類を行う手法で、特にリアルタイムで高速な処理が行えることに特色があります。
例えば、画像中から何かを発見するというタスクがあった場合に、今までは物体がありそうな領域をスライディングウィンドウなどで抽出して、その物体に対して人なのか、猫なのか、犬なのかという分類を行っていました。
しかし、この二段階を行うと当然計算時間が増えるということで、抽出と分類を同時にやってしまうのがこのYOLOという手法です。
YOLOv2はYOLOの発展版で、最近だとOpenCVの最新版でも使えるようになっているなど、注目が高まっている手法です。
よって、OpenCVからのYOLOの利用も可能ですが、今回はDarknetベースで行ってみたいと思います。
Darknetについて
YOLOは DarknetというDeep Learningのフレームワークで実装されています。知名度は高くありませんが、TensorflowやCaffe、Chainerなどと同じようなDeep Leaningのフレームワークと考えればよいでしょう。そして、YOLOはこのDarknetというフレームワークで実装されています。
その理由としては、Darknetの制作者がYOLOを考案しているためです。
現在では他のTensorflowなどのフレームワークでYOLOを使うことについてもいろいろと情報があるような気がしますが、今回は簡単なのでDarknetを利用してYOLOの精度を確認してみたいと思います。
今回の環境
・OS : Windows10(64bit)
・GPU: GeForce GTX 950
・CUDA 8.0(導入済) 導入方法は過去記事を参照
・cuDNN v5.1(導入済) 導入方法は過去記事を参照
・Visual Studio 2015 Community(導入済)
・OpenCV 3.3.1(未導入)
今回、CUDAは導入済の状態でスタートしたいと思います。
未導入の方は先にCUDAを入れる必要があると思いますので、過去記事を参照してください。
導入手順
(1) DarknetのWindows向けリポジトリのダウンロード
Darknet自体はLinux向けのフレームワークとなっており、Windowsで使うためには修正が必要です。
しかし、既にWindows向けのリポジトリがGithubに存在していますので、今回はこちらを使いましょう。
外部サイト:Windows向けDarknetリポジトリ(Github)
「Clone or download」をクリックします。右のDownload ZIPからファイルをダウンロードします。保存場所はどこでも大丈夫なので、ダウンロードしたZIPファイルを解凍してください。
「\build\darknet」フォルダの中に、Visual Studioのソリューションファイルが入っているので、こちらを起動しましょう。
「Release/x64」に変更して、[Shift]+[F5]でビルドします。
この状態だとエラーが出ます。OpenCVの環境構築ができていないエラーのようです。
Darknet自体はCとCUDAを用いたフレームワークですが、物体の抽出と分類した結果をグラフィカルに表示するためにOpenCVを利用しています。
よって、OpenCVの環境構築が必要です。
OpenCVのバージョンについてですが、ダウンロードしたリポジトリのREADME.mdを読むと、
This repository supports:
* both Windows and Linux
* both OpenCV 3.x and OpenCV 2.4.13
* both cuDNN 5 and cuDNN 6
* CUDA >= 7.5
* also create SO-library on Linux and DLL-library on Windows
と記載されておりますので、OpenCVは3系でも2系でも良いようです。
取りあえず、最新版(2017年12月現在)のOpenCV 3.3.1でやってみましょう。
(2) OpenCVのダウンロード
OpenCVの公式から、OpenCVの3.3.1をダウンロードします。
外部サイト:OpenCV Release
Windowsなので、「Win pack」を選びます。
すると、インストーラがダウンロードされるので、これを起動してください。
インストール場所は自由に選択して問題ありませんが、私は取りあえずCドライブ直下に「opencv331」というフォルダを作成し、そこをダウンロード場所に指定しました。
あとは自動でOpenCV3.3.1がダウンロードされます。
ダウンロードが終わったら、環境変数の編集を行いましょう。
環境変数を編集して、Pathに「C:\opencv331\opencv\build\bin」を加えてください(Cドライブ直下の「opencv331」フォルダにOpenCVをダウンロードした場合)。
(3) Darknetのビルド
次に、先ほどのVisual Studioのプロジェクトに戻ってOpenCVの設定をします。
やることとしては以下の三点です。プロパティページのプラットフォームがx64になっていることを確認してください。
① プロジェクトのプロパティページ「VC++ディレクトリ->インクルードディレクトリ」に「C:\opencv331\opencv\build\include」を追加。
② プロジェクトのプロパティページ「リンカー->全般->追加のライブラリディレクトリ」に「C:\opencv331\opencv\build\x64\vc14\lib」を追加。
③ プロジェクトのプロパティページ「リンカー->入力->追加の依存ファイル」に「opencv_world331.lib」を追加。
これで、再び[Shift]+[F5]でビルドが成功しました。
(4) YOLOで物体抽出と識別
これで「x64」フォルダに「darknet.exe」という実行ファイルが生成されます。
この実行ファイルに、認識させるネットワークの設定ファイルである「.cfg」と、ネットワークの重みが保存されている「.weights」、認識させるテスト画像を渡すことで実行が可能となります。
この実行を行うために、「.cmd」ファイルが既に存在しているはずなので、これをメモ帳などのエディタで開いてみましょう。「darknet_voc.cmd」を開きます。
どうやらこの.cmdファイルを利用すると「darknet.exe」が2回実行されるようです。
右側に画像ファイル名があるので、こちらを編集して自分の画像ファイル名に書き換えましょう。私は今回、用意した画像名を「test.jpg」としました。
次に、認識させたいtest.jpgを「darknet.exe」と同じファイルに配置してください。
最後に、ネットワークの重みを用意します。YOLOの公式サイトから、重みのファイルをダウンロードしましょう。
YOLO公式サイト:YOLO: Real-Time Object Detection
YOLOv2の重みをダウンロードします。YOLOv2の右の「weights」からダウンロードしてきた「yolo-voc.weights」ファイルを「D:\Darknet\darknet-master\build\darknet\x64」の中に入れます。
そして、「darknet_voc.cmd」をダブルクリックで実行します。
cmdファイルの中身的に2回実行がされますが、おそらく閾値が異なるため、状況により2枚で違う結果がでるかもしれません。
(5) 実行結果
今回のテスト画像です。
それに対し、今回得られた結果画像です。大体正しいような気もしますが、3箇所認識されていますね。
まとめ
今回はDarknetの環境構築ということで、YOLOv2を動かしてみました。
今回は予め用意されたネットワーク構造と、ネットワークの重みに対して、画像を通して認識結果を確認しただけでしたが、本来実用的な面で考えると、自分で学習画像を用意して学習をさせて、抽出を行ったりできるようにしておきたいものです。
次回以降は、そのあたりについて触れてみたいと思います。