OpenCv3.0.0中SVM预测的置信度

3
我正在使用一个程序来分类道路标志,我想要得到预测的置信度在0-1之间。我尝试计算置信度并将其与概率进行比较,但是这并不起作用,因为有些图像代表着(例如60公里/小时),但是其置信度低于0.9,而另一些图像(同样代表60公里/小时)的置信度高达0.9。对于未识别的交通标志也是如此:有些图像不代表交通标志,其置信度低于0.9,而其他图像的置信度高于0.9。我已经尝试过这个方法。
decision = svmob.predict(testData, true);
confidence = 1.0 / (1.0 + exp(-decision));

我发现了这个链接,但它在OpenCv3.0中无法运行。您能帮我吗?
然后我尝试了这个:
 int classObject = decision.at<float>(currentFile) < 0.0 ? 1 : -1;
    float confidence = classObject == -1 ? (1.0 / (1.0 + exp(-decision.at<float>(currentFile)))) : (1.0 - (1.0 / (1.0 + exp(-decision.at<float>(currentFile)))));
    if(confidence<0.9)
        printf("le panneau n'est pas reconnu");
    else
        printf("decision = %f, response = %f\n",
        decision.at<float>(0), response);

我想知道如何做,请问?

你最终解决了类似这样的问题吗? - David Doria
1个回答

2

在OpenCV3.0中,我们应该使用接口predict(p, noArray(), cv::ml::StatModel::RAW_OUTPUT)。它的作用等同于在OpenCV2.4中使用predict(p, true)。

OpenCV文档解释了该接口:C++: float StatModel::predict(InputArray samples, OutputArray results=noArray(), int flags=0 ) const 参数: samples - 输入样本,浮点矩阵 results - 可选的输出结果矩阵。

flags - 可选标志,与模型相关。一些模型(如Boost、SVM)识别StatModel :: RAW_OUTPUT标志,使该方法返回原始结果(总和),而不是类标签。


使用 cv::Mat results; float response = svm->predict(sample.t(), results, cv::ml::StatModel::RAW_OUTPUT); 只会产生返回值为 0,并且与 float response = svm->predict(sample); 相同的类索引作为 results 中唯一的条目。 - David Doria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接