Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使Opencv SVM更快?_C++_Opencv_Svm_Libsvm - Fatal编程技术网

C++ 如何使Opencv SVM更快?

C++ 如何使Opencv SVM更快?,c++,opencv,svm,libsvm,C++,Opencv,Svm,Libsvm,我正在使用Opencv 2.4.8实现一个图像分类解决方案 班级数目=29 测试图像数量=约4000 特点:冲浪描述符,将每张图片放入3x6网格后。这给出了18个不同的冲浪描述符列表 分类器:CvSVM(NU_SVC/C_SVC)C=32,gamma=8 共有18个分类器,每个网格块1个 最终输出基于所有SURF描述符的所有18个分类器输出的重要性投票 问题是SVM分类需要花费大量时间(每幅图像大约600毫秒)。提出这种技术的IEEE论文报告的速度为21fps。我执行的程序的速度慢了8-10倍

我正在使用Opencv 2.4.8实现一个图像分类解决方案

班级数目=29

测试图像数量=约4000

特点:冲浪描述符,将每张图片放入3x6网格后。这给出了18个不同的冲浪描述符列表

分类器:CvSVM(NU_SVC/C_SVC)C=32,gamma=8

共有18个分类器,每个网格块1个

最终输出基于所有SURF描述符的所有18个分类器输出的重要性投票

问题是SVM分类需要花费大量时间(每幅图像大约600毫秒)。提出这种技术的IEEE论文报告的速度为21fps。我执行的程序的速度慢了8-10倍

我在哪里会犯错误


是否有加快我的测试/分类速度的建议?

在您的实现和作者的实现之间可能有很多不同之处,但我将它们分为三大类:

-数据: 你是否使用与论文作者相同的数据? 你的特征完全一样吗? 也许您的数据包含更多的类,或者更难分类,从而导致更多的支持向量? 如果您不使用相同的数据,并且他们使用的数据是公开的,那么您可能需要在这些数据上测试您的实现。 如果他们在图纸中指定SV的数量,请检查得到的数量是否大致相同

-算法: 您是否使用相同的内核和训练参数? OpenCV实现使用1-vs-1算法进行多类分类,这在您的论文中是否相同? 请注意,对于29个类,这将导致对18个分类器中的每个分类器评估406个二进制分类器,这可能是您的问题的原因之一

编辑:快速查看opencv代码后,它明确使用1vs1。 这可能是(其中一个)问题,即使在我所看到的关于这个主题的几篇论文中,1-vs-1通常比1-vs-all报道的要快(更多的分类器,但在全球范围内较少SV)。 考虑到你的评论,这些特征可能是一个更可能的原因,但是如果没有更多的细节,或者没有参考文献,很难说更多

-实施:
也许他们的实现只是更好的优化/多线程。我不确定OpenCV实现的优化程度。它基于一个相当旧的libSVM版本,但可能从那时起就进行了修改/优化。如果真的是这个问题,你可能还想考虑GPGPU:< /P>,你能在一个平行的线程中运行每个分类器吗?但我有核心i5(4个核心),最大预期加速比是多少?很抱歉,我不能给你一个明确的统计数字,但如果你写得足够好,3-4倍是可以预期的。谢谢你的详细答复阿德里安!-数据:我使用的数据集与《他们不报告SVs》一文所发表的数据集相同。另一件事是,特征向量r基本上是SURF描述符。它们不报告会影响生成的要素数量的SURF参数-->-算法:本文采用RBF核,Gamma=0.0825,svm_类型为NU_SVC。它们不报告“nu”值。您确定OpenCV对多类使用1-vs-1吗?我想我在opencv文档上读到它使用1-vs-all?作为实现:他们没有报告使用多线程。但我非常怀疑他们可能使用了多线程。他们也没有提到任何关于GPU的东西。从你的评论来看,冲浪可能是其中的一个区别。
nu
值也是如此。我不确定您是如何使用冲浪功能的。您是否使用SURF描述符向量作为SVM的输入特征。如果是,如何选择向量的长度?也许参考一下这篇论文会有所帮助。