2015-11-10 74 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); 

     } 

Mats class_num和直方圖用於訓練SVM。 「直方圖」中的每一行表示樣本(訓練集中圖像的直方圖)。 「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); 

當我運行此我得到的錯誤 「斷言在CV ::毫升:: TrainDataImpl ::使用setData失敗(samples.type()== CV_32F || samples.type()== CV_32S)」 。但是,我已經放置了代碼行來將我的類Mat和我的直方圖Mat轉換爲類型CV_32F。我的輸入是問題還是與svm-> train中的ROW_SAMPLE有關?任何幫助是極大的讚賞。

謝謝

+0

'reshape'參數是#1個通道數,#2個行數。所以這條線是錯誤的。可能你只需要評論這一行,因爲'trainingDataMat'的大小似乎已經很好 – Miki

+0

刪除重整會導致行數錯誤。 「(assertion failed((layout == ROW_SAMPLE && response.rows == nsamples)||(layout == COL_SAMPLE && response.cols == nsamples))」 – Phazoozoo

回答

0

錯誤是由於我的輸入錯誤導致的。我在其聲明中將Mat classesMat的類型更改爲CV_32S。我也改變了

trainingDataMat_32.reshape(trainingDataMat_32.cols,1);

具有正確數量的通道和行。

trainingDataMat_32.reshape(1,trainingDataMat_32.rows);

TrainingDataMat.cols根本不是正確的值。它需要1個通道(第一個參數)和與我的直方圖輸入相同的行數。

這導致了關於我正在使用的內核(SVM參數「POLY」)的新錯誤。我不得不在內核參數下面添加另一行:

svm-> setDegree(3);

修正了錯誤。我的輸出不正確,但這解決了斷言失敗。