我正在使用Opencv 2.4.8实现一个图像分类解决方案。
不是的。班级数= 29
不是的。测试图像的数量=约4000
特点:冲浪描述符,潜入3x6网格后,每个图像。这给出了18个不同的SURF描述符列表。
分类器: CvSVM (NU_SVC/C_SVC) C=32,gamma=8
有18个分类器,每个网格块1个。
最终输出基于对所有SURF描述符的所有18个分类器的输出的重要性投票。
问题是支持向量机分类耗费了很多时间(每张图像大约600毫秒)。提出这项技术的IEEE论文报告了21fps的速度。我实现的程序的速度要慢8-10倍。
我会在哪里犯错误呢?
有什么建议可以加速我的测试/分类吗?
发布于 2015-02-11 04:50:03
在您的实现和作者的实现之间可能会有许多不同之处,但我会将它们分为三大类:
-The数据:您使用的数据与论文作者使用的数据相同吗?你的功能是完全一样的吗?也许你的数据包含更多的类,或者更难分类,从而产生更多的支持向量?如果您不使用相同的数据,并且他们使用的数据是公开可用的,那么您可能希望在这些数据上测试您的实现。如果他们在论文中指定了SV的数量,请检查您是否获得了大致相同的数量。
-The算法:您是否使用相同的内核和训练参数?OpenCV实现使用1-vs-1算法进行多类分类,您的论文中是否也是如此?请注意,对于29个类,它将导致对18个分类器中的每个分类器评估406个二进制分类器,这可能是导致问题的原因之一。
编辑:在快速浏览opencv代码后,它明确地使用了1vs1。这可能是问题之一,即使在我看到的几篇关于这个主题的论文中,1-vs-1通常比1-vs-all更快(分类器更多,但全局SV更少)。考虑到你的评论,这些特征可能是一个更可能的原因,但如果没有更多的细节,或者参考这篇论文,很难说更多。
-The实现:也许他们的实现只是更好地优化了/多线程。我不确定OpenCV实现的优化程度。它基于一个相当旧的libSVM版本,但可能已经被修改/优化过。如果这确实是问题所在,您可能还需要考虑GPGPU:http://mklab.iti.gr/project/GPU-LIBSVM
https://stackoverflow.com/questions/28423212
复制相似问题