SVM响应opencv中的问题

时间:2017-05-26 05:30:00

标签: java opencv3.0 sift surf

我正在研究乳腺癌检测系统并使用miniMias数据集。我正在最后一步,我正在从 ROI 中提取 SIFT,SURF 功能,并且针对不同的 ROI 我有不同数量的功能,所以我有所不同描述符的数量。 我在做什么?

  1. 查找所有数据集的 SIFT,SURF 描述符的最少数量(以便训练数据大小相同)。
  2. 在单个矢量中插入 SIFT,SURF 描述符(起始索引到最小长度)(首先筛选然后冲浪)。
  3. 这就是我如何将功能传递给 SVM ,但我没有得到测试数据的预期响应,测试数据的准确率低于50%。我也试过洗牌但结果相同。功能有问题吗?有人能告诉我该怎么办?

    这是我设置SVM参数的方法。

    CvSVMParams params=new CvSVMParams();
    params.set_svm_type(CvSVM.C_SVC);
    params.set_kernel_type(CvSVM.LINEAR);
    TermCriteria termC = new TermCriteria(TermCriteria.MAX_ITER, 100, 1e-6);
    params.set_term_crit(termC);
    CvSVM classifier = new CvSVM();
    classifier.train(feature, label, new Mat(), new Mat(), params);
    

1 个答案:

答案 0 :(得分:1)

在SVM中,有许多参数可以帮助我们获得准确的结果。其中一些是: -

1)为我们的训练数据选择正确类型的内核你正在使用线性内核尝试使用其他类型的内核(如RBF)并查看准确性,然后选择具有最高精度的内核类型。顺便说一句,RBF主要使用内核类型,更好地执行非线性可分数据集。

2)选择最佳参数C和gamma。您必须在opencv SVM中为C和gamma参数选择最佳值,或者您也可以使用SVM的train_auto方法代替列车,然后此方法将自动选择C,gamma和其他参数的最佳值。

使用类似于C ++的代码,但很容易将其更改为java

cv::SVMParams params;
        params.kernel_type = CvSVM::RBF; //CvSVM::RBF, CvSVM::LINEAR ...
        params.svm_type=SVM::C_SVC;
        params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,100000,0.000001);

SVM svm;    svm.train_auto(samples,labels,Mat(),Mat(),params,2,SVM::get_default_grid(SVM::C),SVM::get_default_grid(SVM::GAMMA),SVM::get_default_grid(SVM::P),SVM::get_default_grid(SVM::NU),
                     SVM::get_default_grid(SVM::COEF),SVM::get_default_grid(SVM::DEGREE),false);

    char *fs="svmFile.yml";
    svm.save(fs);