如何加速svm.predict?

时间:2013-04-24 12:17:52

标签: opencv machine-learning computer-vision svm object-detection

我正在编写一个滑动窗口来提取功能并将其提供给CvSVM的预测功能。 然而,我偶然发现的是svm.predict函数相对较慢。

基本上,窗口通过图像以固定的步幅长度,在图像比例的数量上滑动。

  • 遍历图像的速度以及每个图像的提取功能 窗口大约需要1000毫秒(1秒)。
  • 包含由adaboost训练的弱分类器导致了周围 1200毫秒(1.2秒)
  • 然而,当我通过功能(已标记为正面 由弱分类器)到svm.predict函数,整体速度 减慢到大约16000毫秒(16秒)
  • 首先尝试收集所有'积极'功能,然后再转发 使用TBB线程的svm.predict导致19000毫秒(19秒),可能是由于创建线程所需的开销等等。

我的OpenCV构建编译为包括TBB(线程)和OpenCL(GPU)功能。

有没有人设法加快OpenCV的SVM.predict功能?

我已经在这个问题上停留了很长一段时间,因为通过我的测试数据运行这种检测算法进行统计和阈值调整是令人沮丧的。

非常感谢您通过此阅读!

3 个答案:

答案 0 :(得分:4)

(上面的答案正式化了我的评论:)

SVM的预测算法需要O( nSV * f )时间,其中<​​em> nSV 是支持向量的数量和 f 是功能的数量。通过更强的正则化训练,即通过增加超参数 C (可能以预测准确度为代价),可以减少支持向量的数量。

答案 1 :(得分:2)

我不确定你提取的功能是什么,但是根据功能的大小(3780)我会说你正在提取HOG。在cv::HOGDescriptor类中有一种非常强大,优化且快速的HOG“预测”方法。你需要做的就是

  1. 提取您的HOG进行培训
  2. 将它们放入svmLight格式
  3. 使用svmLight线性内核训练模型
  4. 计算预测所需的3780 + 1维向量
  5. 将向量提供给setSvmDetector()对象
  6. cv::HOGDescriptor方法
  7. 使用detect()detectMultiScale()方法进行检测
  8. 以下文档提供了有关如何实现您要执行的操作的非常好的信息:http://opencv.willowgarage.com/wiki/trainHOG虽然我必须警告您原始程序中存在一个小问题,但它会教您如何处理此问题问题得当。

答案 2 :(得分:0)

如Fred Foo所述,您必须减少支持向量的数量。根据我的经验,培训基础的5-10%足以具有良好的预测水平。

提高速度的另一种方法:

  1. 减小特征的尺寸。 3780太多了。我不确定此功能的大小可以在您的情况下描述什么,但是根据我的经验,例如,对汽车徽标之类的图像的描述可以有效地打包为150-200大小:
    • PCA可用于减小功能部件的大小以及减小其“噪音”。有一些示例说明如何将其与SVM一起使用;
    • 如果没有帮助-尝试其他图像描述原理,例如LBP和/或LBP直方图
  2. LDA(单独或与SVM一起使用)也可以使用。
  3. 首先尝试线性SVM。如果您的集合原则上是线性可分割的,则它速度更快,并且您的特征尺寸3780(3780尺寸)足够“空间”以在较高的尺寸上实现良好的分离。如果不够好,请尝试使用一些非常标准的设置(例如C = 1和gamma = 0.1)的RBF内核。而且只有那之后-POLY-最慢的一个。