最快的HOG特征提取实现?

时间:2013-08-27 20:33:11

标签: c++ performance image-processing computer-vision

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

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

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

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

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

我也尝试了OpenCV HOG extraction code。 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非常昂贵。

1 个答案:

答案 0 :(得分:1)

查看以下实施HoG SSE

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

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

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