3

カスケード分類子 (haar のような機能を使用) に関しては、AdaBoosting などのメソッドを使用して、検出に「最適な」機能を選択することを常に読んでいます。ただし、これは、ブーストを開始する機能の初期セットがある場合にのみ機能します。

24x24 ピクセルの画像を考えると、162,336 の可能性のある haar 特徴があります。私はここで間違っているかもしれませんが、openCV のようなライブラリーがこれらすべての機能に対して最初にテストを行うとは思いません。

私の質問は、最初の機能がどのように選択されているか、またはどのように生成されているかです。機能の初期数に関するガイドラインはありますか?

そして、162,336 のすべての機能が最初に使用された場合。それらはどのように生成されますか?

4

3 に答える 3

6

あなたの質問から、あなたが 1,62,336 個の機能とは何かを知りたいと思っていることがわかりました。

ヴィオラ・ジョーンズの 4 つのオリジナル機能 ( http://en.wikipedia.org/wiki/Viola%E2%80%93Jones_object_detection_framework )から

4 つの元の特徴のサイズと 24*24 入力画像上のそれらの位置を変えることで、1,62,336 の特徴を生成できます。

たとえば、互いに隣接する 2 つの長方形を持つ元のフィーチャの 1 つを考えてみましょう。各長方形のサイズが 1 ピクセルであるとします。最初に、1 つの長方形が 24*24 画像の (0,0) に存在する場合、それは 1 つの機能と見なされます。今度は、水平方向に 1 ピクセル ((1,0) に) 移動すると、次のように 2 番目の機能と見なされます。その位置は (1,0) に変更されます。このようにして、水平方向に (22,0) まで移動して、23 個の特徴を生成できます。同様に、縦軸に沿って (0,0) から (0,23) まで移動すると、24 個の特徴を生成できます。ここで、すべての位置 (たとえば (1,1),(1,2).....(22,23) ) をカバーする画像を移動すると、24*23=552 の特徴を生成できます。

ここで、各長方形の幅が 2 ピクセル、高さが 1 ピクセルであるとします。最初に、1 つの長方形が (0,0) に存在し、上記のように水平軸に沿って (20,0) まで移動すると、21 個のフィーチャを持つことができます。 0) から (0,23) まで、24 個の特徴を持つことができます。したがって、画像上のすべての位置をカバーするように移動すると、24*21=504 個の特徴を持つことができます。

このようにして、画像全体をカバーするたびに、各長方形の高さを 1 ピクセルとして維持しながら、各長方形の幅を 1 ピクセルずつ増やして、幅が 1 ピクセルから 24 ピクセルに変化するようにします。機能数 = 24*(23+21+19.....3+1)

ここで、各長方形の幅が 1 ピクセル、高さが 2 ピクセルであるとします。最初に 1 つの長方形が (0,0) に存在し、水平軸に沿って (23,0) まで移動すると、幅が 1 ピクセル、垂直軸に沿って移動すると高さが 2 ピクセルになるため、23 個の特徴を持つことができます。 (0,0) から (0,22) までの場合、23 個の特徴を持つことができます。したがって、画像上のすべての位置をカバーするように移動すると、23*23=529 個の特徴を持つことができます。

同様に、画像全体をカバーするたびに、各長方形の高さを 2 ピクセルに保ちながら、各長方形の幅を 1 ピクセルずつ増やして、幅が 1 ピクセルから 24 ピクセルに変化するようにすると、no になります。特徴量 = 23*(23+21+19.....3+1)

ここで、各長方形の幅を 1 ピクセルから 24 ピクセルに変更した後、各長方形の高さが 24 ピクセルになるまで、各長方形の高さを 1 ピクセルずつ増やすと、

番号。特徴量 = 24*(23+21+19.....3+1) + 23*(23+21+19.....3+1) + 22*(23+21+19... ..3+1) +.................+ 2*(23+21+19.....3+1) + 1*(23+21+ 19.....3+1)

            = 43,200 features

ここで、1 つの長方形が上下に配置された 2 つの長方形 (つまり、長方形が垂直に配置されている) を持つ 2 番目のヴィオラ ジョーンズの元の機能を考えると、これは 1 番目のビオラ ジョーンズの元の機能に似ているため、次のようになります。

番号。機能数 = 43,200

同様に、上記のプロセスに従うと、水平方向に沿って配置された 3 つの長方形を持つ 3 番目の元のヴィオラ ジョーンズ フィーチャから、

番号。特徴量 = 24*(22+19+16+....+4+1) + 23*(22+19+16+....+4+1) + 22*(22+19+16+ ....+4+1) +................+ 2*(22+19+16+....+4+1) + 1*(22 +19+16+....+4+1)

            =27,600

ここで、垂直に配置された 3 つの長方形 (つまり、1 つの長方形が別の長方形の上にある) を持つ別の機能を考えると、次のようになります。

番号。機能の数 = 27,600 (3 番目のオリジナルのヴィオラ ジョーンズ機能に似ているため)

最後に、4 つの長方形を持つ 4 番目の元のヴィオラ ジョーンズ機能を考慮すると、次のようになります。

特徴の数 = 23*(23+21+19+......3+1) + 21*(23+21+19+......3+1) + 19*(23+ 21+19+……3+1) …………+ 3*(23+21+19+……3+ 1) + 1*(23+21+19+......3+1)

           = 20,736

これらすべての機能を合計すると、= 43,200 + 43,200 + 27,600 + 27,600 + 20,736 になります。

                                     = 1,62,336 features

したがって、上記の 1,62,336 個の特徴から、Adaboost はそれらのいくつかを選択して強力な分類器を形成します。

于 2015-01-03T16:27:45.817 に答える
2

おそらく、あなたはこのトピックに関するViola/Jones のオリジナル作品に精通していると思います。

まず、フィーチャ タイプ (例: Rectangle A) を手動で選択します。これにより、弱分類器をトレーニングできるマスクが得られます。マスクをピクセルごとに移動して再トレーニング (膨大な時間がかかり、精度も向上しません) を回避するために、トレーニング済みの弱分類器ごとに特徴が x 方向と y 方向にどれだけ移動するかを指定できます。ジャンプのサイズは、データのサイズによって異なります。目標は、マスクが検出されたオブジェクトに出入りできるようにすることです。フィーチャのサイズも可変です。

それぞれの機能 (マスク位置など) を使用して複数の分類子をトレーニングした後、通常どおり AdaBoost とカスケードのトレーニングに進みます。

機能/弱分類器の数は、データと実験の設定 (つまり、使用する分類器の種類) に大きく依存します。パラメータを広範囲にテストして、どのタイプの機能が最適かを知る必要があります (長方形/円/テトリスのようなオブジェクトなど)。私は 2 年前にこれに取り組みましたが、どの機能と機能生成ヒューリスティックが最良の結果をもたらしたかを評価するのにかなりの時間がかかりました。

どこかから始めたい場合は、元の 4 つの Viola/Jones 機能の 1 つを取り、それを (0,0) に固定して適用する分類子をトレーニングします。(x,0) で次の分類器をトレーニングします。次は (2x,0)....(0,y), (0,2y), (0,4y),.. (x,y), (x, 2y) など...起こります。ほとんどの場合、弱い分類子を少なくしても問題ないことがわかるでしょう。つまり、マスクのスライド方法を決定する x/y ステップ値を増やすことができます。時間を節約するために、マスクを大きくしたり、他のことをしたりすることもできます。この「怠惰な」特徴生成が機能する理由は、AdaBoost です。これらの特徴が分類器をランダムよりわずかに良くする限り、AdaBoost はこれらの分類器を意味のある分類器に結合します。

于 2014-12-07T13:53:57.907 に答える
0

ここには少し混乱があるように思えます。
受け入れられた答えでさえ、私には正しくないようです(おそらく私はそれをうまく理解していません)。元の Viola-Jones アルゴリズム、Lienhart-Maydt アルゴリズムとしてのその後の主な改善、および Opencv 実装はすべて、機能セットのすべての機能を順番に評価します。Opencv のソース コード(および任意の実装) を
確認できます。 関数 void CvHaarEvaluator::generateFeatures() の最後に、numFeatures があります。これは、BASIC モードでちょうど 162,336 で、サイズは 24x24 です。 そして、すべての機能セットが featureEvaluator ( source )の形式で提供されると、それらすべてが順番にチェックされます。

bool isStageTrained = tempStage->train( (CvFeatureEvaluator*)featureEvaluator, curNumSamples,
  _precalcValBufSize, _precalcIdxBufSize, *((CvCascadeBoostParams*)stageParams) );

すべての弱分類器は、各特徴をチェックし、その時点で最良の結果をもたらすものを選択することによって構築されます (決定木の場合、プロセスは同様です)。
この選択の後、サンプルの重みがそれに応じて変更されるため、次のラウンドですべての機能セットから別の機能が再び選択されます。単一の機能評価は計算コストが低くなりますが、numFeatures を掛けると負荷が高くなる可能性があります。
カスケードのトレーニング全体には数週間かかる場合がありますが、ボトルネックは機能評価プロセスではなく、最新の段階で収集されるネガティブ サンプルです。
あなたが提供したウィキペディアのリンクから、私は読みました:

標準の 24x24 ピクセルのサブウィンドウでは、合計で M= 162,336 の可能な特徴があり、画像をテストするときにそれらすべてを評価するには法外な費用がかかります。

これは、長いトレーニング プロセスの後、検出アルゴリズムが非常に高速になり、少数の機能 (トレーニング中に選択された機能のみ) をチェックするだけで済むことを意味します。

于 2015-12-19T09:27:48.410 に答える