绘制OpenCV SVM数据集可视化图
Draw a visualizing diagram OpenCV SVM data set
我是 OpenCV SVM 的新手。有没有办法为 OpenCV svm 开发的训练数据集绘制图表或开发一些视觉内容,以便我可以检查我的训练数据是否准确并相应地调整我的 SVM 参数?
可以可视化 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 像素的图像,并为每个像素检查它是否被 class 确定为属于一个 class 或另一个(响应 1 或 -1)。最重要的是,数据点已标记,因此您可以查看 SVM classification 是否正常工作。
// 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)
我是 OpenCV SVM 的新手。有没有办法为 OpenCV svm 开发的训练数据集绘制图表或开发一些视觉内容,以便我可以检查我的训练数据是否准确并相应地调整我的 SVM 参数?
可以可视化 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 像素的图像,并为每个像素检查它是否被 class 确定为属于一个 class 或另一个(响应 1 或 -1)。最重要的是,数据点已标记,因此您可以查看 SVM classification 是否正常工作。
// 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)