SVM CLASSIFIER(响应数组必须包含与样本总数相同的元素)

SVM CLASSIFIER (Response array must contain as many elements as the total number of samples)

本文关键字:元素 样本 响应 CLASSIFIER 数组 包含 SVM      更新时间:2023-10-16

我正在使用SVM进行真菌检测。我不知道为什么我在训练分类器时得到这个错误。

error:(-209)响应数组必须包含相同数目元素作为函数cvPreprocessCategoricalResponses中的样本总数

Mat classes;//(PosSamples+NagSamples, 1, CV_32FC1); 
Mat trainingData;//(PosSample+NagSample, imgWidth*imgHeight,CV_32FC1 );
cv::Mat trainingImages;
vector<int> trainingLabels;
 for (int pimageNum = 0; pimageNum < 359; pimageNum++)
  {
// reading Positive Samples
        trainingImages.push_back(posImage);
        trainingLabels.push_back(1.0);
}
for (int nimageNum = 0; nimageNum < 171; nimageNum++)
  {
// reading Nagative Samples
        trainingImages.push_back(nagImage);
        trainingLabels.push_back(0.0);
}
 Mat(trainingImages).copyTo(trainingData);
    trainingData.convertTo(trainingData, CV_32FC1);
    Mat(trainingLabels).copyTo(classes);
 FileStorage fs0("D:\classifier.yml", FileStorage::WRITE);
    fs0 << "TrainingData" << trainingData;
    fs0 << "classes" << classes;
    fs0.release();
 CvSVMParams SVM_params;
    SVM_params.svm_type = CvSVM::C_SVC;
    SVM_params.kernel_type = CvSVM::LINEAR;
    SVM_params.degree = 0;
    SVM_params.gamma = 1;
    SVM_params.coef0 = 0;
    SVM_params.C = 1;
    SVM_params.nu = 0;
    SVM_params.p = 0;
    SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);
    //Train SVM
    CvSVM svmClassifier(SVM_TrainingData, SVM_Classes, Mat(), Mat(), SVM_params);

/////////////////图像尺寸是50×50 /////////////////

In Classifier.yml file.
TrainingData: !!opencv-matrix
   rows: 26500
   cols: 50
classes: !!opencv-matrix
   rows: 530
   cols: 1

每行(不是每张图像)都是一个示例。有26500行样本,530个类。这是由于你的图像是50的高度:50*530 = 26500。

通常你会在你的图像上计算一些特征用于支持向量机。如果你想使用你的原始图像,你应该做一个:

  1. 线性化/调整图像大小,使每个图像是1x2500。您将获得530个培训数据和530个课程。
  2. 为每个图像复制您的类50次。您将获得26500培训和26500课程。

这是由你来决定你的整个图像是一个特征(情况1),或每一行你的图像是一个特征(情况2)。