2015-10-06 4 views
0

Я использовал какую-СВМ:SVM Response Array Size Error

#include "opencv2/core/core.hpp" 
#include "opencv2/features2d/features2d.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/nonfree/features2d.hpp" 
#include "opencv2/nonfree/nonfree.hpp" 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
using namespace std; 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/ml/ml.hpp> 

using namespace cv; 

int main() 
{ 
    // Data for visual representation 
    int width = 512, height = 512; 
    Mat image = Mat::zeros(height, width, CV_8UC3); 

    //Load Data and Labels from csv files 
    CvMLData mlData; 
    mlData.read_csv("/home/rahim/workspace/svm/DataTrain1-svm.csv"); 
    const CvMat* tmpDataTr = mlData.get_values(); 
    cv::Mat DataTrt(tmpDataTr, true); 
    tmpDataTr->CvMat::~CvMat(); 
    cout << "M = "<< DataTrt << " " << DataTrt << endl << endl; 
    Mat DataTr = DataTrt.t(); 

    mlData.read_csv("/home/rahim/workspace/svm/LabelTrain1-svm.csv"); 
    const CvMat* tmpLabelTr = mlData.get_values(); 
    cv::Mat LabelTrt(tmpLabelTr, true); 
    tmpLabelTr->CvMat::~CvMat(); 
    cout << "M = "<< LabelTrt << " " << LabelTrt << endl << endl; 
    Mat LabelTr = LabelTrt.t(); 
    cout << "Data size = " << DataTr.size() << endl; 
    cout << "labels size = " << LabelTr.size() << endl; 

    // Set up SVM's parameters 
    CvSVMParams params; 
    params.svm_type = CvSVM::C_SVC; 
    params.kernel_type = CvSVM::LINEAR; 
    params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6); 

    // Train the SVM 
    CvSVM SVM; 
    //SVM.train(trainingData, traininglabels, Mat(), Mat(), params); 
    SVM.train(DataTr, LabelTr, Mat(), Mat(), params); 
    Vec3b green(0,255,0), blue (255,0,0); 
    // Show the decision regions given by the SVM 
    for (int i = 0; i < image.rows; ++i) 
     for (int j = 0; j < image.cols; ++j) 
     { 
      Mat sampleMat = (Mat_<float>(1,2) << j,i); 
      float response = SVM.predict(sampleMat); 

      if (response == 1) 
       image.at<Vec3b>(i,j) = green; 
      else if (response == -1) 
       image.at<Vec3b>(i,j) = blue; 
     } 

    // Show the training data 
    int thickness = -1; 
    int lineType = 8; 
    circle(image, Point(501, 10), 5, Scalar( 0, 0, 0), thickness, lineType); 
    circle(image, Point(255, 10), 5, Scalar(255, 255, 255), thickness, lineType); 
    circle(image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType); 
    circle(image, Point(10, 501), 5, Scalar(255, 255, 255), thickness, lineType); 

    // Show support vectors 
    thickness = 2; 
    lineType = 8; 
    int c  = SVM.get_support_vector_count(); 

    for (int i = 0; i < c; ++i) 
    { 
     const float* v = SVM.get_support_vector(i); 
     circle(image, Point((int) v[0], (int) v[1]), 6, Scalar(128, 128, 128), thickness, lineType); 
    } 

    imwrite("result.png", image);  // save the image 

    imshow("SVM Simple Example", image); // show it to the user 
    waitKey(0); 

} 

, но я получил следующее сообщение об ошибке: guments не совпадают (массив Ответ должен содержать столько же элементов, как общее число проб) в cvPreprocessCategoricalResponses

выход для DataTr.size() и LabelTr.size() являются [1800 * 9] и [1800 * 1] соответственно

ответ

0

Если я правильно понял, то есть 1800 образцов и 9 переменных.

Согласно OpenCV documentationCvSVM::train поддерживает только данные, содержащие образцы в строках. Поэтому вам не нужно переносить данные вашего поезда в режиме онлайн:

Mat DataTr = DataTrt.t(); 

Вам также не нужно транспонировать данные метки. Но это не так важно, поскольку данные ярлыков должны содержать только число элементов, равное количеству выборок. Это не имеет значения с точки зрения строк или столбцов.