Я пытаюсь использовать SVM для сопоставления изображения запроса с соответствующим классом. Сейчас классы равны 1 или 0. Я извлекаю класс из файла .txt и сохраняю его в Mat. Я использую BoW для вычисления гистограммы для каждого изображения в обучающем наборе, а также сохраняю его в Mat.Ошибка при обучении SVM (утверждение не выполнено для типа образца)
Mat response_hist;
Mat histograms;
Mat classes;
ifstream ifs("train.txt");
int total_samples_in_file = 0;
vector<string> classes_names;
vector<string> lines;
for (int i = 1; i <= trainingSetSize; i++){
cout << "in for loop iteration"<< i << endl;
_snprintf_s(filepath, 100, "C:/Users/Randal/Desktop/TestCase1Training/train/%d.bmp", i);
Mat temp = imread(filepath, CV_LOAD_IMAGE_GRAYSCALE);
Mat tempBW;
adaptiveThreshold(temp, tempBW, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 11, 2);
detector->detect(tempBW, keypoints1);
BOW.compute(tempBW, keypoints1, response_hist);
response_hist.convertTo(response_hist, CV_32F);
histograms.push_back(response_hist);
}
//read from the file - ifs and put into a vector
std::string line;
float class_num;
string imgfilepath;
for (int j = 1; getline(ifs, line); j++)
{
istringstream ss(line);
ss >> imgfilepath >> class_num;
classes.push_back(class_num);
}
Маты class_num и гистограммы используются для обучения СВМ. Каждая строка в «гистограммах» представляет собой образец (гистограмма изображения в обучающем наборе). «class_num» - это одна строка с каждым столбцом, являющимся классом (1 или 0) соответствующего изображения в обучающем наборе.
Ptr<ml::SVM> svm = ml::SVM::create();
svm->setType(ml::SVM::C_SVC);
svm->setKernel(ml::SVM::POLY);
svm->setGamma(3);
Mat trainingDataMat(histograms);
Mat trainingDataClass(classes);
trainingDataMat.convertTo(trainingDataMat, CV_32F);
trainingDataMat = trainingDataMat.reshape(trainingDataMat.cols, 1);
trainingDataClass.convertTo(classes, CV_32F);
svm->train(trainingDataMat, ml::ROW_SAMPLE, trainingDataClass); //incorrect types? I think it is a problem with ROW_SAMPLE
Mat res; // output
svm->predict(output, res);
Когда я запускаю это я получаю ошибку "не удалось Assertion (samples.type() == CV_32F || samples.type() == CV_32S) в резюме :: мл :: TrainDataImpl :: УстановитьДанные" , Тем не менее, я поместил строки кода для преобразования как моего класса Mat, так и моей гистограммы Mat для ввода CV_32F. Является ли проблема с моими вхождениями или это имеет какое-то отношение к ROW_SAMPLE в svm-> train? Любая помощь приветствуется.
Спасибо
аргументы 'reshape': # 1 количество каналов, # 2 количество строк. Так что эта строка неверна. Вероятно, вам просто нужно прокомментировать эту строку, так как размер 'trainingDataMat' выглядит уже нормально. – Miki
удаление reshape вызывает ошибку с количеством строк. "утверждение не выполнено ((layout == ROW_SAMPLE && response.rows == nsamples) || (макет == COL_SAMPLE && response.cols == nsamples))" – Phazoozoo