【问题标题】:Using SVM with opencv?将 SVM 与 opencv 一起使用?
【发布时间】:2013-09-20 00:03:15
【问题描述】:

我有大小为 100 的特征向量。总训练样本为 500,其中每个类有 10 个样本。我想为每个类设计一个单独的 svm 分类器。也就是说,每个类的分类器将被输入 10 个正(针对该类)和 490 个否定实例。 我的opencv代码如下

培训:

Mat trainingDataMat(500, 100, CV_32FC1, trainingData);//trainingData is 2D MATRIX

Mat labelsMat(500, 1, CV_32FC1, labels);//10 positive and 490 -ve labels
CvSVMParams params;
params.svm_type = SVM::C_SVC;
params.kernel_type = SVM::RBF;
CvSVM SVM; 
SVM.train_auto(trainingDataMat, labelsMat, Mat(), Mat(), params,5);
SVM.save(name);

用于测试

Mat sampleMat(1, size, CV_32FC1, testing_vector);// testing_vector is 1D vector
CvSVM SVM;
SVM.load(name);
float response = SVM.predict(sampleMat);

问题在于,即使我从训练集中给出正测试样本,类的分类器也会输出 -1,其他测试样本也是如此。

我也尝试过 ONE_CLASS svm,但它为每个测试样本给出 0。

我哪里出错了,或者我应该使用什么 svm 类型?如果可能,请用代码解释。 提前谢谢你。

【问题讨论】:

    标签: opencv


    【解决方案1】:

    您似乎错过了标准化步骤。 OpenCV 中的 SVM 分类器使用与 libsvm 相同的方法,如果您阅读 libsvm 的文档,它会说您应该在区间 [-1,1] 内标准化您的训练数据并获取比例参数。然后使用这些缩放参数来缩放您的测试数据。这可能是一个问题。或者可能是因为正样本和负样本的数量不相等。在您训练了 SVM 之后,是否尝试将您的训练数据分类为交叉验证?

    【讨论】:

    • :数据已经缩放。是的,数据的正负样本数量不相等(10 个正样本和 490 个负样本)。那么是否可以用 svm 对这些数据进行分类呢? .我也可以在这里使用 ONE_CLASS SVM 吗? .谢谢。
    • 我认为没有人可以说数据是否可以使用 SVM 进行分类。数据应该是可分类的,以便 SVM 可以对其进行分类。如果您的数据不仅是 SVM 不可分类,那么其他分类器也无法对其进行分类。 SVM 只是一个复杂且易于使用的分类器,前提是您的数据是可分类的。您要对哪种数据进行分类?您没有提供接近数量的正负训练样本的原因是什么?
    • :实际上我正在尝试对人脸数据进行分类。我有一个我想要分类的人脸描述符。对于每个人我有 10 个样本,所以在训练 SVM 时(每人一个) 我将 10 个阳性标记为阴性。因此,在测试第一、第二个人时,我将使用 SVM1、SVM2 等等。是不可分类数据的原因吗?
    • 好的,你的数据是人脸数据,那是什么数据呢? DCT系数,LBP特征?我想说这可能是您的描述符对问题不正确,例如,如果您使用颜色直方图进行面部验证,它很可能会失败。也许您可以仅使用 2 个用户进行测试。使用 10 个正例和 10 个负例训练您的系统并对其进行测试,如果失败,我可以说您的问题不是 SVM,而是其他问题。
    • @guneykaiym:你有问题,它只是描述符
    【解决方案2】:

    尝试对每个类使用线性核和大致相等的正负数。您可以通过设置 gamma 和成本参数的值来调整精度/召回率。看一看:The gamma and cost parameter of SVM

    【讨论】:

      猜你喜欢
      • 2014-04-05
      • 2013-02-26
      • 2015-11-27
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      相关资源
      最近更新 更多