SVM 分类器(响应数组必须包含与样本总数一样多的元素)

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

我正在使用 SVM 进行真菌检测。我不知道为什么在训练分类器时会出现此错误。

错误:(-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);

//////////////// 图片大小为 50x50 ////////////////

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

每一行(不是每张图片)都是一个样本。所以你有 26500 行样本,和 530 类。这是因为您的图像高度为 50:50*530 = 26500.

通常,您会在图像上计算某种特征以用于 SVM。如果你想使用你的原始图像,你应该这样做:

  1. 对图像进行线性化/调整大小,使每张图像为 1x2500。您将获得 530 个训练数据和 530 个 类.
  2. 为每张图片重复 类 50 次。您将获得26500训练和26500类.

由您决定是整张图片是一个特征(案例 1),还是图片的每一行都是一个特征(案例 2)。