2017-02-02 10 views
1

Я использую OpenCV 3.0.0. При запуске примера SVM OpenCV 1 я заметил, что при автоподготовке вместо тренировки предсказанные значения находятся между 0 и 1. Я не вижу такого же поведения, когда я запускаю тот же пример напрямую с libsvm.Есть ли Opencv 3 SVM trainAuto наклейки также?

Является ли это ошибкой или намеренным масштабированием меток вместе с другими функциями? Поведение также кажется недокументированным.

Вот код, я бегу:

// Set up training data 
size_t numberOfSamples = 4; 
cv::Mat1i labelsMat(numberOfSamples, 1); 
labelsMat(0, 0) = 1; 
labelsMat(1, 0) = -1; 
labelsMat(2, 0) = -1; 
labelsMat(3, 0) = -1; 

cv::Mat1f trainingDataMat(numberOfSamples, 2); 
// Sample 0 
trainingDataMat(0, 0) = 501; 
trainingDataMat(0, 1) = 10; 

// Sample 1 
trainingDataMat(1, 0) = 255; 
trainingDataMat(1, 1) = 10; 

// Sample 2 
trainingDataMat(2, 0) = 501; 
trainingDataMat(2, 1) = 255; 

// Sample 3 
trainingDataMat(3, 0) = 10; 
trainingDataMat(3, 1) = 501; 

// Set up SVM's parameters 
cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create(); 
svm->setType(cv::ml::SVM::C_SVC); 
svm->setKernel(cv::ml::SVM::LINEAR); 
svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 100, 1e-6)); 

// Train the SVM with given parameters 
cv::Ptr<cv::ml::TrainData> td = 
    cv::ml::TrainData::create(trainingDataMat, cv::ml::ROW_SAMPLE, labelsMat); 

// train the SVM 
// svm->train(td); 

// or auto train 
svm->trainAuto(td); 

// predict 
// first point used for training 
cv::Mat point1 = (cv::Mat_<float>(1, 2) << 501, 10); 
float response1 = svm->predict(point1); 
// second point used for training 
cv::Mat point2 = (cv::Mat_<float>(1, 2) << 255, 10); 
float response2 = svm->predict(point2); 

std::cout << "first point: " << response1 << "\n" << 
      << "second point: " << response2 << std::endl; 

Если RAN с trainAuto он будет выводить 0 и 1 вместо -1 и 1.

ответ

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

  • Нет связанных вопросов^_^