Jump to content
Compvision.ru
Sign in to follow this  
nhr

поиск людей, HOG

Recommended Posts

В предыдущей теме мне подсказали, что лучше всего для поиска людей в толпе поможет метод HOG

Кое-как написал я его, но возникает проблема, что на нужных мне снимках не находит он людей или находит 1 из скажем 20.

Что нужно изменить в коде, а то свой собственный классификатор писать не охота.

int main(int argc, char** argv)

{

	Mat img, gray, locations, weights;


	img = imread("image3.jpg", CV_LOAD_IMAGE_UNCHANGED);


	if (img.empty())

	{

		cout << "Error : Image cannot be loaded..!!" << endl;

		system("pause"); //wait for a key press

		return -1;

	}


	cvtColor(img, gray, CV_BGR2GRAY);//hog работает только с gray


	HOGDescriptor hog;

	//поиск объекта на изображении метод hog+svm

	hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());


	namedWindow("people detector", CV_WINDOW_AUTOSIZE);


	fflush(stdout);

	vector<Rect> found, found_filtered;

	double t = (double)getTickCount();


	// детектирование объектов с параметрами по умолчанию

	hog.detectMultiScale(gray, found, 0, Size(8, 8), Size(32, 32), 1.05, 2);


	t = (double)getTickCount() - t;

	printf("tdetection time = %gms\n", t*1000. / cv::getTickFrequency());


	std::cout << "found: " << found.size() << std::endl;


	size_t i, j;

	for (i = 0; i < found.size(); i++)

	{

			Rect r = found[i];

			for (j = 0; j < found.size(); j++)

			if (j != i && (r & found[j]) == r)

				break;

			if (j == found.size())

				found_filtered.push_back(r);

	}

	for (i = 0; i < found_filtered.size(); i++)

	{

			Rect r = found_filtered[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.width = cvRound(r.width*0.8);

			r.y += cvRound(r.height*0.07);

			r.height = cvRound(r.height*0.8);

			rectangle(gray, r.tl(), r.br(), cv::Scalar(0, 255, 0), 3);

	}

	imshow("people detector", gray);


	waitKey(5000);

	system("pause");


	destroyAllWindows();


	return 0;

}

Картинка, например, такая вот:

post-6878-0-99717900-1396262026_thumb.jp

Share this post


Link to post
Share on other sites

Невский проспект, парад ветеранов?

HOG - это не просто магическая штука, а классифиикатор обученный на вполне конкретных данных. Чтобы он хорошо работал на данных, отличных от тех, на которых его обучали, его надо переобучить. Что логично.

Так вот: модели, входящие в пооставку OpenCV, обучены на данных полученных с камеры, находящейся практически на уровне земли. Разработаны они были изначально для камер, установленных в автомобиле для предотвращения столкновения с пешеходами. Ты же подаёшь изображения с камеры, установленной достаточно высоко. Логично, что результаты плачевны, ведь искажаются пропорции человечского тела.

Тебе надо переобучить модель на своих данных либо найти гововую. И подавать на классиифиикатор вместо вызова getDefaultPeopleDetector().

Share this post


Link to post
Share on other sites

Да, это Невский(:

Как переучить, это я понимаю, вот только не совсем понял фразу :"И подавать на классиифиикатор вместо вызова getDefaultPeopleDetector()"

Сюда : hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); ???

Т.е. hog.setSVMDetector("мой классификатор")

Share this post


Link to post
Share on other sites

Еще один момент, hog чувствителен к искажению jpeg'а и если нужно сохранять файл для дальнейшей обработки то лучше использовать bmp, а на камере(ip) выставить минимальное сжатие.

Share this post


Link to post
Share on other sites

Как переучить, это я понимаю, вот только не совсем понял фразу :"И подавать на классиифиикатор вместо вызова getDefaultPeopleDetector()"

Сюда : hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); ???

Т.е. hog.setSVMDetector("мой классификатор")

Да, именно так.

Share this post


Link to post
Share on other sites

Я правильно понимаю, что лучше всего, в качестве, шаблонов людей использовать человека на белом фоне?

Share this post


Link to post
Share on other sites

Нет, наоборот. Надо людей подавать на естественном фоне.

Share this post


Link to post
Share on other sites

Если на естественном фоне, то тогда разве программа не станет рабочей только под одну фотографию? Грубо говоря, если шаблоны сделаны с фотографии одной толпы людей, то на данной толпе все будет отлично работать, а если, например, окружающая обстановка сменится, тогда как быть?

Share this post


Link to post
Share on other sites

Поэтому отбирают для обучения тысячи самых разнообразных примеров, а не только с одной фотографии. Я бы на твоём месте поискал базы размеченного видео с камер видеонаблюдения, там как раз подходящий ракурс будет.

Share this post


Link to post
Share on other sites

Ну что же, сначала попробую написать классификатор как можно более полный, результат выложу, как напишу!

Share this post


Link to post
Share on other sites

Появился вопрос, в классификатор добавлять фотографии одинакового размера в плане ширины/высоты ??

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×