Rapid Object Detection with a Cascade of Boosted Classifiers Based on Haar-like Features
以下の手順でカスケードを訓練します.
1.ネガティブサンプル収集
↓
2.ポジティブサンプル生成
↓
3.訓練
↓
4.テスト
ネガティブサンプルは検出対象が映っていない任意の画像です.対象物が映っていなければどのような画像でも構いません.
ネガティブサンプルは3000枚程度あれば効率的です.ネガティブサンプルと同じディレクトリに,
ネガティブサンプル記述ファイル(以下,背景記述ファイルと呼ぶ)を作成する必要があります.
背景記述ファイルはテキストファイルとして作成し,収集したネガティブサンプルのファイル名を記述します.
ディレクトリ構成例:
/imgbr
img1.jpgbr
img2.jpgbr
bg.txt
上記の例のように,imgディレクトリにポジティブサンプルimg1.jpg,img2.jpgおよび
背景記述ファイルbg.txtが格納されているディレクトリ構成の時,
背景記述ファイルbg.txtは次のようになります.
背景記述ファイルbg.txt:
img/img1.jpgbr
img/img2.jpg
※OpenCVマニュアルによると,jpg画像は画像によって圧縮率が異なるため
サンプルとしては推奨されていません.マニュアルはbmpフォーマットを推奨しています.jpgでもできますが.
▼Googleイメージ検索を利用して画像を自動的に収集するツールです.
http://www.vector.co.jp/soft/win95/net/se371065.html
▼ファイル名を一括変換するツールです.
http://www.vector.co.jp/soft/win95/util/se090597.html
▼ファイル名一覧をテキストに書き出すツールです.
http://www.oohara.jp/ppp/listing.html
ポジティブサンプルは,検出対象が映っている画像です.ただし,対象物が画像内のどの位置にあるかを把握する必要があるため,
画像を単に拾ってくるだけではいけません.ポジティブサンプルは以下の2つの方法のどちらかを用いて生成する必要があります.
ポジティブサンプルは7000枚程度あれば効率的です.
1.createsamples ユーティリティを使用
2.objectmarker ユーティリティを使用
1.createsamples ユーティリティを使用
createsamplesユーティリティは,OpenCV/bin/ディレクトリ内にあります.
createsamples.exeは,対象物が映った画像とネガティブサンプルを合成して,ポジティブサンプルを生成するユーティリティです.
対象物が映った画像を1枚用意します(rawdata.jpgとする).この画像は,画像いっぱいに対象物が映っているものでなければなりません.
一般画像から対象物部分のみを切り出すなどして作成してください.
createsamples.exeはコンソールです.
以下のコマンドライン引数を渡して実行します.
コマンドライン引数:
-vec <vec_file_name>
訓練用ポジティブサンプルから構成される出力ファイルの名前
-img <image_file_name>
もとになる対象画像(例えば会社のロゴマーク)
-bg <background_file_name>
背景記述ファイル;画像のリスト.この背景画像に,ランダムに変形された対象物の画像が張り合わされて
ポジティブサンプルが生成される.
-num <number_of_samples>
生成されるポジティブサンプルの数
-bgcolor <background_color>
背景色(ここではグレースケール画像を扱うことを仮定しています)
背景は透明色で表現します.画像によっては圧縮処理が施されている場合もありますので,
背景色の範囲を-bgthreshによって指定できます. bgcolor-bgthreshとbgcolor+bgthreshの間の値を持つ
全ての画素が透明色として扱われます.
-bgthresh <background_color_threshold>
-inv
記述された場合は色を反転します
-randinv
記述された場合は色をランダムに反転しま
-maxidev
指定された前面画像の最大明度偏差の範囲内で画素をサンプルします
-maxxangle <max_x_rotation_angle>
-maxyangle <max_y_rotation_angle>
-maxzangle
最大回転角度[rad]を指定
-show
記述された場合は各サンプルが表示されます.ESCキーを押すと表示が止まり,
サンプル生成プロセスは続行されます.デバッグに便利です.
-w
出力サンプル画像の幅[pixel]
-h <sample_height>
出力サンプル画像の高さ[pixel]
例えばディレクトリ構成が以下のような場合を考えます.
OpenCV/bin/
createsamples.exe
img/
img1.jpg
img2.jpg
bg.txt
positives/
rawdata.jpg
vec/
このとき次のように実行します.
createsamples.exe -vec ./positives/vec/vecfile.vec -img ./positives/rawdata.jpg
-bg ./img/bg.txt -num 7000 -bgthresh 1 -maxxangle 1.5 -maxyangle 1.5 -maxzangle 1.5 -show -w 24 -h 24
※マニュアルによると,-wと-hは20〜30がよいらしい.
2.objectmarker ユーティリティを使用
objectmarkerユーティリティは,画像内の対象物を矩形で囲んだとき,その4つの頂点の座標を取得するユーティリティです.
objectmarkerユーティリティは以下のサイトからダウンロードできます.
http://robotik.inflomatik.info/
サイト内の「OpenCV object detection framework」欄から「Exsample package」を選択します.
ダウンロードできたら,次は対象物が映っている複数の画像を収集します.
収集したら背景記述ファイルのようなテキストファイル(info.txt)を作成し以下のように記述します.
ディレクトリ構成:
createsamples.exe
positives/
objectmarker.exe
info.txt
vec/
rowdata/
img1.jpg
img2.jpg
info.txt:
./rawdata/img1.jpg 1 120 100 50 50
./rawdata/img2.jpg 2 110 150 45 45 40 30 20 20
info.txtの書式は「ファイルパス 画像内の対象物の数 対象物1を囲む矩形の座標 ・・・」です.
info.txtからポジティブサンプルを生成するため,createsamples.exeを使用します.
createsamples.exeの使用法は1.createsamplesユーティリティを使用と同じですが,
コマンドライン引数の-imgを-infoに代える必要があります.
-info
マークアップした画像の記述ファイル
ネガティブサンプルとの合成は行われず,座標から直接対象物を抽出するため,
使用するコマンドライン引数は-vec,-info,-num,-w,-hのみになります.
例えば以下のように実行します.
createsamples.exe -vec ./positives/vec/vecfile.vec -info ./positives/info.txt -num 7000 -w 20 -h 20
objectmarkerユーティリティの使用法については,同梱されているreadme.txtに書かれています.
翻訳してありますので参考にしてください.
readme.txt(翻訳済み:PDF)
※以上でポジティブサンプルの生成は終了ですが,
createsamples.exeを使用すると作成したポジティブサンプルを確認することが出来ます.
ポジティブサンプルを確認するには以下のように実行します.
createsamples.exe -vec ./positives/vec/vecfile.vec -w 20 -h 20
OpenCV/bin/ディレクトリにある,haartrainingユーティリティを使用して分類機の訓練を行います.
このユーティリティもコンソールアプリです.コマンドライン引数を以下に示します.
コマンドライン引数:
- data <dir_name>
訓練後の分類器を保存するディレクトリ名
-vec <vec_file_name>
ポジティブサンプルファイルの名前
(trainingsamplesユーティリティーもしくは他の方法で作成されたファイル)
-bg <background_file_name>
背景記述ファイル
-npos <number_of_positive_samples>,
-nneg <number_of_negative_samples>
各分類器ステージの訓練で用いられるポジティブ/ネガティブサンプルの数.
効率的な値は npos = 7000 と nneg = 3000です.
-nstages <number_of_stages>
訓練されるステージの数.
-nsplits <number_of_splits>
分類器のステージの中で利用される弱分類器を決定します.
1の場合には,単純な切株分類器が用いられ, 2 以上の場合には,
number_of_splits内部(分岐)ノードを持つCART分類器が用いられます.
-mem <memory_in_mb>
予備計算のために利用可能なメモリをMBで記述します.
メモリが多ければ多いほど,訓練プロセスは,より高速になります.
-sym (default),
-nonsym
訓練において対象物のクラスが垂直軸に対して対称性があるかどうか
指定します.この対称性があれば訓練プロセスは高速化できます.
例えば、正面から見た場合の顔には垂直軸に対して対称性が見られます.
-minhitrate <min_hit_rate>
各ステージの分類器に対する必要とされるヒットレートの最小量.
全体的なヒットレートは (min_hit_rate^number_of_stages)によって
評価されます.
-maxfalsealarm <max_false_alarm_rate> <max_false_alarm_rate><br>
各ステージ分類器に対する要求されるフォールスアラームレートの最大.
全体的なフォールスアラームレートは(max_false_alarm_rate^number_of_stages)で評価されます.
- weighttrimming <weight_trimming>
どれだけの加重トリミングが利用されるべきか,もしくは利用するのかどうかを明記します.
きちんとした値は0.90です.
-eqw
-mode <basic (default) | CORE ALL> <BASIC (dafault) | CORE | ALL
訓練に用いられるハール特徴集合のタイプを選択します.
BASICは直立した特徴のみを用い,ALLは直立した特徴と45度回転した特徴の全てを用います.
-w <sample_width>,
-h <sample_height>
訓練サンプルのサイズ(画素数).訓練サンプル生成時と正確に同じ値でなければなりません.
例えば以下のようなディレクトリ構成を考えます.
ディレクトリ構成:
OpenCV/bin/
haartraining.exe
img/
img1.jpg
img2.jpg
bg.txt
positives/
rawdata.jpg
vec/
vecfile.vec
data/
cascade/
このとき例えば次のように実行します.
haartraining.exe -data ./data/cascade -vec ./positives/vec/vecfile.vec
-bg ./img/bg.txt -npos 7000 -nneg 3000 -nstages 30 -mem 1300 -mode ALL
-w 20 -h 20</i>
※実行中に現れる処理経過の表示について
「POS:」と書かれた行はヒットレートを表しています.
「NEG:」は失敗のレート?「POS:」の値は1.0かそれに近い値になるはずです.
「NEG:」の値は5×10^-6オーダーであるのが望ましい(らしい).この値が高すぎると使い物にならないそうです.
「NEG:」がマイナスになることがありますが,これは失敗が非常に少ないという意味で,
言うまでも無く訓練が成功しているということになります.(多分)