4

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

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

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

CvSVMParams 参数;

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)给出“NaN”输出

我将不胜感激任何帮助,这让我很难过。

4

2 回答 2

1

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

于 2013-08-01T12:50:35.330 回答
1

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

于 2013-08-01T13:25:03.553 回答