Комбиниране на множество класификатори на Haar с OpenCV

Чудех се дали има начин да комбинирам Haar-класификатори от различни обучени каскади? Имам сценарий, при който откривам един обект, който се различава в зависимост от ъгъла на обекта. Така че отделих моите тренировъчни проби, за да обуча множество класификатори. Те работят добре за часовете си. В момента ги изпълнявам последователно, което ми коства много време за изчисление.

Реших, че 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 обучени haar-каскади. След като ги добавих към групата, извиквам join_all(), за да ги стартирам и чакам всички да завършат. За сравнение обаче получавам този резултат (Core 2 Quad с 3 GHz и 4 Gb Ram): 6 каскади: паралелно: 1,16 s, нормално: 1,45 s | 9 каскади: паралелни: 1,4s, нормални: 1,85s | 12 каскади: Паралелно: 1,68s, Нормално: 2,14S | Използвам изображения с висока разделителна способност (1920x1080) с предварителна обработка, за да огранича областите, върху които използвам своите каскади. - person pandaa; 07.03.2013
comment
Но това, което правите, е да чакате всички нишки да свършат, така че няма да осигури толкова голяма скорост. Това, което трябва да правите, е да обработвате всяка нишка, когато приключи - това ще ускори нещата за вас. Освен това опитайте да изчислите коя нишка ще отнеме най-много време и стартирайте първо тази. - person Dave Gordon; 07.07.2013

Не чакам всички, а обработвам всеки, докато завършват с повдигане на събитие.

person Dave Gordon    schedule 03.07.2013