OpenCV: повышение скорости обнаружения каскадов
Мне нужно обнаруживать людей в режиме реального времени, используя OpenCV Cascades. В настоящее время я использую обученные каскадные файлы, которые поставляются с OpenCV, но позже я буду тренировать свои собственные каскады LBP для достижения большей скорости. У меня есть вопрос.
Как можно ускорить обнаружение каскадов? Для примера посмотрите это видео. Это действительно быстро, использует каскады Хаара и красиво. какие вещи я могу сделать, чтобы добиться такой скорости, особенно для приложений реального времени? какие-нибудь хитрости и хаки?
4 ответа
Я не уверен, что вы подразумеваете под "скоростью" в вашем примере с видео, так как трудно определить, с какой "скоростью" выполняются обнаружения. В компьютерном зрении, когда мы говорим о "скорости" обнаружения, мы обычно подразумеваем количество кадров в секунду (FPS) или миллисекундное время выполнения алгоритма для одного или нескольких видео. Если FPS, достигнутый алгоритмом, такой же, как FPS входного видео, это называется скоростью обработки в реальном времени или 1x. Если обработка FPS больше, чем входная FPS, у вас быстрее, чем в режиме реального времени, а если он меньше, то у вас медленнее, чем в реальном времени. Я предполагаю, что вы имели в виду то же самое, когда говорили "скорость".
Учитывая это, позвольте мне дать вам два способа ускорить обнаружение. Я действительно предлагаю прочитать эти две статьи, которые действительно установили планку обнаружения пешеходов за последние несколько лет: самый быстрый детектор пешеходов на западе и обнаружение пешеходов со скоростью 100 кадров в секунду, обе из которых оптимизируют узкое место вычислений при выполнении обнаружения в разных масштабах. в традиционной настройке обнаружения. Последний имеет общедоступный код здесь и здесь. Но так что это одна из областей для улучшения: масштабные размеры.
Метод, реализованный изначально в OpenCV, основан на варианте метода Виолы-Джонса, который расширяет Haar-подобный набор функций, используемый при обнаружении. Еще одна область, которую нужно рассмотреть, называется оконным управлением. Традиционные методы обнаружения, в том числе реализованные в OpenCV, требуют, чтобы вы перемещали окна в масштабе по всему изображению, обычно по строкам от верхнего левого до нижнего правого. Классический способ обойти это называется эффективным поиском подокна (ESS), который выполняет оптимизацию ветвей и границ. Из этого было сделано множество расширений, но это отличное место для начала и понимания основ обнаружения объектов.
Теперь, конечно, один очень очевидный способ ускорить процесс обнаружения - распараллелить ваш код, например, многопоточность или графический процессор. Существует несколько общедоступных реализаций графического процессора, например, здесь используется детектор на основе опорных векторов.
Если вам нужно повысить скорость обнаружения каскадов HAAR, я мог бы порекомендовать использовать библиотеку Simd, которая имеет улучшенные реализации каскадных классификаторов HAAR и LBP (они используют SSE4.1, AVX2 и NEON(ARM), поэтому она работает в 2-3 раза быстрее, чем оригинальный OpenCV). Обратите внимание, что он может использовать стандартные каскады HAAR и LBP из OpenCV.
Одним из основных факторов при обработке изображений является размер входного изображения. Попробуйте уменьшить изображение. В случае вашего примера, автомобили движутся в известных направлениях и с разумно предсказуемыми скоростями, поэтому, когда автомобиль был обнаружен, интересующий участок области изображения вокруг этой области может быть найден в следующем кадре в течение многих более быстрое обнаружение.
https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf
Вот статья, касающаяся улучшения скорости вашего каскадного обнаружения, но, надеюсь, это поможет