18

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

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

目标
我想在多核 CPU 上以60fps (16ms)的速度对 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 提取代码。OpenCV 版本有效,但它似乎是针对 Dalal-Triggs 的 HOG 设置进行硬编码的,而且 OpenCV 似乎不允许我使用与 [Felzenzwalb, Girshick 等人]。OpenCV 版本本身也不支持多尺度 HOG,尽管您可以自己进行下采样并为每个尺度调用 OpenCV HOG。我不记得 OpenCV HOG 的表现是什么样的。

最后的想法

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

1 回答 1

1

看看下面的实现HoG SSE

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

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

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

于 2013-11-12T08:17:23.047 回答