SVM CLASSIFIER(响应数组必须包含与样本总数相同的元素)
SVM CLASSIFIER (Response array must contain as many elements as the total number of samples)
我正在使用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。
通常你会在你的图像上计算一些特征用于支持向量机。如果你想使用你的原始图像,你应该做一个:
- 线性化/调整图像大小,使每个图像是1x2500。您将获得530个培训数据和530个课程。
- 为每个图像复制您的类50次。您将获得26500培训和26500课程。
这是由你来决定你的整个图像是一个特征(情况1),或每一行你的图像是一个特征(情况2)。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何从 std::set 绘制 n 个元素的样本
- 如何创建所有缺少一个元素的样本向量
- 在std::multiset中,如果找到一个元素,有一个函数或算法可以只擦除一个样本(单播或重复)
- SVM CLASSIFIER(响应数组必须包含与样本总数相同的元素)