最快的HOG特征提取实现?

sol*_*les 17 c++ performance image-processing computer-vision

问题
多核CPU的最快开源HOG提取代码是什么?

动机
我正在研究实时对象检测应用程序.具体来说,我开发了可变形零件模型级联的变体,目标是30fps对象检测.我已经达到了这样的程度,即提取HOG功能比我的其他管道更加昂贵.我正在使用[ Felzenzwalb,Girshick等 ]参数进行HOG提取.也就是说,HOG描述符的多分辨率金字塔,并且每个描述符总共有32个用于定向的区间和一些其他线索.

目标
我想在60fps(16ms)上对多核CPU上的640x480图像进行多尺度HOG特征提取.

相关工作
我已经在6核Intel 3930k CPU上对一些现成的多尺度HOG实现进行了基准测试.对于640x480图像,我观察到以下性能数字:

  • DuboutFFLD DPM代码中的HOG :19fps(52ms) - 使用OpenMP的C++,但没有矢量化
  • HOG in voc-release5 DPM代码:2.4fps(410ms) - 单线程 C++,加上一个Matlab包装器

我还尝试了OpenCV HOG提取代码.OpenCV版本可以工作,但它似乎是硬编码的Dalal-Triggs的HOG设置,OpenCV似乎不允许我使用相同的HOG参数(规范化方案,二进制位置特征等)作为[Felzenzwalb, Girshick等人].OpenCV版本本身也不支持多尺度HOG,尽管您可以自己进行下采样并为每个比例调用OpenCV HOG.我不记得OpenCV HOG性能是什么样的.

最后的想法

  1. 最快的HOG实施 - FFLD - 似乎在桌面上留下了很多性能.我没有做过GFLOP估计,但我注意到FFLD的HOG代码不使用任何SSE/AVX矢量化.没有那么多的控制流,所以矢量化似乎是一个廉价的加速机会.
  2. 我这里没有提到GPU HOG实现.我已经尝试过groundHOG/CUHOGfasthog.CUHOG作者声称在NVIDIA GTX560上提取20fps(50ms) HOG.但是,英特尔CPU是我的应用程序的目标平台,将完整的HOG金字塔从GPU复制到CPU非常昂贵.

iva*_*n_a 1

看看下面的HoG SSE实现

它确实符合您的时间要求。它是用 C 语言编写的,使用 128 位长的 SIMD 指令。

还可以根据您需要的标准化策略和输出类型进一步自定义代码。

我很高兴听到您的反馈并能够改进此代码。