使用OpenCV在多类分类中获取SVM分类分数

5

我正在进行一个项目,使用OpenCV中的SVM进行多类分类。

我的目标是获得分类的置信度得分和预测类别。我怎么做呢?目前我正在尝试以下方法:

float result = mysvm.predict(sample);

我有很多类别时,我更喜欢避免做大量的一对全分类,然后计算分数。

由于OpenCV SVM使用LibSVM实现,我相信有一种方法可以做到这一点,但是查看http://docs.opencv.org/modules/ml/doc/support_vector_machines.html并没有帮助。

感谢提供任何意见。

1个回答

3
opencv/include/opencv2/ml/ml.hpp 中,有一个名为 CvSVMDecisionFunc 的结构体。它在第 546 行作为受保护变量被使用。
CvSVMDecisionFunc* decision_func;

你需要做的是将该行代码剪切并粘贴为Public,然后对OpenCV进行完整重建。这个变量decision_func包含特定支持向量的所有数据(即alpha和rho值)。

这看起来是一个相当激进的方法,如果我找不到其他解决问题的方法,我会这样做。我已经看到predict()函数中的bool returnDFVal=false可以满足我的需求,但仅适用于二元分类。没有办法在多类分类中获得它吗? - powder
2
好的,既然我浪费了足够的时间尝试找到更好的方法来解决这个问题,我已经按照建议重新构建了我的OpenCV设置,将决策函数结构体设置为public。但是我仍然有一些困难理解其值。我有: - rho: -0.9667... - sv_count: 1 - alpha: {1.00...} - sv_index: 0不太是我预期的...我不应该拥有支持向量的数量,这些向量的数量等于我用于分类的类别数吗? - powder
我不知道如何在多类问题中使用returnDFVal。关于sv_count,你是正确的;它应该与类别数目相符(在这种情况下,在SVM训练阶段提供的标签)。一般来说,我尝试为负样本使用**-1.0**,并为其余样本使用单点正浮点数。 - scap3y
2
@powder 你可以避免重建OpenCV。由于decision_func是受保护的,因此您可以扩展CvSVM类并从扩展类中访问该变量。这种方式更好。 - nimcap

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