カスケード 分類 器。 OpenCVの勉強③(分類器を作成してみる)

OpenCVで顔認証を行いトリミングして保存する

カスケード 分類 器

検出できるオブジェクトのタイプ Computer Vision Toolbox のオブジェクト カスケード検出機能では、縦横比があまり変化しないオブジェクト カテゴリを検出できます。 縦横比が一定であるオブジェクトには、顔、一時停止標識、特定方向から見た自動車などがあります。 System object は、イメージ上でウィンドウをスライドさせてイメージ内のオブジェクトを検出します。 その後、カスケード分類器を使用して、ウィンドウに関心対象のオブジェクトが含まれるかどうかを判断します。 さまざまなスケールでオブジェクトを検出するためにウィンドウのサイズは変わりますが、縦横比は固定されています。 ほとんどの 3 次元オブジェクトでは縦横比が変わるため、検出器は、面外の回転により非常に大きな影響を受けます。 したがって、オブジェクトのすべての向きを使って検出器を学習させなければなりません。 1 つの検出器ですべての向きを処理できるように学習させることはできません。 カスケード分類器の仕組み カスケード分類器は複数のステージで構成されています。 それぞれのステージは弱学習器のアンサンブルです。 弱学習器は "決定株" と呼ばれるシンプルな分類器です。 各ステージの学習にはブースティングという手法が使用されます。 "ブースティング" は、弱学習器による決定の加重平均を取ることで、非常に正確な分類器を学習させる機能を提供します。 分類器の各ステージにより、スライディング ウィンドウの現在の位置で定義される領域にポジティブまたはネガティブのラベルが付けられます。 "ポジティブ" はオブジェクトが見つかったことを、 "ネガティブ" はオブジェクトが見つからなかったことを示します。 ラベルがネガティブの場合には、この領域の分類が完了し、検出器はウィンドウを次の位置にスライドさせます。 ラベルがポジティブの場合は、分類器がその領域を次のステージに渡します。 検出器は、最後のステージで領域がポジティブと分類された場合、現在のウィンドウ位置で見つかったオブジェクトを報告します。 これらのステージは、できるだけ早期にネガティブ サンプルを棄却するように設計されています。 ここでは大部分のウィンドウには関心のあるオブジェクトが含まれないことを仮定しています。 逆に、真陽性は稀であるため、時間をかけて確認する必要があります。 "真陽性" は、ポジティブ サンプルが正しく分類された場合に生じます。 "偽陽性" は、ネガティブ サンプルが誤って正として分類された場合に生じます。 "偽陰性" は、ポジティブ サンプルが誤って負として分類された場合に生じます。 検出器が適切に機能するためには、カスケードの各ステージで偽陰性率が低く設定されていなければなりません。 あるステージでオブジェクトが誤って負と判断されると分類処理が停止するため、この誤りを修正することはできません。 ただし、各ステージの偽陽性率は高い値に設定できます。 検出器でオブジェクトでないものが正と判断されても、その誤りはその後のステージで修正できます。 カスケード分類器の全体的な偽陽性率は f s です。 ここで、 f は範囲 0 1 にある各ステージの偽陽性率を、 s はステージ数をそれぞれ示します。 同様に、全体的な真陽性率は t s であり、 t は範囲 0 1] にある各ステージの真陽性率を示します。 したがって、ステージ数を増やすと全体的な偽陽性率が下がりますが、全体的な真陽性率も下がります。 trainCascadeObjectDetector を使用したカスケード分類器の作成 カスケード分類器の学習には一連のポジティブ サンプルと一連のネガティブ イメージが必要です。 ポジティブ サンプルとして使用する、関心領域が指定された一連のポジティブ イメージを提供しなければなりません。 を使用して、関心のあるオブジェクトに境界ボックスでラベルを付けることができます。 イメージ ラベラーは、ポジティブ サンプルとして使用されるテーブルを出力します。 また、関数でネガティブ サンプルを自動的に生成するための一連のネガティブ イメージも提供しなければなりません。 検出器の精度が適切な水準に達するよう、ステージ数、特徴のタイプおよびその他の関数パラメーターを設定します。 条件 考慮事項 学習セットが大きい 千単位。 ステージ数を増やして各ステージの偽陽性率を高い値に設定します。 学習セットが小さい。 ステージ数を減らして各ステージの偽陽性率を低い値に設定します。 オブジェクトを検知できない確率を減らす。 真陽性率を大きくします。 ただし、真陽性率が高い場合、各ステージで必要な偽陽性率が得られず、検出器で誤検知が多発する可能性があります。 誤検知の数を減らす。 ステージ数を増やすか、各ステージの偽警報率を減らします。 学習に使用できる特徴のタイプ 必要なオブジェクト検出のタイプに適した特徴を選択してください。 は、Haar、ローカル バイナリ パターン LBP 、勾配方向ヒストグラム HOG の 3 つのタイプの特徴をサポートしています。 Haar 特徴および LBP 特徴は、スケールの細かいテクスチャの表現に向いているため、顔の検出によく使用されます。 HOG 特徴は、人や自動車などのオブジェクトの検出によく使用されます。 これらはオブジェクトの全体的な形状をキャプチャするのに便利です。 たとえば、以下に示す HOG 特徴の可視化では、自転車の外郭がわかります。 また、次の 2 つの方法のいずれかを使用してポジティブ サンプルを手動で指定することもできます。 最初の方法では、大きいイメージ内に四角形の領域を指定します。 これらの領域には関心のあるオブジェクトが含まれています。 2 番目の方法では、関心のあるオブジェクトをイメージからトリミングし、これを個別のイメージとして保存します。 その後、イメージ全体を領域として指定できます。 さらに、既存のサンプルに回転やノイズを加えたり、輝度やコントラストを変更して、追加のポジティブ サンプルを生成することもできます。 ネガティブ イメージの指定 ネガティブ サンプルは明示的に指定されません。 代わりに、関数 は、ユーザーが指定した、関心のあるオブジェクトが含まれないネガティブ イメージから自動的にネガティブ サンプルを生成します。 関数は新しい各ステージを学習させる前に、ネガティブ イメージで既に学習済みのステージから構成される検出器を実行します。 これらのイメージから検出されたオブジェクトはすべて誤検知であり、ネガティブ サンプルとして使用されます。 この方法では、カスケードの新しい各ステージが、その前のステージで生じた誤りを正すように学習が行われます。 ステージを追加するにつれて検出器の全体的な偽陽性率が下がるため、ネガティブ サンプルの生成は難しくなります。 そのため、ネガティブ イメージをできる限り多く提供すると役に立ちます。 学習の精度を高めるには、関心のあるオブジェクトに通常関連のある背景を含むネガティブ イメージを提供してください。 また、関心のあるオブジェクトに似た外観をもつ、オブジェクトではないものを含むネガティブ イメージも含めます。 たとえば、一時停止標識検出器を学習させる場合、一時停止標識に類似した交通標識や形を含むネガティブ イメージを含めてください。 ステージ数の選択 各ステージの偽陽性率が低く、より少数のステージと、各ステージの偽陽性率が高く、より多数のステージには、トレードオフ効果が存在します。 偽陽性率が低いステージは、より多くの弱学習器を含むため、複雑度が高くなります。 一方、偽陽性率が高いステージには、より少数の弱学習器が含まれます。 一般に、ステージが増えるにつれて全体的な偽陽性率は指数的に小さくなるため、シンプルなステージを多く含める方が得策です。 3 ステージ構成の場合には、これが 12. ただし、ステージ数が大きいほど、分類器に必要な学習データの量は増大します。 また、ステージ数を増やすと偽陰性率も高くなります。 この増加により、ポジティブ サンプルを誤って棄却する確率が上がります。 偽陽性率 FalseAlarmRate とステージ数 NumCascadeStages は、全体的な偽陽性率が許容範囲内に収まるように設定してください。 その後、この 2 つのパラメーターを実験的に調整できます。 学習が早期終了する場合もあります。 たとえば、ステージ数パラメーターを 20 に設定したにもかかわらず、7 ステージ後に学習が停止したとします。 その場合、関数で十分な数のネガティブ サンプルが生成されなかった可能性があります。 関数を再実行してステージ数を 7 に設定しても、同じ結果は得られません。 各ステージで使用される正とネガティブ サンプルの数は新しいステージ数に合わせて再計算されるため、結果はステージごとに異なります。 検出器の学習所要時間 良質の検出器の学習には数千単位の学習サンプルが必要です。 大量の学習データを処理するには数時間から数日に及ぶ長い時間がかかります。 学習所要時間は指定した特徴のタイプによって異なります。 Haar 特徴を使用すると、LBP や HOG 特徴を使用した場合よりもずっと多くの時間がかかります。 トラブルシューティング ポジティブ サンプルが足りなくなった場合の対処方法 関数 は、各ステージの学習に使用されるポジティブ サンプルの数を自動的に決定します。 この数は、ユーザーが提供したポジティブ サンプルの総数と、 TruePositiveRate および NumCascadeStages パラメーターの値に基づいています。 各ステージの学習に使用可能なポジティブ サンプルの数は、真陽性率に依存します。 この率は、ポジティブ サンプルのうち関数で負として分類することのできるサンプルの割合を指定します。 いずれかのステージで負として分類されたサンプルが、その後のステージに進むことはありません。 たとえば、 TruePositiveRate を 0. 9 に設定し、使用可能なサンプルのすべてが第 1 ステージの学習に使用されたとします。 学習を継続した場合、各ステージの学習に使用できるサンプル数は徐々に減り続けます。 したがって、後続の各ステージでは、より少数のポジティブ サンプルを使用して、さらに困難な分類問題を解かなければなりません。 ステージが進むにつれて使用できるサンプル数が少なくなると、後のステージでデータの過適合が生じる可能性が大きくなります。 各ステージの学習には同数のサンプルを使用するのが理想的です。 そのためには、各ステージの学習に使用されるポジティブ サンプルの数が、使用可能なポジティブ サンプルの総数未満でなければなりません。 唯一の例外として、 TruePositiveRate の値にポジティブ サンプル総数を乗算した値が 1 未満の場合には、ポジティブ サンプルが負として棄却されることはなくなります。 関数では、次の式を使用して各段階で使用するポジティブ サンプルの数を計算します。 これは、ポジティブ サンプルのうち負として棄却されるサンプルの数を確実に予測するのは不可能なためです。 ポジティブ サンプルの数が足りなくなると学習は停止され、関数から警告が出力されます。 関数からは、その時点までに学習の済んだステージを含む分類器も出力されます。 学習が停止した場合、ポジティブ サンプルをさらに追加することができます。 あるいは TruePositiveRate の値を大きくすることも可能です。 ステージ数を減らすオプションもありますが、その場合は全体の偽警報率が増加する可能性があります。 ネガティブ サンプルが足りなくなった場合の対処 関数は各ステージで使用されるネガティブ サンプルの数を計算します。 これは各ステージで使用されるポジティブ サンプルの数に、 NegativeSamplesFactor の値を乗算して求められます。 ポジティブ サンプルの場合と同様に、計算されたネガティブ サンプル数を特定のステージで必ずしも使用できるとは限りません。 関数 trainCascadeObjectDetector は、ネガティブ イメージからネガティブ サンプルを生成します。 ただし、新しいステージに進むにつれてカスケード分類器の全体的な偽警報率が下がるため、ネガティブ サンプルが見つかる確率も下がります。 ネガティブ サンプルの数が足りなくなると学習は停止され、関数から警告が出力されます。 また、その時点までに学習の済んだステージを含む分類器も出力されます。 学習が停止した場合は、ネガティブ イメージをさらに追加するのが最良の対処法です。 あるいは、ステージ数を減らしたり、偽陽性率を高く設定することもできます。 例 ここでは NegativeSamplesFactor が 2 に設定されているため、各ステージの学習に使用されるネガティブ サンプル数は 172 個です。 関数は第 6 ステージ用に 33 個のネガティブ サンプルのみを生成し、第 7 ステージの学習に至らなかった点に注意してください。 この状況は、第 7 ステージのネガティブ サンプル数が 17 未満 その前のネガティブ サンプル数の約半分 であったために発生します。 この関数では、指定した 10 ステージ構成の代わりに 6 ステージ構成の一時停止標識検出器が生成されます。 その結果として得られる全体的な偽警報率は 0. 28e-05 となり、予想偽警報率は 1. 024e-07 です。 この時点でネガティブ イメージをさらに追加するか、ステージ数を減らすか、偽陽性率を大きくすることができます。 たとえば、偽陽性率 FalseAlarmRate を 0. 5 に上げることが可能です。 その場合、全体の予想偽陽性率は 0. 0039 となります。 手順 4: 検出器を学習させます。 Automatically setting ObjectTrainingSize to [35, 32] Using at most 42 of 42 positive samples per stage Using at most 84 negative samples per stage --cascadeParams-- Training stage 1 of 5 [........................................................................ ] Used 42 positive and 84 negative samples Time to train stage 1: 0 seconds Training stage 2 of 5 [........................................................................ ] Used 42 positive and 84 negative samples Time to train stage 2: 1 seconds Training stage 3 of 5 [........................................................................ ] Used 42 positive and 84 negative samples Time to train stage 3: 3 seconds Training stage 4 of 5 [........................................................................ ] Used 42 positive and 84 negative samples Time to train stage 4: 9 seconds Training stage 5 of 5 [........................................................................ ] Used 42 positive and 17 negative samples Time to train stage 5: 11 seconds Training complete 新たに学習させた分類器を使用して、イメージ内の一時停止標識を検出します。

次の

カスケード型分類器 — opencv 2.2 documentation

カスケード 分類 器

カスケード分類器というものを使って入力した画像から顔を検出します。 カスケード分類器 カスケードとは、連続したもの、数珠繋ぎになったものを意味します。 カスケード分類器は、いくつかの特徴量をまとめた学習データです。 ここでの顔検出の流れは、• 入力画像の特徴を抽出• カスケード分類器よりその特徴にマッチする部分を探す となります。 また、カスケード分類器は以下の特徴のどれかを使って作成することができます。 Haar-Like特徴• LBP特徴• HOG特徴 これらの特徴の詳しい説明は省きます・・・ ではHaar-Like特徴とLBP特徴のカスケード分類器を標準で提供しています。 で顔検出 ここではHaar-Like特徴を用いた分類器を使用します。 detectMultiScale image, faces, 1. imageは入力画像 の行列• objectsは矩形を要素とするベクトル• scaleFactorは各画像スケールにおける縮小量• minNeighborsは検出される領域の候補となる矩形は最低でもこの数の近傍矩形を含む• png 第二引数ではカスケード特徴器を指定しています。 これを変えると顔検出ではなく目の検出などもできるようになります。 画像検出 まずはlenna できました。 次はの画像 凄い。 カスケード型分類器• で物体検出• HOG特徴の実装• 立大のhaar-like特徴量のpdf• 猿でもわかる顔検出の原理• detectMultiScaleについて hyottokoaloha.

次の

カスケード分類器

カスケード 分類 器

カスケード分類器変換 05. 08 カスケード分類器変換 以前 「」にて登場しましたカスケード分類器に搭載しますフィルター(下記は人の正面顔用)を振り返ってみたいと思います。 OpenCVの物体認識はNeuralNetworkConsoleでやってきたように「機械学習」を用いており、特徴量を検出することにより判別しておりパターンマッチングではありませんでした。 その方法は下記の二種類の方法で実施していました。 2)traincascade(トレインカスケード) haartrainingのあとに作られました。 Haar-Like特徴・LBP特徴・HOG特徴から1つを選択できます ・ Haar-Like特徴 Haar-Like特徴は、画像の明暗差により特徴を捉えます。 ・LBP(Local Binary Pattern)特徴 LBP (Local Binary Pattern)特徴は、輝度の分布(ヒストグラム)により特徴を捉えます。 顔や人を認識させるために「 カスケード分類器」というものをロードしてくることによって使用しました。 カスケード分類器は下記一覧にあるxlmファイルをパラメータとして用いることにより様々なものを分類することができました。 exe」というツールと正解・不正解を教示する写真を用意し機械学習することにより特徴量を算出し独自のxlmパラメータを作成すること出来ることが分かったのです。 【カスケード分類器による人の顔識別例】 そこで、今回ビデオからのデータ並びに水増しデータにより合計51326枚作成されましたので、このカスケード分類器の精度を向上させるために再度パラメータを作成したいと思います。 一応念のために漢字を含まない名称のフォルダーを作成した方が妥当だと思われます。 その中に下記の3つの名称のフォルダーを作成します。 「NG」にはワオの顔以外が写っている写真をコピーして入れます。 この場合今回の場合だとワオキツネザルに似通った別の猿の顔があると汎用性が高まると考えています。 まずNG. TXTは先ほど作成したNGフォルダーに入っているファイル名を全て羅列した内容のテキストファイルです。 【正誤テキスト】 NG. txt OK. txt OK. TXTは正解ファイルなのですが少々ややこしいのですが、例えば下記のような場合左の赤線の部分に正解があるといったように記述します。 そのために下記のように指定します。 パス付ファイル名 発見個数 先頭x y 幅 高さ 【矩形切り出し例】 しかしながら1つや2つならともかく、数万とあると人力でやるには時間がかかりすぎます。 TXT のようにコマンド出力すると全てのファイル名が一瞬でOK. TXTに書かれますので、テキストエディターのマクロを利用して後ろの部分を自動作成していくのです。 これで全て準備は整いました。 exe」コマンドを利用して学習用ベクトルを作成します。 始める前に言っておかないといけないことがあります。 それはこれ以降の操作が非常にデリケートで、且つ非常に時間がかかるということです。 ではその理由を順に説明していきましょう。 exe -info OK. txt -vec wao. vec -num 51326 -img 学習の元画像を示します。 -vec 学習用画像データ出力ファイル名です。 -num 作成する学習サンプル画像の数です。 -bgcolor 背景色を示します。 -w 学習サンプル画像の横幅(ピクセル)を指定します。 -h 学習サンプル画像の縦幅(ピクセル)を指定します。 【結果】 少々時間がはかかりましたが無事に作成完了。 ところが次の学習を行うと通常ステージが繰り上がって何度も繰り返すのですが、1日待っても全く動作している気配がなくなってしまいました。 どうやら「学習ループ」というスパイラルにはまって無限ループになったようです。 またよく出力コメントを見ると学習ベクトルを作成した時の画面サイズは24x24で解像度がめちゃくちゃ低いことが判明。 exe -info OK. txt -vec wao. vec -num 51326 -w 125 -h 125 【結果】 結果はベクトルのサイズが2ギガを超える容量のファイルが出来上がり学習を起動すると、無反応のまま停止したため中止。 exe -info OK. txt -vec wao. vec -num 51326 -w 64 -h 64 【結果】 作成完了。 次の学習も正常に起動しています。 vec -bg NG. txt -numPos 10000 -numNeg 970 -featureType HAAR -mode ALL -w 64 -h 64 -data 出力したい学習結果xmlファイル名です。 -vec 学習サンプルデータを指定します。 -bg 非オブジェクト画像リストを記したテキストファイルを指定します。 -numPos, -numNeg それぞれ学習させる正解画像,非正解画像の枚数を指定します。 -w, -h createsamplesで指定したものをそのまま使用して下さい。 -mode使用するオブジェクト検出特徴の種類を指定します 最初正解画像は登録枚数設定しましたが、学習ループという迷宮に入り込み1日経ってもうんともすんとも言わなくなったので強制停止。 次に30000をテストすると、学習ループではなく正常に処理しているようですが時間が食い過ぎているため、止む無く強制停止。 現在10000でテスト中。 このようにカスケード分類器と言えども、ツールが非常にデリケート且つ時間がかかるので試行錯誤の連続なのです。 ちなみにネットなどで見てみると、数件のデータで十数分との記述がありました。 ちなみにGGEが前回ワオのカスケード分類器を作成したときにはおよそ4日かかりました。 今回はお正月休みで約一週間なるので、何とか終了してほしいものです。

次の