Java 支持向量机响应opencv中的问题

Java 支持向量机响应opencv中的问题,java,opencv3.0,sift,surf,Java,Opencv3.0,Sift,Surf,我正在研究乳腺癌检测系统并使用miniMias数据集。我在最后一步,我正在从ROI中提取SIFT,SURF特征,对于不同的ROI我有不同数量的特征,所以我得到了不同数量的描述符。 我在做什么 找到所有数据集的最少数量的SIFT、SURF描述符(以便训练数据大小相同) 在单个向量中插入两个SIFT,SURF描述符(从索引开始到最小长度)(首先进行SIFT,然后进行SURF) 这就是我将特征传递给SVM的方式,但是我没有得到测试数据的期望响应,测试数据的准确率低于50%。我也尝试过洗牌,但效果相同。

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

  • 找到所有数据集的最少数量的SIFT、SURF描述符(以便训练数据大小相同)
  • 在单个向量中插入两个SIFT,SURF描述符(从索引开始到最小长度)(首先进行SIFT,然后进行SURF)
  • 这就是我将特征传递给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) 为我们的训练数据选择正确类型的核您正在使用线性核尝试使用其他类型的核,如RBF,并查看精度,然后选择精度最高的核类型。顺便说一句,RBF主要用于核类型,对于非线性可分离数据集具有更好的性能

    2) 选择最佳参数C和gamma。您必须在opencv SVM中为C和gamma参数选择最佳值,或者您也可以使用SVM的train_auto方法代替train,然后此方法将自动为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);
    

    尝试使用SVM。获取默认网格(CvSVM.GAMMA)使用此链接我已经手动完成了(使用这些方法创建了自己的类),但精度相同如果您不使用自动训练方法,请搜索“如何在SVM中获得C和GAMMA的优化值”