概要
こんにちは、初の投稿となります。
最近Deep Learningへの注目が高まると同時に、
QiitaでもDeep Learning(CNN) に関する投稿が急激に増えています。
しかし、それらの多くはCaffeやChainerといったフレームワークの導入やサンプルを実行してみたものが多く、実際にどう使うのか?という投稿は少ないように見えます。
例えば、CNNを使うにしても愚直にSliding Windowでサーチを行うのは膨大な処理時間がかかってしまい実用的ではありません。
特にマシンビジョンの現場では複雑な形状のものを複数検出するといったことが多く、CNNを使う前に出来るだけ候補のオブジェクトを絞り込みたいという状況がよく発生します。これはR-CNN(Region Convolution Neural Network)と呼ばれています。
手法としてはいくつかありますが、今回はOpenCVのContributionにあるBING(Objectness)を使用してCNNを使う前の候補(オブジェクト)を検出してみたいと思います。
BINGとは
BING(Binarized Normed Gradients for Objectness Estimation)
BINGはオブジェクトっぽいものを矩形領域として高速に抽出してくれる手法です。
詳しくは南開大學のホームページを参照してください。
こちらの記事によると300fpsのスピードで検出ができるようです。
[注意] 64bitバージョンでないとこのスピードは出ないようです。
手順
試した環境:Windows7 (64bit), Visual Studio 2013 Community
適当に下記のものをダウンロードして、インストールしてください。
OpenCV3.0のダウンロード
Contribution3.0の[ダウンロード] (https://github.com/Itseez/opencv_contrib/releases/tag/3.0.0)
Cmakeのダウンロード
CmakeでConfigureボタンを押して自身のVisualStudioのバージョンを選択します。次に[OPENCV_EXTRA_MODULE_PATH]にインストールしたcontributionのmoduleフォルダをパス指定します。後は生成されたソルーションをビルド、インストールして出来上がったライブラリにパスを通してください。
※Cmakeを使ったことがない方はこのへんのページを参考にしてインストールしてください。
結果
今回学習済みモデルは付属のObjectnessTrainedModelを使いました。
下図は空港画像の結果です。(※検出したすべてを表示すると良く分からないため、検出したオブジェクトの中でサイズを限定して描画しています)
うーん、それほど位置は正確ではありませんが、なかなかオブジェクトっぽいところを検出しているようです。では次にもっと複雑な画像で試してみましょう。
下図は交差点画像の結果です。
変な所を多々検出していますね。。。
しかし、贔屓目にみれば割りと人と車に集中して矩形が描かれています。
まとめ
あまり複雑でない画像や速度が求められる場合においてはそれなりの結果を得られると思います。一方、正確なオブジェクトの輪郭を求めたい場合には不向きだと思います。
ただ、BINGも学習する画像次第で大きく結果は変わりそうです。
=誰かBINGの学習方法を教えて下さい=
また、R-CNNではBINGの他に最近流行りのSelective SearchやCPMC,Object proposals,Randomized Prim’s (RP)などがあるので近いうちに他のものも試して見たいと思います。
参考文献
南開大學ホームページ(http://mmcheng.net/bing/)
Generating Object Proposals(https://pdollar.wordpress.com/2013/12/22/generating-object-proposals/)
ディープラーニングにおける様々な物体領域検出のアプローチ方法(R-CNN)
(http://qiita.com/t-hiroyoshi/items/e9def50ba2c2249db04b)