[英]How to form data for SVM training OpenCV3
I am trying to write utility for training svm classifier for image classification in OpenCV3. 我正在尝试编写实用程序来训练svm分类器以在OpenCV3中进行图像分类。 But I have Floating point exception (core dumped) error during training process. 但是我在训练过程中出现了浮点异常(核心转储)错误。
My main problem is that I don't know, I'm not sure exactly how to form training data to feed svm.train method. 我的主要问题是我不知道,我不确定如何形成训练数据来馈送svm.train方法。
This is code which is forming training data. 这是形成训练数据的代码。
TrainingDataType SVMTrainer::prepareDataForTraining() {
cv::Mat trainingData(m_numOfAllImages, 28*28, CV_32FC1);
cv::Mat trainingLabels(m_numOfAllImages, 1, CV_32FC1);
int rowNum = 0;
// Item is pair of classId (int) and vector of images.
for(auto item : m_data){
int classId = item.first;
for(auto item1 : item.second){
Mat temp = item1.reshape(1,1);
temp.copyTo(trainingData.row(rowNum));
trainingLabels.at<float>(rowNum) = item.first;
++rowNum;
}
}
return cv::ml::TrainData::create(trainingData,
cv::ml::SampleTypes::ROW_SAMPLE,
trainingLabels) ;
}
void SVMTrainer::train(std::string& configPath){
// Read and store images in memory.
formClassifierData(configPath);
m_classifier = cv::ml::SVM::create();
// Training parameters:
m_classifier->setType(cv::ml::SVM::C_SVC);
m_classifier->setKernel(cv::ml::SVM::POLY);
m_classifier->setGamma(3);
m_classifier->setDegree(3);
TrainingDataType trainData = prepareDataForTraining();
m_classifier->trainAuto(trainData);
}
All images are already prepared with dimensions 28*28, black&white. 所有图像均已准备好尺寸为28 * 28(黑白)。
And actual train call is in this method 而实际的火车通话就是这种方法
Can somebody tell me what I am doing wrong. 有人可以告诉我我在做什么错。
Thanks, 谢谢,
Its simple. 这很简单。 Change the label format to CV_32SC1. 将标签格式更改为CV_32SC1。 It will definitely resolve your issue in opencv 3.0 ml. 它将完全解决您在opencv 3.0 ml中的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.