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

标签 c++ opencv image-processing svm

我正在使用 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。

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

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

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

关于c++ - SVM 分类器(响应数组必须包含与样本总数一样多的元素),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31596036/

相关文章:

c++ - SuperResolution nextFrame 错误

python - OpenCV VideoWriter:播放视频的问题

algorithm - 将RGB图像读入二进制并在Matlab中显示为RGB

c++ - fstream 不会创建文件

c++ - 在 C 模块中声明一个 vector 变量导致段错误

c++ - 使用opencv cap无法使用While循环调用函数两次

android - 从Android上的缩略图查询中获取图像

c++ - 为什么我们需要rbegin并撕裂?

c++ - 使用 MsgPack 通过 ZeroMQ (zmqpp) 发送数据给出 'msgpack::v1::insufficient_bytes' 错误

javascript - 使用 GLFX.js 组合效果