最快的HOG特征提取实现

Fastest HOG Feature Extraction implementation?

本文关键字:特征提取 实现 HOG      更新时间:2023-10-16

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

动机
我正在开发一个实时物体检测应用程序。具体来说,我开发了一种可变形零件模型级联的变体,目标是每秒30帧的对象检测。我已经到了这样一个地步,提取HOG特征比我的管道的其他部分加起来要贵。我使用[Felzenzwalb,Girshick等]参数提取HOG。也就是说,HOG描述符的多分辨率金字塔,每个描述符总共有32个用于定向和一些其他线索的仓。

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

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

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

我还试用了OpenCV HOG提取代码。OpenCV版本有效,但它似乎是为Dalal Triggs的HOG设置而硬编码的,而且OpenCV似乎不允许我使用与[Felzenzwalb,Girshick等人]相同的HOG参数(归一化方案、二进制位置特征等)。OpenCV版本本身也不支持多尺度HOG,尽管你可以自己进行下采样,并为每个尺度调用OpenCV HOG。我不记得OpenCV HOG的表现是什么样子了。

最后的想法

  1. 最快的HOG实现——FFLD——似乎留下了很多性能。我还没有做GFLOP/s估计,但我注意到FFLD的HOG代码没有使用任何SSE/AVX矢量化。没有那么多的控制流,所以矢量化似乎是一个廉价的加速机会
  2. 我在这里没有提到GPU HOG的实现。我试过土拨鼠/土拨鼠和快速土拨鼠。CUHOG的作者声称NVIDIA GTX560上的HOG提取速度20fps(50ms)。但是,英特尔CPU是我的应用程序的目标平台,从GPU到CPU复制完整的HOG金字塔的成本高得令人望而却步

查看以下实现HoG SSE

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

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

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