我正在编写一个使用SVM对某些图像进行分类的应用程序(特别是these)。我的Matlab实现非常有效。使用SIFT词袋方法,我可以通过线性内核获得接近100%的准确度。
出于速度/可移植性的原因,我需要在C ++中实现这一点,因此我尝试使用libsvm和dlib。我尝试了多种SVM类型(c_svm,nu_svm,one_class)和多个内核(线性,多项式,rbf)。我能够达到的最好的准确度是大约50% - 即使是我训练过的相同样本。我已经确认我的特征生成器正在工作,因为当我将我的c ++生成的特性导出到Matlab并对其进行训练时,我能够再次获得接近完美的结果。
Matlab的SVM实现有什么神奇之处吗?是否有任何常见的陷阱或领域可以解释我所看到的行为?我知道这有点模糊,但问题的一部分是我不知道去哪里。如果我能提供其他有用的信息,请在评论中告诉我。
答案 0 :(得分:5)
Matlab版本的库没有什么神奇之处,其他它在Matlab中运行,这让你更难以自己拍脚。
检查清单:
其他一些事情:
答案 1 :(得分:1)
我对使用rbf内核的libsvm非常满意。 carlosdc以正确的顺序指出了最常见的错误:-)。对于libsvm - 你使用libsvm附带的python工具吗?如果不是我建议这样做。将您的特征向量写入文件(来自matlab和/或c ++),并使用easy.py对rbf内核进行元素训练。您可以获得生成模型的参数和预测。如果这个预测没问题,请继续使用c ++。从训练中你还可以获得一个缩放的特征文件(每个特征的最小/最大转换为-1.0 / 1.0)。将这些与您的c ++实现进行比较。
一些libsvm问题:一个讨厌的习惯是(如果我没记错的话)在缩放文件中省略了缩放为0(零)的值。 grid.py中的参数是“nr_local_worker”,它定义了多个线程。你可能希望增加它。