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