最快的HOG特征提取实现?

17

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

动机
我正在开发一个实时目标检测应用程序。具体而言,我已经开发了一种变体的Deformable Parts Model cascades,旨在实现30fps目标检测。我已经达到了一个点,提取HOG特征比我的整个流水线的其他部分加起来更昂贵。我使用Felzenzwalb,Girshick等人的参数进行HOG提取。也就是说,一个多分辨率金字塔的HOG描述符,每个描述符有32个方向和一些其他提示。

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

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

  • DuboutFFLD DPM代码中的HOG:19fps(52ms)——使用C++和OpenMP,但没有向量化
  • 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 实现。我已经尝试过 groundHOG/CUHOGfasthog。CUHOG 的作者声称在 NVIDIA GTX560 上可以实现每秒 20 帧(50 毫秒)的 HOG 特征提取速度。但是,我的应用程序的目标平台是英特尔 CPU,并且从 GPU 复制完整的 HOG 金字塔到 CPU 是代价高昂的。

OpenCV 包含 Dalal 的 HOG 实现,包括 CPU 和 GPU 版本。在我看来,它们的表现非常好,并且可以轻松地与 OpenCV 的 CvSVM 一起用于对象检测。 - marcos.nieto
1
@MickeyShine 常规操作... 大量量化特征,并进行级联。我现在更多地使用深度学习,而不是基于HOG的DPM。但是我已经达到了一个点,在这个点上,我可以在不到50毫秒的时间内为基于HOG的3组件、每组件8部分的模型执行卷积。 - solvingPuzzles
1
@3yanlis1bos 谢谢!我已经修复了FFLD链接。 - solvingPuzzles
2
只是添加了一些更新的链接ffldffld2。似乎又搬家了。 - Jon
@solvingPuzzles 你找到任何实现了吗? - Pawan
显示剩余4条评论
1个回答

1
请查看以下实现HoG SSE,它符合您的时间要求。它是用C语言编写的,并使用128位长的SIMD指令。根据您需要的归一化策略和输出类型,代码也可以进一步定制化。我很高兴听到您的反馈并能够改进这个代码。

有趣!我会试一下。它是否进行多尺度提取(有些人称之为“HOG金字塔”)? - solvingPuzzles
1
@solvingPuzzles,HoG是否符合您的时间要求?您找到了哪个解决方案? - Tin
@ivan_a,你能解释一下如何使用这段代码吗?我看到它只使用了16个bin,并且写明无法更改?这是什么意思? - Autonomous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接