2013-06-17 2 views
1

Я обучил классификатор HAAR для обнаружения рук в реальном времени с веб-камеры. Я использовал 621 положительных & 3712 негативов.Почему мой классификатор хара медленно?

Я использовал opencv_createsamples для создания VEC файла для позитивов: ./opencv_createsamples -vec /Users/.../positivesvec.vec -info /Users/.../positiveDesc.txt -w 20 -h 30

И затем я использовал opencv_traincascade для обучения классификатора: opencv_traincascade -data /Users/.../hand -vec /Users/.../positivesvec.vec -bg /Users/.../negativeDesc.txt -numPos 621 -numNeg 3712 -numStages 15 minHitRate 0.999 maxFalseAlarmRate 0.5 -w 20 -h 30 -модуль ALL

Обучение заняло около 30 часов или около того, и я получил xml-файл. Однако, когда я использую этот файл xml для обнаружения, он действительно ОЧЕНЬ медленный (возможно, 1 кадр за 3-4 секунды).

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

trained_cascade_name = "/Users/.../cascade.xml"; 
if(!cascade.load(trained_cascade_name)){ qDebug()<<"Error loading cascade file!"; return; }; 
std::vector<Rect> hands; 
    Mat frame_gray; // Haar works on grayscale images 
    cvtColor(frame, frame_gray, CV_RGB2GRAY); 
    equalizeHist(frame_gray, frame_gray); 

    cascade.detectMultiScale(frame_gray, hands, 1.1, 3, 0|CV_HAAR_DO_CANNY_PRUNING|CV_HAAR_FIND_BIGGEST_OBJECT, cv::Size(30,30),cv::Size(100,100)); 
    CvPoint topleft, bottomright; 
    for(int i = 0; i < hands.size(); i++) 
     { 
     topleft.x=hands[i].x; 
     topleft.y=hands[i].y; 
     bottomright.x=hands[i].x+hands[i].width; 
     bottomright.y=hands[i].y+hands[i].height; 
     cv::rectangle(frame, topleft, bottomright, Scalar(255,0,255), 1, 8, 0); 
     } 
+0

Вы ищете один и тот же диапазон размеров для лиц и рук? – Bull

+0

Это не имеет ничего общего с лицами. Я не уверен, что вы имеете в виду. Имя переменной было «лицом». Я изменил это сейчас, так что это не вызывает путаницы. –

+0

Вы говорите, что алгоритм быстрый с лицами, но медленный с руками. Вы передаете параметры диапазона с таким же параметром cascade.detectMultiScale()? – Bull

ответ

1

Для разных объектов разного количества дерев/пней на этапе генерируется для отклонения 50% от ложных срабатываний.

Выберите любой регион и классифицируйте ее. Во время этой процедуры проверьте, сколько деревьев/пней вызывается на более низких уровнях.

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

Это просто дикая догадка ....

0

Вы можете установить более высокое значение для scaleFactor, что у вас есть, как 1.1, если установить его выше, он может работать быстрее, но это будет также пропустить некоторые обнаружения ,

Смежные вопросы