【问题标题】:How do I test an OpenCV SVM?如何测试 OpenCV SVM?
【发布时间】:2023-03-21 21:22:01
【问题描述】:

我已使用此示例中的 OpenCV SVM http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

现在我需要针对我的预测值测试此 SVM 的准确性。这是我预测 SVM 准确性的代码部分。

void svm(cv::Mat& trainingDataMat, cv::Mat& labelsMat, cv::Mat& Testdata) {
int t=0;
int f=0;
int Acc;
 CvSVMParams params;
params.svm_type    = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
CvSVM SVM;
SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);
cv::Mat predicted(1,1, CV_32F);

for(int i = 0; i < Testdata.rows; i++) {
    cv::Mat sample = Testdata.row(i);
    predicted.at<float>(i,0)= SVM.predict(sample);
    float p = predicted.at<float>(i,0);

    if (p > 0.0) || p<0.0) {
        t++;
    }
    else {
        f++;
    }

    Acc=(t*1.0)/(t+f);
    }
  cout << "Accuracy_{SVM} = " <<Acc << endl;
   }

我试图一次测试一个测试数据,并找出一行中的每一列是属于经过训练的分类器的正面还是负面及其预测的准确性。

这段代码我面临的问题是预测百分比总是显示为 100。

我觉得这有点奇怪,希望有人在这件事上帮助我吗?

【问题讨论】:

  • 你需要向我们展示你迄今为止的最大努力

标签: c++ opencv machine-learning computer-vision svm


【解决方案1】:

看来你的问题在于“真”和“假”的检测,实际上你的代码甚至不应该编译(1个左括号和2个右括号)

if (p > 0.0) || p<0.0) {
        t++;
    }
    else {
        f++;
    }

如果p!=0.0,你给你的模型一个“点”,所以你可以得到 100%。您应该将 SVM 的预测与该点的 true 值进行比较。如果它们相同 - 增加 t 计数器,否则增加 f

【讨论】:

    猜你喜欢
    • 2013-05-22
    • 2014-07-09
    • 2020-08-03
    • 2016-11-28
    • 2015-03-15
    • 2012-08-03
    • 2015-04-09
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多