【问题标题】:SVM CLASSIFIER (Response array must contain as many elements as the total number of samples)SVM 分类器(响应数组必须包含与样本总数一样多的元素)
【发布时间】:2015-10-14 06:29:51
【问题描述】:

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

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

【问题讨论】:

    标签: c++ opencv image-processing svm


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回复。我已经尝试过 case.2 并且它有效:) 我确实喜欢这个,但仍然不确定它是否是一个好方法。 for (int nimageNum = 0; nimageNum
    • @MuhammadAbdulHaseeb 好吧,SVM 将对您的图像进行分类,而不是检测对象。但是,如果您正在对图像中的补丁进行分类并且只有两个类,您可以绘制一个掩码,您可以在每个补丁的位置放置分类标签值。然后轮廓检测和 boundingRect 的组合应该为您提供对象的边界。
    • 谢谢.. 但我该怎么做呢?你能分享一些代码或一些算法吗?我是第一次使用 SVM,它对我很有帮助。
    • @MuhammadAbdulHaseeb 发布 another 问题,您详细说明您想做什么,到目前为止您做了什么(包括代码),你的预期结果是什么。目前没有足够的详细信息可以帮助您。
    • 我发布了另一个问题以及示例图片。请看看我的新帖子。 stackoverflow.com/questions/31600540/…
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2017-09-18
    相关资源
    最近更新 更多