opencv - 使用带有 RBF 内核的 SVM 的意外性能

标签 opencv svm

我对 svm 分类有点陌生。我正在尝试使用 opencv svm 分类器进行一些人脸识别。输入特征参数是归一化的局部二进制模式。所以所有的值都是从0-1。我首先尝试使用线性核来训练分类器,然后使用训练数据集来测试集。我得到了 100% 的准确率(我知道这没有任何意义)。但是,当我将内核更改为 RBF(所有其他参数都是默认值)并重新测试训练集时,所有案例都归为一类,这意味着它们不可分离。我尝试了从 0.000001 到 10 的不同 Gamma 值。有人知道这个问题吗?谢谢。

顺便说一句,我在训练后检查了支持的向量,所有的值都是相同的。

这是代码

CvSVMParams param;
param.svm_type = CvSVM::C_SVC;
param.kernel_type = CvSVM::RBF; //CvSVM::RBF, CvSVM::LINEAR ...
param.degree = 2; // for poly
param.gamma = 0.000000001; // for poly/rbf/sigmoid
param.coef0 = 1; // for poly/sigmoid

param.C = 0.5; // for CV_SVM_C_SVC, CV_SVM_EPS_SVR and CV_SVM_NU_SVR
param.term_crit.type = CV_TERMCRIT_EPS;//CV_TERMCRIT_ITER +CV_TERMCRIT_EPS;
param.term_crit.max_iter = 1000000;
param.term_crit.epsilon = 1e-9;
SVM.train(trainingDataMat, labelMat, Mat(), Mat(), param);

for(int i=0; i<trainingDataMat.rows; i++){
    Mat sampleMat = trainingDataMat(Range(i,i+1), Range::all());
    double response = SVM.predict(sampleMat);
    cout<<"test"<<i<<"=  "<<response<<endl;
}

最佳答案

您可以做的是让 OpenCV 在使用 RBF 内核时使用 train_auto 优化 SVM 参数。 .这样您就不必担心这些参数,它们是自动设置的。

这个OpenCV docmentation为您如何使用它提供了很好的解释。或者,您可以引用此 great example on how to optimize SVM parameters

使用 train_auto 的缺点是训练可能需要很长时间。根据您的训练集,甚至可能需要几天的时间,因此请做好准备。

我实际上不知道你在期待什么,但我会给你一个提示:RBF 可能是 OpenCV 中可用的最复杂的内核,但它可能不会给你最好的结果。也试试其他内核!

关于opencv - 使用带有 RBF 内核的 SVM 的意外性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26329599/

相关文章:

c++ - OpenCV 和 RTMP 流

c++ - 如何获取亮像素或暗像素的坐标?打开简历

r:使用库读取 libsvm 文件(e1071)

r - R中Tune函数中 'dispersion'的含义

c++ - 通过更改代码格式计算结构 vector 中包含的双变量的平均值的不同结果?

python - 使用opencv和python清理图像背景后如何正确提取字母?

machine-learning - Liblinear 与 Pegasos

python - 在sklearn中运行10倍交叉验证后如何运行SVC分类器?

Python/Opencv Float 在转换时转换为不正确的 Int

python - 在 2D 绘图 python 中可视化具有 100 个属性的 SVM 模型