Перейти к содержимому
Compvision.ru
Aldaris

HOG OpenCV 1.20

Recommended Posts

В бете версии 1.20, добавили HOG для детекта людей, но вот беда ругается при попытке получить параметры для SVM.

cv::HOGDescriptor::getDefaultPeopleDetector() вызывает внутреннюю ошибку в памяти.

У всех так? Кто-нибудь уже копал?

При этом Emgu уже состряпала реализацию, и у них работает.

П.С. Видимо придётся сорцы править

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В бете версии 1.20, добавили HOG для детекта людей, но вот беда ругается при попытке получить параметры для SVM.

cv::HOGDescriptor::getDefaultPeopleDetector() вызывает внутреннюю ошибку в памяти.

У всех так? Кто-нибудь уже копал?

При этом Emgu уже состряпала реализацию, и у них работает.

П.С. Видимо придётся сорцы править

Не надо сорцы трогать ;), в папке с примерами есть peopledetect.cpp и exe - шник и все работает.

#include "cvaux.h"
#include "highgui.h"

int main(int argc, char** argv)
{
cv::Mat img;

if( argc > 1 )
img = cv::imread(argv[1]);

if( !img.data )
{
fprintf( stderr, argc == 1 ? "ERROR: no image was specified\n" :
"ERROR: the specified image could not be loaded\n");
fprintf( stderr, "Usage: peopledetect <inputimage>\n" );
return -1;
}

cv::HOGDescriptor hog;
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
cv::vector<cv::Rect> found;
double t = (double)cv::getTickCount();
// run the detector with default parameters. to get a higher hit-rate
// (and more false alarms, respectively), decrease the hitThreshold and
// groupThreshold (set groupThreshold to 0 to turn off the grouping completely).
hog.detectMultiScale(img, found, 0, cv::Size(8,8), cv::Size(24,16), 1.05, 2);
t = (double)cv::getTickCount() - t;
printf("Detection time = %gms\n", t*1000./cv::getTickFrequency());
for( int i = 0; i < (int)found.size(); i++ )
{
cv::Rect r = found[i];
// the HOG detector returns slightly larger rectangles than the real objects.
// so we slightly shrink the rectangles to get a nicer output.
r.x += cvRound(r.width*0.1);
r.y += cvRound(r.height*0.1);
r.width = cvRound(r.width*0.8);
r.height = cvRound(r.height*0.8);
cv::rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 1);
}
cv::namedWindow("people detector", 1);
cv::imshow("people detector", img);
cv::waitKey(0);
return 0;
}[/code]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Оказалась знакомая ошибка, в дебаге не работает, в релизе всё ок, ошибка в _HAS_ITERATOR_DEBUGGING, косяки студии, опенцв не причём,.... ну почти,

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что то я даже не понял как peopledetect работает... Запустил peopledetect.exe с параметром, (передал картинку с изображением человека) peopledetect задумался на секунду и просто показал мне эту картинку... Что я не так делал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А может кто знает, как можно обучить свой детектор и встроить его вместо cv::HOGDescriptor::getDefaultPeopleDetector()? Делать это хочу в openCv 2.2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Теоретически:

1. создать обучающую выборку изображений, вычислить для них HOG дескрипторы (HOGDescriptor::compute);

2. обучить SMV (CvSVM::train) и сохранить результаты обучения в виде массива float;

3. загрузить результаты обучения HOGDescriptor::setSVMDetector

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Говорят (точнее пишут) на многих форумах, что формат svm классификатора получаемого при CvSVM::train оказывается несовместим с форматом, классификатора нужным при загрузке в HOG дескриптор.

Ну на самом деле не попробуешь не узнаешь :) Буду делать, а там если что хорошее получится - напишу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Довольно популярная библиотека - SMV-lite. Её использовали авторы статьи "Histograms of Oriented Gradients for Human Detection" Navneet Dalal and Bill Triggs

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×