2015-11-10 3 views
0

Я пытаюсь использовать 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? Любая помощь приветствуется.

Спасибо

+0

аргументы 'reshape': # 1 количество каналов, # 2 количество строк. Так что эта строка неверна. Вероятно, вам просто нужно прокомментировать эту строку, так как размер 'trainingDataMat' выглядит уже нормально. – Miki

+0

удаление reshape вызывает ошибку с количеством строк. "утверждение не выполнено ((layout == ROW_SAMPLE && response.rows == nsamples) || (макет == COL_SAMPLE && response.cols == nsamples))" – Phazoozoo

ответ

0

Ошибка была вызвана неправильным вводом ввода. Я изменил тип Mat matMat на CV_32S в его объявлении. Я также изменил

trainingDataMat_32.reshape (trainingDataMat_32.cols, 1);

, чтобы иметь правильное количество каналов и строк.

trainingDataMat_32.reshape (1, trainingDataMat_32.rows);

ТренировкаDataMat.cols была неправильной. Он нуждался в 1 канале (первый параметр) и том же числе строк, что и мой ввод гистограммы.

Это вызвало новую ошибку в отношении используемого ядра (параметр SVM «POLY»). Я должен был добавить еще одну строку прямо под параметром ядра:

svm-> setDegree (3);

Исправлена ​​ошибка. Мой вывод неправильный, но это решило ошибку утверждения.

Смежные вопросы