얼굴 검색을위한 Viola Jones 알고리즘을 구현 중입니다. 알고리즘의 일부를 학습하는 AdaBoost의 첫 번째 부분에 문제가 있습니다.Viola Jones AdaBoost가 시작하기 전에 메모리가 부족합니다.
는원래 논문은 다음
약한 분류 된 인터넷 ER 선택 알고리즘의 진행을 말한다. 각 기능에 대해 예제는 기능 값에 따라 정렬됩니다.
저는 현재 비교적 작은 양성 이미지 2000 개와 음화 이미지 1000 개로 작업하고 있습니다. 이 백서는 최대 10,000 개의 데이터 세트를 포함한다고 설명합니다.
AdaBoost의 주 목적은 24x24 창에서 기능의 수를 줄이는 것입니다.이 크기는 총 160,000+입니다. 이 알고리즘은이 기능들에 대해 작업하고 가장 적합한 알고리즘을 선택합니다.
이 신문은 각 기능에 대해 각 이미지에서 값을 계산 한 다음 값을 기준으로 정렬하는 것으로 설명합니다. 이것이 의미하는 바는 각 피쳐의 컨테이너를 만들고 모든 샘플의 값을 저장해야한다는 것입니다.
내 문제는 프로그램의 메모리가 부족하여 단지 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
원래의 논문에서는 "탐지기의 기본 해상도가 24x24 인 경우 사각형 피쳐의 완전한 세트는 큽니다 ** 45,396 **"입니다. 160,000이 아닙니다. 160,000을 어떻게 얻습니까? –
또한 모든 기능을 명시 적으로 저장하지 않아도됩니다. 한 번에 모든 교육 패치에서 기능 중 하나에 대해 추출 된 값. 부스팅 알고리즘의 각 단계에서 각 기능의 유용성을 평가하고 가장 적합한 것을 선택하여 강력한 분류 기준에 추가 할 수 있습니다. 동시에 메모리에있는 모든 이미지의 모든 기능에 대한 결과를 실제로 가질 필요는 없습니다. –
5 개 기능 각각에는 약 45,396 개의 가능한 위치/크기가 있습니다. 이 논문은 총 160,000 개의 기능을 언급합니다. 2x2 피쳐 (대각선 영역)는 가능성이 적습니다. – robev