7

LBP ベースの顔検出について助けが必要なので、これを書いています。

OpenCV に実装された顔検出に関連して、次の質問があります。

  1. lbpCascade_frontal_face.xml (これは opencv からのもの): internalNodes、leafValues、tree、features などとは何ですか? それらがアルゴリズムで使用されていることは知っています。しかし、それぞれの意味がわかりません。たとえば、特定の段階で特定の機能を使用し、他の機能を使用しないのはなぜですか? どの機能/ノードを選択するかをどのように決定していますか?
  2. LBP_frontal_face_classifier.xml の特徴値とは何ですか? 私はそれらが4つの整数のベクトルであることを知っています。しかし、この機能をどのように使用すればよいでしょうか? 最初の機能へのステージ 0 アクセスだと思っていましたが、アクセスはこのパターンではありません。この機能へのアクセス パターンは何ですか?

  3. 文献のすべての論文は、高レベルの概要のみを提供します。それらの記述は、主に近傍ピクセルからの LBP 計算で構成されています。しかし、この LBP 値は、分類子の要素に対してどのように使用されるのでしょうか?

  4. 積分画像は、ピクセルの LBP 値の計算にどのように役立ちますか? HAARがどのように使われているか知っています。LBPを理解する必要があります。

私はいくつかの論文、記事を読みました。しかし、LBP ベースの顔検出のしくみやアルゴリズムの詳細について明確に説明しているものはありません。誰かが自分で顔検出プログラムを開発したい場合、従うべき手順は何ですか? それについて説明しているドキュメントはありません。

できれば、これらについて私を助けてください。私は感謝されます。

4

1 に答える 1

15

トピックに軽く触れた過去の私自身の回答を参照してください。ただし、XML カスケード形式については説明していません。

1 つのステージと 3 つの機能のみを持つカスケードの例をわかりやすくするために変更したの を見てみましょう。

<!-- stage 0 -->
<_>
  <maxWeakCount>3</maxWeakCount>
  <stageThreshold>-0.75</stageThreshold>
  <weakClassifiers>
    <!-- tree 0 -->
    <_>
      <internalNodes>
        0 -1 3 -67130709 -21569 -1426120013 -1275125205 -21585
        -16385 587145899 -24005</internalNodes>
      <leafValues>
        -0.65 0.88</leafValues></_>
    <!-- tree 1 -->
    <_>
      <internalNodes>
        0 -1 0 -163512766 -769593758 -10027009 -262145 -514457854
        -193593353 -524289 -1</internalNodes>
      <leafValues>
        -0.77 0.72</leafValues></_>
    <!-- tree 2 -->
    <_>
      <internalNodes>
        0 -1 2 -363936790 -893203669 -1337948010 -136907894
        1088782736 -134217726 -741544961 -1590337</internalNodes>
      <leafValues>
        -0.71 0.68</leafValues></_></weakClassifiers></_>

あと少し……。

<features>
  <_>
    <rect>
      0 0 3 5</rect></_>
  <_>
    <rect>
      0 0 4 2</rect></_>
  <_>
    <rect>
      0 0 6 3</rect></_>
  <_>
    <rect>
      0 1 4 3</rect></_>
  <_>
      <rect>
      0 1 3 3</rect></_>

...

最初にステージのタグを見てみましょう:

  • ステージのmaxWeakCountは、ステージ内の弱分類器の数であり、コメントで a<!-- tree -->と呼ばれるものと、LBP 機能と呼ばれるものです。
    • この例では、ステージ 0 の LBP 特徴の数は です 3
  • これは、少なくともステージを通過するため stageThresholdに機能の重みを合計する必要があるものです。
    • この例では、ステージのしきい値は -0.75です。

LBP 機能を説明するタグに目を向けると、次のようになります。

  • internalNodes11 個の整数の配列です。最初の 2 つは、LBP カスケードでは意味がありません。3 番目は、XML ファイルの最後にある sの<features>テーブルへのインデックスです (Aはフィーチャのジオメトリを記述します)。最後の 8 つの値は 8 つの 32 ビット値で、以前の回答で説明した 256 ビット LUT を一緒に構成します。この LUT はトレーニング プロセスによって計算されますが、私自身は完全には理解していません。 <rect><rect>
    • この例では、ステージの最初の機能は 、4 つの整数で記述されている3四角形を参照しています。 0 1 4 3
  • leafValues、フィーチャに関連付けられた 2 つの重み (合格/不合格) です。機能評価中に選択されたビットに応じて、internalNodesこれら 2 つの重みのいずれかが合計に追加されます。この合計は、ステージの と比較され<stageThreshold>ます。次に、bool stagePassed = (sum >= stageThreshold - EPS);EPS1e-5 であり、ステージが成功したか失敗したかを判断します。重みもトレーニング プロセスによって決定されます。
    • この例では、最初のフィーチャの不合格の重みは -0.65 で、合格の重みは 0.88です。

最後に<feature>タグです。<rect>これは、フィーチャのジオメトリを表す 4 つの整数を含むタグの配列で構成されます。処理ウィンドウ (あなたの場合は 24x24) が与えられると、最初の 2 つの整数は処理ウィンドウ内の整数ピクセル オフセットを表し、次の 2 つの整数は LBP 機能に必要な 9 つのうちの 1 つのサブ長方形のxy表します評価される。

<rect> ft.x ft.y ft.width ft.height </rect>本質的に、処理ウィンドウpW.widthx内にあるタグは、xpW.heightに顔が存在するかどうかをチェックします...pW.xpW.y

http://i.stack.imgur.com/NL0XX.png

LBP を評価するには、点で積分イメージを読み取り、9 つのサブ長方形の積分を計算するためにp[0..15]使用するだけで十分です。中央のサブ長方形 R4 は、R0 から時計回りに他の 8 つのサブ長方形と比較され、8 ビットの LBP が生成されます (ビットはパックされています [msb 01258763 lsb]) p[BR]+p[TL]-p[TR]-p[BL]

次に、この 8 ビット LBP は、フィーチャの (2^8 = 256) ビット LUT ( ) へのインデックスとして使用され、<internalNodes>1 つのビットが選択されます。このビットが 1 の場合、特徴は顔と矛盾しています。0 の場合、顔と一致します。次に、適切な重み ( <leafNode>) が返され、他のすべてのフィーチャの重みが追加されて、ステージ全体の合計が生成されます。次に、これを比較し<stageThreshold>て、ステージが成功したか失敗したかを判断します。

十分に説明できていないことが他にある場合は、明確にすることができます。

于 2014-03-21T17:31:22.223 に答える