gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:55:23 32 4
gpt4 key购买 nike

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

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com