2013年12月11日水曜日

OpenCVのカスケード分類器の学習の章を訳してみた

オリジナルはここ
専門用語が理解できていないため、パラメータに関しての訳はかなり怪しい。
また、これだけ呼んだだけでは、各パラメータに指定すべき値が分からないので、辞書作成用のチュートリアルが欲しい。


ここから

カスケード分類器の作業は、学習と検出の2段階です。検出は、OpenCVのドキュメントの検出モジュールに記載されている。ドキュメントには、カスケード分類器の基本情報が記載されている。
ここでは、カスケード分類器の学習方法、学習データの準備とアプリの使用方法を示す。

注意事項
OpenCVは、 opencv_haartraining と opencv_traincascadeの2種類のカスケード分類器の学習アプリケーションがある。opencv_traincascade の方がOpenCVのVer2以降のC++APIで書かれており新しい。
しかし、大きな差異は、opencv_traincascadeは、HaarとLBP特徴量の両方をサポートしている。LBP特徴量は、整数なので、Haarと比較して学習と検出の速度が数倍早い。検出精度は、学習に依存しており、第一に学習用のデータの質であり、その次に学習パラメータである。LBPの分類器でもHaarの分類器と同等の性能を得ることは可能である。

opencv_traincascade と opencv_haartrainingの学習データは、異なるフォーマットで保存される。
新しいインタフェースは、両方のフォーマットをサポートしている。(オブジェクト検出のCascadeClassifier classを参照) opencv_traincascadeは、古いフォーマットで保存することができる。
しかし、opencv_traincascade と opencv_haartraining は、処理の途中で異なるタイプのフォーマットのデータを読み込むことはできない。
TBBオプションでOpenCVをビルドした場合、opencv_traincascadeは、TBBによりマルチコアに対応する。
また、学習用の支援ツールが準備されている。

・opencv_createsamplesは、ポジティブデータとテストデータを準備するために使用でき、opencv_haartraining
and opencv_traincascadeの両方で使用できる、ポジティブサンプルのデータを作成する。
出力ファイルの拡張子は、.vecであり、画像データを含むバイナリデータである。
・opencv_performanceは、opencv_haartrainingで作成した分類器の精度を評価するために使用される。事前に準
備したリストを用いて、分類器を実行し、検出できた数、できなかった数、誤検出などの情報を報告する。

opencv_haartraining は、サポートを廃止したので、これ以降、opencv_traincascadeのみ説明する。
opencv_createsamplesは、opencv_traincascadeの学習データの準備に必要なので合わせて説明する。

学習データの準備
学習には、ポジティブ、ネガティブの2種類のデータが必要である。ポジティブ画像は、検出対象の画像であり、ネガティブ画像は、検出対象ではない画像である。ポジティブ画像のデータセットは、opencv_createsamplesで作成できるが、ネガティブ画像のデータセットは手動で準備しなければいけない

ネガティブサンプル
ネガティブ画像は、検出対象を含まない任意の画像である。ネガティブ画像のデータセットのための、専用ファイルが必要である。各ラインに専用ファイルからの相対パスを含むファイル名を記したテキストファイルである。
ネガティブ画像は、背景画像と呼ばれることもあり、本ドキュメントでは、同じ意味である。画像のサイズは異なっていてもよいが、学習ウィンドウサイズよりも大きくなければいけない。
というのは、学習用のサイズに縮小されるためである。

bg.txtとネガティブ画像を格納したimageフォルダーが同じ場所にある場合、
bg.txtの内容は
image/image1.jpg
image/image2.jpg
のようになる

ポジティブサンプル
opencv_createsamplesで作成する。検出対象を含む1枚の画像から、あるいは、ネガティブのように専用ファイルから作ることもできる。ツールを使用する前に、多くのデータを準備する必要がある。

OpenCVのロゴのような剛体の場合、1枚の画像を準備するだけでよいが、顔の場合、百、あるいは、千必要となる。顔の場合、人種、年代、表情、ひげなど考慮しないといけない。

1 単一物体の画像
大量のポジティブサンプルの画像は、与えられた画像を回転させたり、明るさを変えたり、任意の背景の上に重ねたりして作られる

opencv_createsamples utilityの引数により、変化量をコントロールする。

引数
-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 <max_intensity_deviation>
 サンプルの明るさの変化の最大値

-maxxangle <max_x_rotation_angle>
-maxyangle <max_y_rotation_angle>
-maxzangle <max_z_rotation_angle>
radiansで指定された最大回転角度

-show
 デバッグオプション 指定すると、各サンプルが表示される Escキー押下で次の画像に移動する

-w <sample_width>
 出力画像の幅

-h <sample_height>
 出力画像の高さ

サンプル画像の作成のために以下の処理が行われる。
  1. 入力画像を、ランダムの角度で3軸方向に回転させる
  2. bg_color-bg_color_threshold; bg_color+bg_color_thresholdの色が透過色としてみなされる
  3. 白色雑音が、前景に加算される
  4. -invの指定があれば、前景の明るさが反転される
  5. -randinvがあれば、ランダムに色を反転するかどうか決められる
  6. 最後に、作成した画像を任意の画像上に重ねる
  7. -w and -h のサイズに大きさを変える
  8. -vecで指定されたファイルに保存する

2 ポジティブサンプル
ポジティブサンプルは、事前にマークアップした画像からも得ることがきる。サンプル用画像は、背景画像のリストファイルのようなフォーマットでテキストフファイルに記述される。
各行は、画像に対応している。1番目は、ファイル名、2番目は、オブジェクトの数、そのあとは、オブジェクトを示す矩形情報(X座標 Y座標、幅、高さの組み合わせ)をオブジェクトの数だけ

info.datとポジティブ画像を格納したimageフォルダーが同じ場所にある場合、

info.datの内容は
image/image1.jpg 1 140 100 45 45
image/image2.jpg 2  100 200 50 50   50 30 25 25
のようになる

image1.jpgは、1つのオブジェクトを含んでおり、その矩形情報は、 (140, 100, 45, 45)を示す
image2.jpgは、2つのオブジェクトを含んでおり、その矩形情報は、(100 200 50 50) と (50 30 25 25)を示す

サンプル用画像からポジティブサンプルを作成するには、-img の代わりに、-infoを引数とする
-info <collection_file_name>
マークアップした画像情報を格納したファイル名

作成手順は以下様になる
  1. オブジェクトを切り出す
  2. -w, -hのサイズに大きさを変える
  3. -vecで指定されたファイルに保存する

変形処理は行われないので、有効な引数は、-w, -h, -show and -numとなる。
opencv_createsamples は、ポジティブサンプルファイル内のサンプル画像を調べるために使用されるかも知れない。その場合、引数は、-vec, -w and -h を使用する。

opencv/data/vec_files/trainingfaces_24-24.vecは、vec-fileのサンプルである。
window size -w 24 -h 24で顔検出器の学習用に使用される

カスケード学習
次は分類器の学習である。opencv_haartraining か opencv_traincascade のどちらかを使用することができるが、opencv_traincascadeの説明を行う

opencv_traincascade のコマンドラインの引数は、目的別に分類されている。

 1 共通
-data <cascade_dir_name>
 結果ファイルの保存フォルダー名

-vec <vec_file_name>
 opencv_createsamples で作成されたvecファイル

-bg <background_file_name>
 背景ファイルのリストを格納したファイル

-numPos <number_of_positive_samples>
-numNeg <number_of_negative_samples>
 各ステージで使用する、ポジティブ、ネガティブのサンプル数
-numStages <number_of_stages>
 学習ステージ数

-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>
 事前計算した特徴量用のメモリサイズ

-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>
 事前計算した特徴量用のバッファメモリー 多いと計算速度が速くなる

-baseFormatSave
 Haar-like 向けに使用され、古いフォーマットで保存される。

2 カスケードパラメータ
-stageType <BOOST(default)>
 学習ステージのタイプ。現時点ではboostのみサポート 

-featureType<{HAAR(default), LBP}>
 特徴量のタイプ
-w <sampleWidth>
-h <sampleHeight>
 サンプルのサイズ。opencv_createsamplesで使用したサイズを指定すること

3 Boost分類器のパラメータ
-bt <{DAB, RAB, LB, GAB(default)}>
 boost分類器のタイプ
 DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost.

-minHitRate <min_hit_rate>
 各ステージでの最小ヒット率
  min_hit_rate^number_of_stagesで、ヒット率を予測できる

-maxFalseAlarmRate <max_false_alarm_rate>
 各ステージでの最大false alarm率  
 max_false_alarm_rate^number_of_stagesで、false alarm率を予測できる

-weightTrimRate <weight_trim_rate>
 値によりトリミングを行うか指定する
 0.95が好ましい
-maxDepth <max_depth_of_weak_tree>
 弱検出器の最大の深さ 1が好ましい

-maxWeakCount <max_weak_tree_count>
 -maxFalseAlarmRateを達成用に必要とされる各ステージでの弱分類器の最大数

4 Haar-like 特徴量用のパラメータ
 -mode <BASIC (default) | CORE | ALL>
 学習に使用する基本特徴量のタイプ
 基本は、直行特徴量のみ使用 ALLの場合、45度回転した特徴量も使用
 詳細は、[Rainer2002]を参照

5 LBP 特徴量用のパラメータ
  なし

 学習が終了したら、-data で指定したフォルダーに、cascade.xml が作成される。途中で中断すると、作業ファイルが作成されるので、手動で削除すること。

以上

0 件のコメント:

コメントを投稿