【问题标题】:OPencv SVM predict probabilityOPencv SVM 预测概率
【发布时间】:2013-05-22 21:20:01
【问题描述】:

我正在开发一个使用 BOW 模型和 SVM 的图像分类项目。 我想找出 SVM 预测概率,但 opencv svm 中没有这样的功能。有没有办法做到这一点?我想找出 n 类 SVM 中的预测概率。

【问题讨论】:

    标签: opencv svm


    【解决方案1】:

    不,你不能用 CvSVM 做到这一点。 OpenCV 的 SVM 实现基于非常旧的 libsvm 版本。下载最新版本的 libsvm 并改用它。当然,您必须编写一个包装器来转换数据格式。见http://www.csie.ntu.edu.tw/~cjlin/libsvm/

    【讨论】:

    • 或者,您可以自己对决策值实施 Platt 缩放,作为获取概率的后处理步骤。
    • 这仍然是 2015 年 4 月的首选方法吗?
    【解决方案2】:

    正如我的@Bull 所建议的,预测概率未在 OpenCV 中实现。但是有很好的方法可以访问底层libsvm 来获得它。 blog 的详细信息和代码 sn-p 如下:

    注意:此函数会加载模型,因此不会从外部加载它。

    #include "svm.h"
    ...
    void predict(string modelPath, Mat& hist) {
    
        const char *MODEL_FILE = modelPath.c_str();
        if ((this->SVMModel = svm_load_model(MODEL_FILE)) == 0) {
            this->modelLoaded = false;
            fprintf(stderr, "Can't load SVM model %s", MODEL_FILE);
            return;
        }
    
        struct svm_node *svmVec;
        svmVec = (struct svm_node *)malloc((hist.cols+1)*sizeof(struct svm_node));
        int j;
        for (j = 0; j < hist.cols; j++) {
            svmVec[j].index = j+1;
            svmVec[j].value = hist.at<float>(0, j);
        }
        svmVec[j].index = -1; // this is quite essential. No documentation.
    
        double scores[8]; // suppose there are eight classes
        if(svm_check_probability_model(SVMModel)) {
            svm_predict_probability(SVMModel, svmVec, scores);
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以尝试生成一个混淆矩阵,它应该告诉您每个图像属于任何类别的概率。 Confusion Matrix

      在这里你有一个我找到的 sn-p,虽然它不完整,但它可能会给你一些想法:

      map<string,map<string,int> > confusion_matrix; // confusionMatrix[classA][classB] =   number_of_times_A_voted_for_B;
      map<string,CvSVM> classes_classifiers; //This we created earlier
      
      vector<string> files; //load up with images
      vector<string> classes; //load up with the respective classes
      
      for(..loop over a directory?..) {
      Mat img = imread(files[i]),resposne_hist;
      
      vector<KeyPoint> keypoints;
      detector->detect(img,keypoints);
      bowide->compute(img, keypoints, response_hist);
      
      float minf = FLT_MAX; string minclass;
      for (map<string,CvSVM>::iterator it = classes_classifiers.begin(); it !=       classes_classifiers.end(); ++it) {
        float res = (*it).second.predict(response_hist,true);
        if (res < minf) {
           minf = res;
           minclass = (*it).first;
        }
      }
      confusion_matrix[minclass][classes[i]]++;  
      }
      

      我还没有测试它,所以如果你让它工作,我会很感激你在这里交流它:)

      来源:a-simple-object-classifier-with-bag-of-words

      【讨论】:

      • 我不同意。混淆矩阵概率是给定基本事实的频率论方法。混淆矩阵对于看不见的图像是没有用的。
      猜你喜欢
      • 2018-09-05
      • 1970-01-01
      • 2016-05-23
      • 2017-12-07
      • 2014-07-09
      • 2020-08-03
      • 1970-01-01
      • 2019-09-16
      相关资源
      最近更新 更多