绘制OpenCV SVM数据集的可视化图

时间:2016-12-24 10:56:15

标签: opencv svm

我是OpenCV SVM的新手。有没有办法为OpenCV svm开发的训练数据集绘制图形或开发一些可视内容,以便我可以检查我的训练数据是否准确并相应地调整我的SVM参数?

1 个答案:

答案 0 :(得分:1)

可以可视化SVM响应,并且可以使用OpenCV绘图功能完成。

这个问题已经过时了,但它在Google搜索结果中显示出很高的可视化SVM。我回答任何可能发现这个问题的人。

这里有一个带有示例代码的SVM教程: https://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

它包含用于可视化SVM学习内容的代码。请注意,此示例显示了平面上的数据,因此仅当您的数据为2D时才会起作用。

因此,下面的代码(它来自链接的OpenCV文档)创建一个512 x 512 px的图像,并为每个像素检查它是否被归类为属于一个类或另一个类(响应1或-1)。最重要的是,数据点已标记,因此您可以查看SVM分类是否运行良好。

// Train the SVM
CvSVM SVM;
SVM.train(trainingDataMat, labelsMat, 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);

如果您的数据点是整数对,这是一个很好的方法。如果您有float个数据点,则需要确定所需的可视化分辨率,并使像素不是1 x 1块,而是要求最低分辨率(例如5.0e-27 x 2.0e-24)