【问题标题】:Fastest HOG Feature Extraction implementation?最快的 HOG 特征提取实现?
【发布时间】:2013-08-30 18:13:03
【问题描述】:

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

动机
我正在开发一个实时对象检测应用程序。具体来说,我开发了Deformable Parts Model cascades 的变体,目标检测速度为 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 extraction code。 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 成本高得令人望而却步。

【问题讨论】:

  • OpenCV 包括 Dalal 在 CPU 和 GPU 版本中的 HOG 实现。在我看来,它们工作得很好,并且可以很容易地用于 OpenCV 的 CvSVM 的对象检测。
  • 滤波器卷积是DPM中最昂贵的部分,那么您如何管理这部分?
  • @MickeyShine 常见的东西......大规模量化特征,并进行级联。这些天我正在做更多的深度学习和更少的基于 HOG 的 DPM。但我达到了一个点,即我可以在 50 毫秒内完成基于 HOG 的 3 组件、每组件 8 部分模型的卷积。
  • @3yanlis1bos 谢谢!我已经修复了 FFLD 链接。
  • 只需添加几个更新的链接ffldffld2。好像又搬家了

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


【解决方案1】:

看看下面的实现HoG SSE

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

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

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

【讨论】:

  • 有趣!我会试试这个。它是否进行多尺度提取(有些人称之为“HOG 金字塔”)?
  • @solvingPuzzles,HoG SEE 符合您的时间要求吗?您找到了哪种解决方案?
  • @ivan_a 你能解释一下,如何使用这段代码吗?我看到它只使用了 16 个垃圾箱,而且上面写着你不能改变这个?这是什么意思?
猜你喜欢
  • 2014-01-01
  • 2012-07-22
  • 2014-03-16
  • 2020-04-25
  • 2023-03-27
  • 2011-01-04
  • 1970-01-01
  • 2014-07-05
  • 2016-04-02
相关资源
最近更新 更多