c++ performance image-processing computer-vision

c++ - ¿La implementación de extracción de características de HOG más rápida?



performance image-processing (1)

Echa un vistazo a la siguiente implementación HoG SSE

Se ajusta a sus requisitos de tiempo. Está escrito en C y usa instrucciones SIMD de 128 bits de longitud.

El código también se puede personalizar aún más dependiendo de la estrategia de normalización y el tipo de salida que necesite.

Me complacería escuchar sus comentarios y poder mejorar este código.

Pregunta
¿Cuál es el código de extracción HOG de código abierto más rápido para CPU de varios núcleos?

Motivación
Estoy trabajando en una aplicación de detección de objetos en tiempo real. Específicamente, he desarrollado una variante de cascadas de modelos de piezas deformables , orientada a la detección de objetos a 30 fps. He llegado a un punto en el que la extracción de funciones HOG es más costosa que el resto de mi canalización, combinadas . Estoy usando los parámetros [ Felzenzwalb, Girshick, et al ] para la extracción de HOG. Es decir, una pirámide multiresolución de descriptores HOG, y cada descriptor tiene un total de 32 contenedores para la orientación y algunas otras señales.

Metas
Me gustaría realizar la extracción de características HOG multiescala a 60 fps (16 ms) para imágenes de 640x480 en una CPU multinúcleo.

Trabajo relacionado
He analizado algunas implementaciones de HOG multiescala en una CPU Intel 3930k de 6 núcleos. Para una imagen de 640x480, observo los siguientes números de rendimiento:

  • HOG en el Dubout FFLD DPM de Dubout : 19fps (52ms) - C ++ con OpenMP, pero sin vectorización
  • HOG in voc-release5 Código DPM : 2.4fps (410ms) - C ++ de cadena única, más un contenedor de Matlab

También he experimentado con el código de extracción OpenCV HOG . La versión de OpenCV funciona, pero parece estar codificada para la configuración HOG de Dalal-Triggs, y OpenCV no me permite usar los mismos parámetros HOG (esquema de normalización, características de posición binaria, etc.) como [Felzenzwalb, Girshick, et al]. La versión de OpenCV tampoco es compatible de forma nativa con HOG multiescala, aunque usted podría realizar el submuestreo y llamar a OpenCV HOG para cada escala. No recuerdo cómo era la actuación de OpenCV HOG.

Pensamientos finales

  1. La implementación de HOG más rápida, FFLD , parece dejar mucho rendimiento en la mesa. No he hecho una estimación de GFLOP, pero sí me doy cuenta de que el código HOG de FFLD no utiliza ninguna vectorización SSE / AVX. No hay mucho flujo de control, por lo que la vectorización parece una oportunidad barata de aceleración aquí.
  2. No he mencionado implementaciones de GPU HOG aquí. He experimentado con groundHOG / CUHOG y fasthog . Los autores de CUHOG afirman la extracción de HOG a 20 fps (50 ms) en un NVIDIA GTX560. Sin embargo, las CPU de Intel son la plataforma de destino para mi aplicación y copiar una pirámide HOG completa de la GPU a la CPU es prohibitivamente costoso.