顔検出に Viola Jones アルゴリズムを実装しています。アルゴリズムの AdaBoost 学習部分の最初の部分に問題があります。
元の論文の状態
弱分類器選択アルゴリズムは次のように進行します。各機能について、例は機能値に基づいて並べ替えられています。
私は現在、2000 枚のポジティブ画像と 1000 枚のネガティブ画像の比較的小さなトレーニング セットを使用しています。この論文では、10,000 もの大規模なデータ セットを持つことについて説明しています。
AdaBoost の主な目的は、合計 160,000 以上の 24x24 ウィンドウ内の機能の数を減らすことです。アルゴリズムはこれらの機能に作用し、最適なものを選択します。
この論文では、各特徴について、各画像でその値を計算し、値に基づいて並べ替えると説明しています。これが意味することは、機能ごとにコンテナーを作成し、すべてのサンプルの値を保存する必要があるということです。
私の問題は、10,000 個の機能 (それらのわずか 6%) を評価しただけでプログラムがメモリ不足になることです。すべてのコンテナーの全体的なサイズは、最終的に 160,000*3000 になり、数十億になります。メモリ不足にならずにこのアルゴリズムを実装するにはどうすればよいですか? ヒープ サイズを増やしたところ、3% から 6% になりました。これ以上増やしてもうまくいかないと思います。
この論文は、これらのソートされた値がアルゴリズム全体で必要であることを暗示しているため、各機能の後でそれらを破棄することはできません。
これまでの私のコードは次のとおりです
public static List<WeakClassifier> train(List<Image> positiveSamples, List<Image> negativeSamples, List<Feature> allFeatures, int T) {
List<WeakClassifier> solution = new LinkedList<WeakClassifier>();
// Initialize Weights for each sample, whether positive or negative
float[] positiveWeights = new float[positiveSamples.size()];
float[] negativeWeights = new float[negativeSamples.size()];
float initialPositiveWeight = 0.5f / positiveWeights.length;
float initialNegativeWeight = 0.5f / negativeWeights.length;
for (int i = 0; i < positiveWeights.length; ++i) {
positiveWeights[i] = initialPositiveWeight;
}
for (int i = 0; i < negativeWeights.length; ++i) {
negativeWeights[i] = initialNegativeWeight;
}
// Each feature's value for each image
List<List<FeatureValue>> featureValues = new LinkedList<List<FeatureValue>>();
// For each feature get the values for each image, and sort them based off the value
for (Feature feature : allFeatures) {
List<FeatureValue> thisFeaturesValues = new LinkedList<FeatureValue>();
int index = 0;
for (Image positive : positiveSamples) {
int value = positive.applyFeature(feature);
thisFeaturesValues.add(new FeatureValue(index, value, true));
++index;
}
index = 0;
for (Image negative : negativeSamples) {
int value = negative.applyFeature(feature);
thisFeaturesValues.add(new FeatureValue(index, value, false));
++index;
}
Collections.sort(thisFeaturesValues);
// Add this feature to the list
featureValues.add(thisFeaturesValues);
++currentFeature;
}
... rest of code