Объединение нескольких классификаторов Хаара с OpenCV

Я блуждал, есть ли способ объединить Хаар-классификаторы из разных обученных каскадов? У меня есть сценарий, в котором я обнаруживаю один объект, который отличается в зависимости от угла объекта. Поэтому я разделил свои обучающие образцы, чтобы обучить несколько классификаторов. Они работают нормально для своих классов. Прямо сейчас я запускаю их последовательно, что стоит мне много времени на вычисления.

Я подумал, что OpenCV, вероятно, каждый раз вычисляет все функции, поэтому каждый раз повторяется заново. Я подумал, что если бы я мог объединить свои классификаторы с помощью операции ИЛИ, то OpenCV мог бы просто использовать один каскад, таким образом, выполняя итерацию только один раз и вычисляя только необходимые функции один раз и так далее. Это может резко повысить мою производительность. Однако я не уверен, можно ли (и как) это сделать. Может быть, кто-то уже пробовал что-то подобное?

Ваше здоровье! -- Артур


person pandaa    schedule 05.02.2013    source источник


Ответы (3)


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

К сожалению, для каждого объекта эти функции неодинаковы (разные размеры, хотя у вас фиксированное количество форм функций), поэтому пространство функций также неодинаково. Таким образом, даже если есть способ объединить эти классификаторы, выгода будет незначительной, потому что у вас, вероятно, нет одинаковых функций для разных объектов, поэтому вам нужно будет снова оценивать почти каждую функцию.

person dajuric    schedule 26.07.2013

Я запускаю каждую из своих как отдельную параллельную задачу.

person Dave Gordon    schedule 13.02.2013
comment
Это действительно не дает мне такого большого ускорения. Я не уверен, что я делаю это неправильно. Я использую boost::thread_group для запуска 6 обученных хаар-каскадов. После того, как я добавил их в группу, я вызываю join_all() для их запуска и жду, пока все они закончатся. При сравнении я получаю такой результат (Core 2 Quad с тактовой частотой 3 ГГц и 4 ГБ оперативной памяти): 6 каскадов: параллельный: 1,16 с, нормальный: 1,45 с | 9 каскадов: параллельный: 1,4 с, нормальный: 1,85 с | 12 каскадов: параллельный: 1,68 с, нормальный: 2,14 с | Я использую изображения с высоким разрешением (1920x1080) с предварительной обработкой, чтобы ограничить области, на которых я использую свои каскады. - person pandaa; 07.03.2013
comment
Но то, что вы делаете, ждет завершения всех потоков, поэтому это не обеспечит такого большого ускорения. Что вы должны делать, так это обрабатывать каждый поток по мере его завершения - это ускорит работу для вас. Кроме того, попробуйте рассчитать, какой поток займет больше всего времени, и запустите его первым. - person Dave Gordon; 07.07.2013

Я не жду всех, а обрабатываю каждую, поскольку они заканчиваются созданием события.

person Dave Gordon    schedule 03.07.2013