CvSVM预测不会返回正确的值

时间:2017-08-04 05:58:24

标签: opencv machine-learning svm libsvm

我正在尝试此article中的详细示例。

训练并进一步确定超平面的循环效果很好。

i.e.
// Data for visual representation
    int width = 512, height = 512;
    Mat image = Mat::zeros(height, width, CV_8UC3);

    // Set up training data
    float labels[4] = {1.0, -1.0, -1.0, -1.0};
    Mat labelsMat(4, 1, CV_32FC1, labels);

    float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} };
    Mat trainingDataMat(4, 2, CV_32FC1, trainingData);

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

    // Train the SVM
    CvSVM svm;
    svm.train(trainingDataMat, labelsMat, Mat(), Mat(), svmparam);
    svm.save("Training.xml");

    // Train the SVM
    svm->train(trainingDataMat, ml::ROW_SAMPLE, labelsMat);

    Vec3b blue(255, 0 ,0);
    Vec3b green(0, 255, 0);
    for(int x = 0; x < image.rows; ++x)
    {
        for(int y = 0; y < image.cols; ++y)
        {
            Mat sampleMat = (Mat_<float>(1,2) << y,x);
            float response = svm.predict(sampleMat);

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

但是当我尝试使用api(svm.get_support_vector(i);)获取支持向量时,它返回一个非常小的数字(如0.000876529e-28)。因此,在类型转换为“int”之后,坐标X,Y分别变为0,0。因此,即使在获得超平面后,我也无法获得相应的支持 - 矢量。

i.e.
for (int i = 0; i < c; ++i)
    {
        const float* v = svm.get_support_vector(i);
        cv::Point resCenter((int) v[0], (int) v[1]);
        std::cout << v[0] << ":" << v[1] << "= " << resCenter << std::endl;
        circle( image,  resCenter, 6,  Scalar(128, 128, 128), thickness, lineType);
    }

我尝试将坐标位置标准化为

X' = x - MinR / (MaxR - MinR)   // Here MinR and MaxR are size of cols (0, 512)
Y' = y - MinR / (MaxR - MinR)   // Here MinR and MaxR are size of rows (0, 512)

由于我是机器学习的新手,如果您建议我阅读以下问题,我将感激不尽:

  1. Train内部对我们传递的特征向量做了什么。 (据我所知,它创建了一个与提供的标签相关的类别,但它是如何发生的。)
  2. 预测的内部功能。
  3. 了解这些的任何指示都会对我有所帮助。感谢您提前的宝贵时间。

0 个答案:

没有答案