nhr 0 Жалоба Опубликовано March 31, 2014 В предыдущей теме мне подсказали, что лучше всего для поиска людей в толпе поможет метод 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; } Картинка, например, такая вот: Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nhr 0 Жалоба Опубликовано March 31, 2014 вот на этой фотографии уже 5 "человек" HOG Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано March 31, 2014 Невский проспект, парад ветеранов? HOG - это не просто магическая штука, а классифиикатор обученный на вполне конкретных данных. Чтобы он хорошо работал на данных, отличных от тех, на которых его обучали, его надо переобучить. Что логично. Так вот: модели, входящие в пооставку OpenCV, обучены на данных полученных с камеры, находящейся практически на уровне земли. Разработаны они были изначально для камер, установленных в автомобиле для предотвращения столкновения с пешеходами. Ты же подаёшь изображения с камеры, установленной достаточно высоко. Логично, что результаты плачевны, ведь искажаются пропорции человечского тела. Тебе надо переобучить модель на своих данных либо найти гововую. И подавать на классиифиикатор вместо вызова getDefaultPeopleDetector(). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nhr 0 Жалоба Опубликовано March 31, 2014 Да, это Невский(: Как переучить, это я понимаю, вот только не совсем понял фразу :"И подавать на классиифиикатор вместо вызова getDefaultPeopleDetector()" Сюда : hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); ??? Т.е. hog.setSVMDetector("мой классификатор") Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
iskees 32 Жалоба Опубликовано March 31, 2014 Еще один момент, hog чувствителен к искажению jpeg'а и если нужно сохранять файл для дальнейшей обработки то лучше использовать bmp, а на камере(ip) выставить минимальное сжатие. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано March 31, 2014 Как переучить, это я понимаю, вот только не совсем понял фразу :"И подавать на классиифиикатор вместо вызова getDefaultPeopleDetector()" Сюда : hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); ??? Т.е. hog.setSVMDetector("мой классификатор") Да, именно так. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nhr 0 Жалоба Опубликовано March 31, 2014 Я правильно понимаю, что лучше всего, в качестве, шаблонов людей использовать человека на белом фоне? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано March 31, 2014 Нет, наоборот. Надо людей подавать на естественном фоне. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nhr 0 Жалоба Опубликовано March 31, 2014 Если на естественном фоне, то тогда разве программа не станет рабочей только под одну фотографию? Грубо говоря, если шаблоны сделаны с фотографии одной толпы людей, то на данной толпе все будет отлично работать, а если, например, окружающая обстановка сменится, тогда как быть? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано April 1, 2014 Поэтому отбирают для обучения тысячи самых разнообразных примеров, а не только с одной фотографии. Я бы на твоём месте поискал базы размеченного видео с камер видеонаблюдения, там как раз подходящий ракурс будет. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 1, 2014 для простоты можно попробовать просто вычислять hog descriptor и искать как темплейтом используя евклидово расстояние. http://stackoverflow.com/questions/11626140/extracting-hog-features-using-opencv Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nhr 0 Жалоба Опубликовано April 1, 2014 Ну что же, сначала попробую написать классификатор как можно более полный, результат выложу, как напишу! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nhr 0 Жалоба Опубликовано April 1, 2014 Появился вопрос, в классификатор добавлять фотографии одинакового размера в плане ширины/высоты ?? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах