10

P. Viola と M. Jones の検出フレームワークを C++ で実装しようとしています (最初は、単にシーケンス分類子 - カスケード バージョンではありません)。最も重要な AdaBoost コア アルゴリズムにもかかわらず、必要なすべてのクラスとモジュール (たとえば、統合イメージ、Haar 機能) を設計したと思います。

私は P. Viola と M. Jones の原著論文と他の多くの出版物を読みました。残念ながら、1 つの弱分類器に最適なしきい値を見つける方法をまだ理解していませんか? 「加重中央値」および「ガウス分布」アルゴリズムと多くの数学公式への参照はわずかしか見つかりませんでした...

OpenCV Train Cascade モジュール ソースをテンプレートとして使用しようとしましたが、非常に包括的であるため、コードのリバース エンジニアリングを行うには非常に時間がかかります。また、Adaptive Boosting の考え方を理解するために、独自の簡単なコードをコーディングしました。

問題は、1 つの弱分類器の最適なしきい値を計算する最良の方法を説明してもらえますか?

以下に、Google で見つかったサンプルから書き直した AdaBoost 疑似コードを示しますが、それが正しいアプローチであるかどうかは確信が持てません。1 つの弱分類器の計算は非常に遅く (数時間)、特に最適なしきい値の計算方法に疑問があります。

(1) AdaBoost::FindNewWeakClassifier
(2) AdaBoost::CalculateFeatures
(3) AdaBoost::FindBestThreshold
(4) AdaBoost::FindFeatureError
(5) AdaBoost::NormalizeWeights
(6) AdaBoost::FindLowestError
(7) AdaBoost::ClassifyExamples
(8) AdaBoost::UpdateWeights

DESCRIPTION (1)
-Generates all possible arrangement of features in detection window and put to the vector
DO IN LOOP
    -Runs main calculating function (2)
END

DESCRIPTION(2)
-Normalizes weights (5)
DO FOR EACH HAAR FEATURE
    -Puts sequentially next feature from list on all integral images
    -Finds the best threshold for each feature (3)
    -Finds the error for each the best feature in current iteration (4)
    -Saves errors for each the best feature in current iteration in array
    -Saves threshold for each the best feature in current iteration in array
    -Saves the threshold sign for each the best feature in current iteration in array
END LOOP
-Finds for classifier index with the lowest error selected by above loop (6)
-Gets the value of error from the best feature
-Calculates the value of the best feature in the all integral images (7)
-Updates weights (8)
-Adds new, weak classifier to vector

DESCRIPTION (3)
-Calculates an error for each feature threshold on positives integral images - seperate for "+" and "-" sign (4)
-Returns threshold and sign of the feature with the lowest error

DESCRIPTION(4)
- Returns feature error for all samples, by calculating inequality f(x) * sign < sign * threshold

DESCRIPTION (5)
-Ensures that samples weights are probability distribution

DESCRIPTION (6)
-Finds the classifier with the lowest error

DESCRIPTION (7)
-Calculates a value of the best features at all integral images
-Counts false positives number and false negatives number

DESCRIPTION (8)
-Corrects weights, depending on classification results

助けてくれてありがとう

4

1 に答える 1

15

こちらのヴィオラ・ジョーンズの元の論文のセクション 3.1 学習に関する議論 (正確にはパラグラフ 4) では、最適なしきい値を見つけるための手順を見つけることができます。

以下にその方法を簡単にまとめます。


各機能の最適なしきい値はサンプルの重みに依存するため、adaboost の反復で計算されます。最適な弱分類器のしきい値は、擬似コードで説明されているように保存されます。

すべてのラウンドで、弱分類器ごとに、特徴値に従って N 個のトレーニング サンプルを配置する必要があります。しきい値を設定すると、このシーケンスが 2 つの部分に分けられます。どちらの部分にも、正または負のサンプルの大部分があり、他のタイプのサンプルがいくつかあります。

  • T+: 正の標本重みの合計
  • T-: 負のサンプル重みの合計
  • S+: しきい値を下回る正のサンプルの重みの合計
  • S-: しきい値を下回る負のサンプル重みの合計

この特定のしきい値のエラーは -

e = MIN((S+) + (T-) - (S-), (S-) + (T+) - (S+))

なんで最低?ここに例があります:
サンプルとしきい値がこのような場合 -

+ + + + + - - | + + - - - - -

最初のラウンドで、すべての重みが等しい (=w) 場合、最小値を取ると の4*w代わりにの誤差が得られます10*w

サンプルを分離する N 個の可能なすべての方法について、この誤差を計算します。
最小誤差は、しきい値の範囲を示します。実際のしきい値は、おそらく隣接する特徴値の平均です (よくわかりませんが、これについて調査してください)。
これは、DO FOR EACH HAAR FEATUREループの 2 番目のステップでした。
OpenCV と共に提供されるカスケードは Rainer Lienhart によって作成されましたが、彼がどのような方法を使用したかはわかりません。この手順をさらに改善するには、OpenCV のソース コードを厳密にたどることができます。

于 2012-03-21T07:37:29.743 に答える