1
我使用的是OpenCV 3.0.0。在運行OpenCV的SVM示例1時,我注意到當自動訓練而不是訓練時,預測值介於0和1之間。當我直接使用libsvm運行相同示例時,我看不到相同的行爲。Opencv 3支持SVM訓練自動縮放標籤嗎?
這是一個錯誤還是有意縮放標籤以及其他功能?行爲似乎也沒有記錄。
這裏是我運行代碼:
// 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;
如果有trainAuto RAN將輸出0和1,而不是-1和1
是的,這是一個錯誤。更新到OpenCV 3.2;) – Miki