opencvで顔認識でなくて独自の画像認識する方法

opencv(日本語ドキュメント)と、perlから利用するためのモジュールImage::ObjectDetectを使って独自の画像を認識させる方法のメモ。

まず、Ubuntuでのインストール

opencvはシステム→システム管理→Synapticで,編集→検索から"opencv”と入力する。libcv-dev、libcv1などが表示されるので、ダブルクリックで選択して、適用ボタンを押すと、関連するパッケージ一式が/usr/share/opencv以下あたりにインストールされます。

次にperlからopencvを使うためのImage::ObjectDetectは、

sudo cpan Image::ObjectDetect Imager

opencvがインストールされていないと、エラーが出るので、順番はopencv→Image::ObjectDetectの順で。

顔認識

OpenCVを使って画像の物体認識をするPerlモジュール作った
http://d.hatena.ne.jp/spiritloose/20070308/1173314595

の$cascadeのところに指定してあるのが、opencvにプリインされている顔認識用の学習データなので、これを差し替えるべく以下では独自のデータを作成します。

独自画像認識のトレーニン

適当なディレクトリにポジティブ画像(検出すべき物のサンプル./img)と、ネガティブ画像(検出すべき物が写っていない画像./bg)を用意します。学習用のデータを作るには本当は大量のサンプルが必要らしいが、今回はとりあえずの動作確認で、それぞれ2個づつで。詳しいファイルの用意の仕方は以下参照。

OpenCVで物体検出 - createsamples.exe
http://ugd555.blog1.fc2.com/blog-entry-314.html


Haar状特徴に基づくブースト分類器のカスケードを利用する高速物体検知
http://lab.cntl.kyutech.ac.jp/~kobalab/nishida/opencv/haartraining_jp.htm

最初はポジティブ画像をもとにサンプルを作るコマンド

opencv-createsamples -info info.dat -vec a.vec -w 50 -h 50 -num 2 -show

-showオプションをつけると、info.datで指定した座標をもとに切り出した画像をプレビューすることができます。
出力として、a.vecの中にポジティブサンプル学習データが保存されます。

次に、ネガティブ画像を含めた学習データを元に、学習データを作成するコマンドは、

opencv-haartraining -data output -vec a.vec -bg bg.dat -w 50 -h 50 -npos 2 -nneg 4 -mem 500 -maxfalsealarm 0.01 -nstages 3

ここで、bg/の下には4つのネガティブ画像ファイルがあるとします。
出力として、output.xmlが出力されます。

画像認識

上で参照させていただいたここのソースの$cascadeを定義している部分を、生成したoutput.xmlに書き換えます。

認識したい画像ファイルをpicture.jpgに改名して、Perlスクリプトを実行すると、認識したことを表す四角形が表示されますが、、、、多分サンプルがすくなすぎて誤判定が多すぎる。少なくとも数百レベルでやらないとだめか、やっぱり。