最快的HOG特征提取实现
Fastest HOG Feature Extraction implementation?
问题
用于多核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的表现是什么样子了。
最后的想法
- 最快的HOG实现——FFLD——似乎留下了很多性能。我还没有做GFLOP/s估计,但我注意到FFLD的HOG代码没有使用任何SSE/AVX矢量化。没有那么多的控制流,所以矢量化似乎是一个廉价的加速机会
- 我在这里没有提到GPU HOG的实现。我试过土拨鼠/土拨鼠和快速土拨鼠。CUHOG的作者声称NVIDIA GTX560上的HOG提取速度20fps(50ms)。但是,英特尔CPU是我的应用程序的目标平台,从GPU到CPU复制完整的HOG金字塔的成本高得令人望而却步
查看以下实现HoG SSE
它确实符合你的时间要求。它是用C语言编写的,使用128位长的SIMD指令。
根据您需要的规范化策略和输出类型,还可以进一步自定义代码。
我很高兴听到您的反馈,并能够改进此代码。
- 根据C++标准的定义实现"is_similar"类型特征
- C ++类型特征:确保子类实现方法
- 基于 SFINAE 的特征实现问题与函数模板重载
- 有没有更好的方法可以使用特征/C++实现 matlab 的逻辑索引?
- 如何在特征中实现提高到矩阵幂的标量
- MEX文件实现特征库伪内函数崩溃
- 从特征::等距3d提取旋转时出错
- 如何使用特征库实现 max(A),其中 A 是双精度复矩阵
- 特征,实现阻尼伪逆时的矩阵大小调整问题
- 图像和图像处理中的特征提取
- 将类型特征从实现中定义
- 情绪识别或特征提取
- 人脸特征提取和识别
- 如何在特征中实现高性能分段线性传递函数
- 基于FlannBasedMatcher的SURF特征提取和关键点匹配
- 最快的HOG特征提取实现
- Gabor特征提取用于检测人
- 尝试为特征矩阵实现一种初始化列表语法
- 纹理特征提取
- 二值图像的特征提取