【问题标题】:Learning of SVM CodeSVM代码的学习
【发布时间】:2013-07-30 16:56:12
【问题描述】:

嗯,它是一个论坛,用于发布您感到困难的问题,同样的事情发生在我身上,所以我在这里发布问题,我需要学习代码,理解它,它在做什么以及我们可以做更多的事情有了它

// 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(3, 1, CV_32FC1, labels);

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

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

     // 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 <2; ++i)
     for (int j = 0; j <2; ++j)
     {
     Mat sampleMat = (Mat_<float>(1,2) << i,j);
     float response = SVM.predict(sampleMat);

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

我知道这段代码是用于训练数据的,但我想知道它的基本知识,它的基本理解,我想我在 opencv 文档中没有找到,比如为什么以及何时使用CV_8UC3,以及使用哪个这段代码正在训练的东西

谢谢

【问题讨论】:

  • 顺便说一句,不应该是Mat trainingDataMat(4, 2, CV_32FC1, trainingData); 吗? (4 个数据点,4 个标签)
  • @berak 我不知道,我现在正在学习,我还没有自己编码,这就是我在这里寻求帮助的原因

标签: opencv image-processing computer-vision


【解决方案1】:

image是一个空的3通道矩阵数据,即512x512; R-G-B 频道。最后,此代码将响应(SVM 的预测)绘制到该图像上 - 某处的图像 = green = (0,255,0)。它是在一个 for 循环中完成的,以通过逐点分配创建行。

SVM模型训练是this method的一个内部过程,其中opencv使用了只看源码就能找到的学习算法。但是,文档中声明和描述了 svm_type、kernel_type、k_fold、grid、balanced 等参数会改变方法的行为。

【讨论】:

  • 我们为什么以及何时使用 CV_8UC3 ?
  • float labels[4] = {1.0, -1.0, -1.0, -1.0}; 这行在做什么,你能解释一下你的答案
  • 8U = 无符号 8 位。这意味着一个像素中的每个通道都可以有 2^8 = 256 个不同的值(0 到 255)。例如,具有 (255,0,0) 的像素意味着 BLUE = 255,GREEN = 0,RED = 0。他初始化了零图像,因此所有像素都为零 = 黑色。 C3表示它有3个通道,而不是1个。所以它不是灰度。它是彩色的。 “标签”只是训练输入的标签。他想命名点 (501,10) = 1,其他点 (255,10) (501,255) (10,501) = -1。训练结束后,更接近(501,10)的点将被标记为“1”并显示为绿色,其他点为蓝色。
  • 我可以使用相同的方法来训练我的系统检测车辆吗?
  • 好吧,我不知道你的系统。但是我可以给你有关 SVM 的信息。它尝试根据先验知识(此处的标签)对点进行分类。例如,如果您使用的是 opencv 的 SIFT / SURF 方法;找到关键点后,您可以使用 SVM 对它们进行分类,将距离较近的点归为车辆。
猜你喜欢
  • 2017-11-04
  • 2020-04-24
  • 2018-04-25
  • 2012-03-27
  • 2018-01-21
  • 2011-04-27
  • 2018-02-06
  • 2014-02-02
相关资源
最近更新 更多