Быстрая реализация функции HOG Feature Extraction?
Вопрос
Какой самый быстрый код экстракции HOG с открытым исходным кодом для многоядерных процессоров?
Мотивация
Я работаю над приложением обнаружения объектов в реальном времени. В частности, я разработал вариант Каскады модели деформируемых деталей, предназначенные для обнаружения объектов 30fps. Я достиг точки, где извлечение функций HOG дороже, чем остальная часть моего конвейера, в сочетании. Я использую параметры [ Felzenzwalb, Girshick, et al параметры для извлечения HOG. То есть многорезонаторная пирамида дескрипторов HOG, и каждый дескриптор имеет в общей сложности 32 ячейки для ориентации и несколько других реплик.
Цели
Я хотел бы сделать многоэкранное извлечение функции HOG на 60 кадров в секунду (16 мс) для 640x480 изображений на многоядерном процессоре.
Связанная работа
Я сравнивал несколько готовых многомасштабных реализаций HOG на 6-ядерном процессоре Intel 3930k. Для изображения 640x480 я наблюдаю следующие показатели производительности:
- HOG в Dubout FFLD DPM код: 19fps (52ms) - С++ с OpenMP, но без векторизации
- HOG в voc-release5 DPM код: 2.4fps (410ms) - singlethreaded С++, плюс Оболочка Matlab
Я также экспериментировал с кодом OpenCV HOG extract. Версия OpenCV работает, но, похоже, она жестко закодирована для настройки HOG Dalal-Triggs, и OpenCV, похоже, не позволяет мне использовать те же параметры HOG (схема нормализации, функции двоичной позиции и т.д.), Как [Felzenzwalb, Girshick и др.]. Версия OpenCV также не поддерживает многомасштабную HOG, хотя вы можете выполнить понижающую дискретизацию самостоятельно и вызвать OpenCV HOG для каждой шкалы. Я не помню, как выглядела производительность OpenCV HOG.
Заключительные мысли
- Самая быстрая реализация HOG - FFLD - кажется, оставляет много производительности на столе. Я не сделал оценку GFLOP/s, но я замечаю, что код HFF FFLD не использует ни одной векторной векторы SSE/AVX. Существует не так много потока управления, поэтому векторизация кажется дешевой возможностью ускорения здесь.
- Я не упоминал о реализации GPU HOG. Я экспериментировал с groundHOG/CUHOG и fasthog. Авторы CUHOG заявляют 20fps (50ms) HOG-извлечение на NVIDIA GTX560. Но процессоры Intel являются целевой платформой для моего приложения, а копирование полной пирамиды HOG с графического процессора на процессор является чрезмерно дорогостоящим.
Ответы
Ответ 1
Взгляните на следующую реализацию HoG SSE
Это соответствует вашим требованиям времени. Он написан на C и использует 128-разрядные SIMD-инструкции.
Код может быть также дополнительно настроен в зависимости от стратегии нормализации и типа вывода, который вам нужен.
Я был бы рад услышать ваши отзывы и усовершенствовать этот код.