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