2013-02-17 150 views
3

我使用CvSVM仅对两种类型的面部表情进行分类。我使用基于LBP(本地二进制模式)的直方图从图像中提取特征,并使用cvSVM::train(data_mat,labels_mat,Mat(),Mat(),params)进行训练,其中,CvSVM.predict()给出'NaN'输出并且准确度低

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. 测试时我变得非常坏的结果(约10%-30%的准确率),即使有不同的内核和train_auto()函数应用之后。

  2. CvSVM::predict(test_data_mat,true)给“男”输出

,我将不胜感激任何帮助,它让我难住了。

回答

1

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

1

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