CvSVM.predict()给出'NaN'输出和低精度

时间:2013-02-17 18:18:04

标签: opencv svm

我使用CvSVM仅对两种类型的面部表情进行分类。我使用基于LBP(局部二进制模式)的直方图从图像中提取特征,并使用cvSVM::train(data_mat,labels_mat,Mat(),Mat(),params)进行训练,其中,

data_mat的大小为200x3452,包含行主要形式的200个样本的归一化(0-1)特征直方图,每个具有3452个特征(取决于邻域点的数量)

labels_mat是对应的标签矩阵,只包含两个值0和1。 参数是:

CvSVMParams params;

params.svm_type     =CvSVM::C_SVC;
params.kernel_type  =CvSVM::LINEAR;
params.C            =0.01;
params.term_crit=cvTermCriteria(CV_TERMCRIT_ITER,(int)1e7,1e-7);

问题是: -

  1. 测试时,即使应用了不同的内核和train_auto()函数,我的结果也非常糟糕(准确度大约在10%-30%之间)。

  2. CvSVM::predict(test_data_mat,true)提供'NaN'输出

  3. 我将非常感谢任何帮助,这让我感到难过。

2 个答案:

答案 0 :(得分:1)

我想,你的类在你使用的特征空间中线性硬/不可分。 可能最好在分类器训练步骤之前将PCA应用于数据集 并估计这个问题的有效维度。 此外,我认为用户可以使用其他分类器测试您的数据集。 您可以为此目的调整标准opencv示例points_classifier.cpp。 它包含许多不同的分类器,你可以使用类似的界面。

答案 1 :(得分:1)

SVM泛化能力较低。首先通过主成分分析减少数据维度,然后将SVM kerenl类型更改为RBF。