OpenCVでとりあえず顔認識のサンプルが動くところまでの記録

2013 年 3 月 4 日 by 山平

最近流行(?)のOpenCVによる画像認識をやってみようとしたのですが、思いのほか苦労が多かったので、サンプルデータで顔認識の動作を確認できたところまでの記録を残しておきます。

OpenCVをダウンロード(2.4.3)

ネット情報にあるインストーラがない
自己解凍exeのみ?
展開したディレクトリをC:\opencv2.4.3に移動

パス(環境変数)の設定

C:\opencv2.4.3\build\x86\vc10\bin
C:\opencv2.4.3\build\x86\vc10

下記サイトに沿って作業

指定したパスに存在しているのにdllが見つからないエラーが発生。
原因は環境変数設定後に、VSSの再起動(反映)していなかったため。
VSS再起動後、正常に動作することを確認。

画像の学習

学習用サンプル画像作成ツール「createsamples.exe」と学習ツール「haartraining.exe」が見つからない。
C:\opencv2.4.3\appsにソースはある。
現バージョンではソース提供のみ??

  • OpenCV-2.4.3.exe:インストーラ、ツール(exe)なし
  • OpenCV-2.3.1-win-superpack.exe:インストーラ、ツール(exe)あり→「C:\opencv2.3.1\build\common\x86」

!!!バージョンを2.3.1に変更して作業続行!!!

パス(環境変数)を変更

-C:\opencv2.4.3\build\x86\vc10\bin
-C:\opencv2.4.3\build\x86\vc10
+C:\opencv2.3.1\build\x86\vc10\bin
+C:\opencv2.3.1\build\x86\vc10

先のサイトのサンプルを修正

なぜか動かない
tdd.dll(Releaseビルド)、tdd_debug.dll(Debugビルド)が見つからないと怒られる

下記サイトの情報をもとにtbbを入手、配置する

以下にtbb.dll配置後、正常に動作することを確認

C:\OpenCV\build\common\tbb\ia32\vc10

※64bit、VCのバージョンによってパスが違う?

画像の学習

「opencv_createsamples.exe」「opencv_haartraining.exe」は「C:\opencv2.3.1\build\common\x86」にある
(opencv_createsamples.exe)を用いた自動学習のための準備

ネットで画像検索
わざと紛らわしい画像もふくめて173枚
人力では収集が難しい
【要検証】紛らわしければ紛らわしいほど精度は上がるのか?
以下で使用するファイルリストはattribコマンド結果を手修正して作成

サンプル作成用のコマンド

C:\opencv2.3.1\build\common\x86\opencv_createsamples.exe -vec C:\ImageDetectionTest\OpenCV\vecfile.vec -img C:\ImageDetectionTest\OpenCV\my_positive_samples\2013-01-10_10.57.46.jpg -bg C:\ImageDetectionTest\OpenCV\attrib.txt -num 7000 -bgthresh 1 -maxxangle 1.5 -maxyangle 1.5 -maxzangle 1.5 -show -w 32 -h 32

エラーが出た

C:\ImageDetectionTest\OpenCV>C:\opencv2.3.1\build\common\x86\opencv_createsamples.exe -vec C:\ImageDetectionTest\OpenCV\vecfile.vec -img C:\ImageDetectionTest\OpenCV\my_positive_samples\2013-01-10_10.57.46.jpg -bg C:\ImageDetectionTest\OpenCV\attrib.txt -num 7000 -bgthresh 1 -maxxangle 1.5 -maxyangle 1.5 -maxzangle 1.5 -show -w 32 -h 32
Info file name: (NULL)
Img file name: C:\ImageDetectionTest\OpenCV\my_positive_samples\2013-01-10_10.57.46.jpg
Vec file name: C:\ImageDetectionTest\OpenCV\vecfile.vec
BG file name: C:\ImageDetectionTest\OpenCV\attrib.txt
Num: 7000
BG color: 0
BG threshold: 1
Invert: FALSE
Max intensity deviation: 40
Max x angle: 1.5
Max y angle: 1.5
Max z angle: 1.5
Show samples: TRUE
Scale: 4
Width: 32
Height: 32
Create training samples from single image applying distortions…
Invalid background description file.

背景ファイルリストの改行コードをCRLFからLFに変えただけでは同じエラーがでる
JPGをjpgに、gif/png行削除してもだめ
“\”を”/”に変換、改行コード変更してもだめ

すごい情報を発見

Hi For Running the createsamples utility… Open CV must be installed in C:\OpenCV

!!!インストールパスをC:\OpenCVに変更して作業続行!!!

パス(環境変数)を変更

-C:\opencv2.3.1\build\x86\vc10\bin
-C:\opencv2.3.1\build\x86\vc10
+C:\OpenCV\build\x86\vc10\bin
+C:\OpenCV\build\x86\vc10

先のサイトのサンプルを修正

今回はあっさり動作した

画像の学習

「opencv_createsamples.exe」「opencv_haartraining.exe」は「C:\opencv2.3.1\build\common\x86」にある
(opencv_createsamples.exe)を用いた自動学習のための準備

サンプル作成

「opencv_createsamples.exe」

サンプル作成用のコマンド

C:\OpenCV\build\common\x86\opencv_createsamples.exe -vec C:\ImageDetectionTest\OpenCV\vecfile.vec -img C:\ImageDetectionTest\OpenCV\my_positive_samples\2013-01-10_10.57.46.jpg -bg C:\ImageDetectionTest\OpenCV\attrib.txt -num 7000 -bgthresh 1 -maxxangle 1.5 -maxyangle 1.5 -maxzangle 1.5 -show -w 32 -h 32

やっぱり同じエラーがでた。パス変更は関係ない?

(前半省略)
Create training samples from single image applying distortions…
Invalid background description file.

ためしに先頭が”-“で始まるファイルをリネームしてもダメ

(自動生成される)正解サンプル用背景画像リスト(ここでは「-bg C:\ImageDetectionTest\OpenCV\attrib.txt」)の内容を
(実行パスからの)相対パスに変更したら処理が開始された!
結局パスは「C:\OpenCV」であるべきなのか?(未調査)

とても時間がかかりそうな雰囲気なので、サンプル作成枚数を7000から100に減らして処理開始
※時間がかかるのではなく、”-show”オプションで表示された生成画像を閉じるかESCでオプションを無効にするまで止まっているだけだった。。。
サンプル作成数を7000に戻して再度実行!
時間計測のため、”-show”オプションを削除してバッチ化
数秒で終了

分類器の学習

「opencv_haartraining.exe」

学習用のコマンド

C:\OpenCV\build\common\x86\opencv_haartraining.exe -data C:\ImageDetectionTest\OpenCV\detector -vec C:\ImageDetectionTest\OpenCV\vecfile.vec -bg C:\ImageDetectionTest\OpenCV\attrib.txt -npos 7000 -nneg 3000 -nstages 30 -mem 1024 -mode ALL -w 32 -h 32

ちょっと動かしてみたけど、とても時間がかかりそうなので、サンプル数を公式推奨値「-npos 7000 -nneg 3000」から「-npos 700 -nneg 300」に変更して実行する
時間計測のため、バッチ化

  • 開始: 2013/01/10 13:34:53.37
  • 終了: 2013/01/15 09:31 ****** 計測断念!

精度について:
学習中に出力される↓の後ろ側の小数値が精度らしい
POS: 700 731 0.957592
NEG: 300 0.00783249
POSが正解率、NEGが不正解率、NEGは5×10^-6ぐらいの値(0.000005)が望ましい(”より小さい”って意味?)らしい。

学習待ちしながら検出プログラムを作成

サンプルデータは以下

  • サンプル画像:C:\OpenCV\samples\c\lena.jpg
  • 顔認識用学習データ:C:\OpenCV\data\haarcascades\haarcascade_frontalface_default.xml

情報としてはズバリだけど、バージョンが1.0
OpenCVはバージョンごとにディレクトリ構成や配布内容が結構変わる
includeしているヘッダが「C:\OpenCV\build\include\opencv」内にある
※”opencv2″じゃない!(旧バージョンの互換性?)

  • 1系はC的なプログラムらしい
  • 2系はC++的なプログラムらしい

将来のことを考えると2系でのコーディングしておいたほうが良さそうなので参考サイトを変更する

追加のインクルードディレクトリ: C:\OpenCV\build\include
参照(デバッグ用に*231d.libも!):
C:\OpenCV\build\x86\vc10\lib\opencv_core231.lib
C:\OpenCV\build\x86\vc10\lib\opencv_imgproc231.lib
C:\OpenCV\build\x86\vc10\lib\opencv_highgui231.lib
C:\OpenCV\build\x86\vc10\lib\opencv_objdetect231.lib

これでサンプルが動作した。
あとは学習待ち。
約2時間経過してノード11。

ノード21開始直後で動かなくなって4日、別マシンでも同じ箇所で停止。
遅すぎるというより固まっている?
処理中止。

Parent node: 21

*** 1 cluster ***
POS: 700 767 0.912647

記の表の”node”または”stage”が一つの強識別器にあたります。
この画面の例では2つの強識別器まで学習が終わっており,stage 2を親ノードとする3番目の強識別器が,3つの矩形特徴(弱識別器)を用いて学習が終わったところです。
もし計算時間がかかりすぎて途中で止めたいときは,Ctrl-Cなどで強制終了して下さい。
再度haartraining.exeを同じオプションで実行すれば,学習が終わったステージから学習が再開されます。
表のNというのは,そのステージの強識別器の学習に要している弱識別器の数で,一つ一つ増やしながら目標となる認識率や許容できる誤認識率を達成するように調整を繰り返していきます。
学習によっては,このNの回数が増え続けていつまでたっても終わらないという場合があります。
これは,現在の学習データではどのようにパラメータを調整しても,なかなか目標値を達成できないということであり,その場合は学習画像の数やcreatesamplesのパラメータを調整するなどして,再度チャレンジした方が良いかもしれません。

以降の作業を検討

  1. 途中までのデータは使えるのか?
    使えない(xmlが作成されていない)

    1. 実行を中止したバッチを再実行
    2. 大幅に簡略化したバッチを作成して実行
      → -npos 70 -nneg 30 -nstages 15
      すぐに完了、使い物にならないレベル
    3. もう少し学習時間をかけたバッチにして実行
      → -npos 70 -nneg 30 -nstages 20
      わりとすぐに完了、多少ましになったけどまだまだ
    4. もう少し学習時間をかけたバッチにして実行
      → -npos 700 -nneg 300 -nstages 20
      半日で終了、実用的ではないが精度向上は確認できる
  2. 完了させる手順
    調査せず

タグ: , ,

TrackBack