0

我正在做一个基于 opencv 和 SVM(支持向量机)的项目。为了识别用户显示的手势,我需要使用 SVM 进行分类。我已将 svm.cpp 和 svm.h 文件添加到我的项目中,下面是我的预测部分代码。

svm_node x[featureVectorSize];

// inside a loop
for(int k;0 < featureVectorSize; k++)
{
    x[k].index = k+1;
    x[k].value = FeatureVectorVal[k]; // i have a vector to store feature values for test data    //(without scaling)
}

    svm_model* newmodel = svm_load_model("Mymodels\\A.scale.model");
    double *ProbVal = new double[1];
    double result = svm_predict_probability(newmodel,x,ProbVal);
    cout<<"result "<< result<<"\n";
    cout<<"ProbVal "<< *ProbVal<<"\n";
    svm_free_model_content(newmodel); 
    svm_free_and_destroy_model(&newmodel);

//some code to show output

Q1。当我使用模型 A 进行分类时,它总是将匹配结果值设为 -1。这意味着与测试数据不匹配。之后,我对测试数据的缩放特征值进行了硬编码(在 FeatureVectorVal 上方写入文本文件并使用 Libsvm 包提供的 scale.exe 进行缩放)。然后我用相同的模型做了预测。现在它给了我+1的结果。所以这意味着我必须将缩放的测试数据输入到 svm_node 结构。但是在 svm.cpp 我找不到任何缩放我的测试数据的函数。如何使用 svm.cpp 函数扩展我的测试数据?

Q2。当我使用多个模型(使用模型文件路径数组)进行预测时,程序在使用第一个模型进行预测后崩溃并提示我;

if ((model->param.svm_type == C_SVC || model->param.svm_type == NU_SVC) && model->probA!=NULL && model->probB!=NULL)

svm.cpp 文件中的行。

需要帮助的家伙..提前谢谢:-)

4

0 回答 0