Лучший способ рассчитать лучший порог с помощью P. Viola, M. Jones Framework - PullRequest
10 голосов
/ 20 марта 2012

Я пытаюсь реализовать инфраструктуру обнаружения P. Viola и M. Jones в C ++ (в начале, просто классификатор последовательности - не каскадная версия).Я думаю, что я разработал все необходимые классы и модули (например, встроенные изображения, функции Haar), несмотря на один - самый важный: алгоритм ядра AdaBoost.

Я прочитал оригинальную статью P. Viola и M. Jonesи многие другие публикации.К сожалению, я до сих пор не понимаю, как мне найти лучший порог для одного слабого классификатора?Я нашел только небольшие ссылки на алгоритмы «взвешенной медианы» и «распределения Гаусса» и множество математических формул ...

Я пытался использовать исходные коды модуля OpenCV Train Cascade в качестве шаблона, но это таквсеобъемлющий, что обратный инжиниринг кода очень трудоемкий.Я также написал свой собственный простой код, чтобы понять идею адаптивного бустинга.

Вопрос: не могли бы вы объяснить, как лучше рассчитать лучший порог для одного слабого классификатора?

НижеЯ представляю псевдокод AdaBoost, переписанный из примера, найденного в Google, но я не уверен, правильно ли он подходит.Расчет одного слабого классификатора очень медленный (несколько часов), и у меня есть сомнения относительно метода расчета наилучшего порога, особенно.

(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

Спасибо за любую помощь

1 Ответ

14 голосов
/ 21 марта 2012

В оригинальной статье Альта-Джонса здесь , раздел 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.
Каскады, данные вместе сOpenCV были созданы Райнером Линхартом, и я не знаю, какой метод он использовал.Вы можете внимательно следить за исходными кодами OpenCV, чтобы получить дальнейшие улучшения в этой процедуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...