Я обучил классификатор 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);
}
Вы ищете один и тот же диапазон размеров для лиц и рук? – Bull
Это не имеет ничего общего с лицами. Я не уверен, что вы имеете в виду. Имя переменной было «лицом». Я изменил это сейчас, так что это не вызывает путаницы. –
Вы говорите, что алгоритм быстрый с лицами, но медленный с руками. Вы передаете параметры диапазона с таким же параметром cascade.detectMultiScale()? – Bull