コンピュータビジョン最先端ガイドの人物検出サンプルプログラムを動かしてみる

概要

コンピュータビジョン(CV)の本を買った。サンプルを動かしてみる。

環境

  • VC++2008 ExpressEdition
  • OpenCV1.0 は別途インストールする必要がある。

用意するもの

sample code

コンピュータビジョン最先端ガイドの出版元HPからサンプルコードをダウンロード (opluse.shop-pro.jp/?pid=21043524) ObjectDetection.zip です。

画像データ

車に乗せるカメラで人を検出するという応用目的で、人の画像と人でない画像を集めた画像データベースがある。このデータベースを使って人を検出するプログラムの有効性を評価しようというもの。

ダイムラークライスラー社の関係と思われる画像データベースが、Daimler Pedestrian Classification Benchmark Dataset。

http://www.gavrila.net/Research/Pedestrian_Detection/Daimler_Pedestrian_Benchmark_D/Daimler_Pedestrian_Class__Benc/daimler_pedestrian_class__benc.html

ここから、DC-ped-dataset_base.tar.gz をダウンロードする。ほかにも DC-ped-dataset_add-1.tar.gz などあるが、このサンプルプログラムを動かすだけなら必要ない。

解凍すると画像ファイルが沢山できるが、形式がPGM という一般人にはあまりなじみのないもの。http://vision.kuee.kyoto-u.ac.jp/lecture/dsp/?menu=sample_pnm

を参考にしてViewerをダウンロードしておく。

手順の補足メモ

ダウンロードしたものにインストラクションが書いてあるので、アルゴリズムが判っていれば、インストラクションに沿ってやれば多分できる。が、とりあえず動かしてみたい、アルゴリズムの中身はおいておいて、という人向けにメモを残しておく。

まず、人の画像と、人でない画像をプログラムにわからせます。学習、と呼ばれるプロセスです。学習した結果を使って、未知の画像を人の画像、そうでないかを判定して、プログラムの良し悪しを評価します。これは識別(評価、テスト)と言われます。これを、アダブーストと呼ばれる機械学習手法を使ってやってみます。

学習

まず学習。学習をするプログラム(プロジェクト)は、\ObjectDetection\training にあるtraining.sln です。ここに入っている学習機(Adaboost)に人の画像と、人でない画像のリストを渡します。リストは、ObjectDetection\data\list\training_list の中に入れます。人の画像リストは、poslist.txt. 人でない画像のリストはneglist.txtというファイルに入れます。

リストの作り方。まず、すでにダウンロードしたダイムラークライスラーの画像データベース(DC-ped-dataset_add-1.tar.gz)を解凍する。すると、DC-ped-dataset_base の下に、 1,2,3,T1,T2というディレクトリができる。それぞれにディレクトリには、人の画像4800枚、人でない画像5000枚がある。

ディレクトリ T1に移って下記のコマンドを入力します.

dir ped_examples /b /s > poslist.txt

dir non-ped_examples /b /s > neglist.txt

これでT1の人画像がposlist.txtに、人でない画像がneglist.txtに書き出される。

この操作を他の 1,2,3,T2 のディレクトについてもやって、画像リストを作っておくとよい。あとで識別(テスト)するときに使う。

手始めに、T1のサンプルを学習に使うことにして、T1のディレクトリのposlist.txt neglist.txt を\ObjectDetection\data\list\training_list に入れます。

\ObjectDetection\training にあるtraining.sln をビルドして実行すると学習が始まります。小一時間結構待ちます。

終了すると、識別器は/ObjectDetection/data/training_data/classifier.txt, 確率密度関数は/ObjectDetection/data/training_data/pdf/に出されます。RealAdaboostと呼ばれる学習アルゴリズムを使っています。両者の意味はアルゴリズムを勉強しないと意味不明だと思います。

認識

上で学習した結果を使って、未知の画像を認識してみます。識別のプログラムはObjectDetection\testing にあります。

識別器の能力を計ります。機械なので間違えますのでその能力を2つの指標で評価します。

一つ目は、人とわかっている画像を入力して、識別器が人と判定する割合と、人と判定できなかった割合を調べます。これはmiss rate と呼ばれます。人の画像を見せて、すべて人と認識したら、ミスは0%です。少なければ優秀な機械です。

もうひとつは、人でない画像を入力して、人を間違って判定してしまう割合を調べます。false positive といいます。間違って、人だ、と言ってしまう割合です。もちろん、少ないほうが優秀な機械です。

この評価をするために、再び人の画像リストと、人でない画像のリストをつくります。学習の時は、T1の画像を使ったので、そのほかの画像、たとえば 1 の画像を使うなら、1 のフォルダにさっき作った poslist.txt と neglist.txt を \ObjectDetection\data\list\testing_list にコピーします。これで1の人画像がposlist.txtで、人でない画像がneglist.txtで指定されます。

認識するには、ObjectDetection\testing\testing.sln をビルドして実行すればよいのだが、実行する前に結果の出力先output.txtを確認する。

\ObjectDetection\data\testing_data というディレクトリをあらかじめ作っておかないと、output.txtが作られない。ソースを見ればすぐわかるのだが、ダウンロードしたものを解凍しただけだと、testing_dataなるフォルダがなく、結果出力を見ることができないので注意。

おまけ

imageMagick なにやらいろいろ使えそう。

PerlMagick for activestate perl , ImageMagickObject OLE control for VBscript, WSH とある。

http://www.imagemagick.org/script/command-line-tools.php