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