OpenGL распознавание лиц
В настоящее время я работаю над проектом по обнаружению и подсчету людей. Он в основном обнаруживает людей на сцене через USB-камеру, а затем подсчитывает количество проходящих мимо людей. В настоящее время мои настройки:
- OpenCV 2.4.6, обнаружение головы людей методом Хаара (обработка с плавающей запятой)
- Плата ARM с четырехъядерным процессором ARM A9 и четырехъядерным графическим процессором Mali
К сожалению, время обработки недостаточно быстрое - 70–100 мс на кадр (14–10 к / с), поэтому люди, идущие с нормальной скоростью или быстрее, не учитываются. Узкое место в методе OpenCV HaarDetection, в основном 90% времени обработки на кадр тратится на процесс.
Я попытался использовать другую модель, кроме Haar, модель LBP, которая основана на целочисленной обработке, но пока моя модель LBP не удовлетворяет требованиям, и я все еще работаю над созданием новых моделей. Кроме того, я пытался использовать TBB с OpenCV (многопоточность изначально реализована в OpenCV), но каким-то образом вызывал сбой в Odroid, приложение работает стабильно, если я не использую TBB.
Единственная оптимизация, о которой я могу подумать, - это использовать в плате Mali GPU, перекомпилируя OpenCV с модифицированным HaarDetection для использования некоторой вычислительной мощности GPU. У меня вопрос, это выполнимо с помощью библиотеки OpenGL? Я вижу, что большинство примеров OpenGL - это рендеринг графики, а не обработка изображений.
2 ответа
Другие оптимизации, которые вы можете рассмотреть:
1. Поиграйте с параметрами - даже небольшие изменения масштабного коэффициента и минимального размера окон могут ускорить ваш алгоритм.
2. Попробуйте использовать другой каскад
3. Попробуйте поиграть с параметрами сборки OpenCV - WITH_TBB может помочь вам ( http://www.threadingbuildingblocks.org/), если ваш процессор поддерживает многопоточность, а каскад может использовать более одного потока (я думаю, что это возможно - возможно, не все время, но хотя бы некоторые его части могут). Взгляните также на ENABLE_SSE и ENABLE_SSE2.
4. Найдите некоторые другие реализации каскадного детектора haar или попробуйте сделать это самостоятельно - возможно сделать это быстрее, см. (Статья и комментарии): http://www.computer-vision-software.com/blog/2009/06/fastfurious-face-detection-with-opencv/
5. Если вы анализируете последовательности изображений, проверьте, являются ли два последовательных кадра одинаковыми / очень похожими - если это так, вы можете пропустить анализ текущего кадра, потому что результаты будут одинаковыми (или очень похожими). Я использовал это решение в своей диссертации бакалавра наук (простой eyetracker с использованием веб-камеры 720p), и оно работало нормально.
6. Как указано выше + поиск только в регионах, в которых есть различие.
7. Разделите изображение, например, на 16 прямоугольников. Проверьте различия между текущим и предыдущим кадром в каждом прямоугольнике - если все прямоугольники из одной строки или столбца почти такие же, как в предыдущем кадре - не анализируйте эту строку / столбец (передавайте только часть вашего изображения каскаду haar - используйте ROI), Это должно дать довольно хорошие результаты и увеличить скорость, потому что люди будут ходить / бегать / и т.д. с одной стороны кадра на другую - есть небольшая вероятность того, что все прямоугольники будут меняться между двумя последовательными кадрами.
Вы можете попытаться обнаружить людей с помощью детектора latensvm (обнаружение по частям). К счастью, здесь есть обученная модель для человека:
https://github.com/Itseez/opencv_extra/tree/master/testdata/cv/latentsvmdetector/models_VOC2007
Это, вероятно, будет быстрее, чем HOG.
Надеюсь, это поможет.