Перейти к содержимому
Compvision.ru
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

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


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

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

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

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

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

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


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

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

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

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

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

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


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

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

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


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

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

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

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

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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

для простоты можно попробовать просто вычислять hog descriptor и искать как темплейтом используя евклидово расстояние.

http://stackoverflow.com/questions/11626140/extracting-hog-features-using-opencv

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


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

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

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


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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×