我正在使用 SVM 开发图像分类器。仅出于开发和调试的原因,我目前使用 16 个图像,每个 8 个 2 个不同的类。我的程序中的问题是,当我确定对象属于哪个类时,它总是只给我一个类。例如,我的 16 张图片的标签是 {-1 和 1}。即使我用标签 -1 预测我的训练数据,我也总是得到 1。
我的算法:我正在使用词袋模型来创建每个包含 1000 个簇的字典。对于特征提取,我使用 SURF。
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");
Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("SURF");
Ptr<FeatureDetector> detector = FeatureDetector::create("SURF");
int cluster_size = 1000;
BOWKMeansTrainer bowTrainer(cluster_size, TermCriteria(CV_TERMCRIT_ITER, 10, 0.001), 1, KMEANS_PP_CENTERS);
BOWImgDescriptorExtractor bowDE(extractor, matcher);
接下来,我从训练集中读取图像......(我在这里跳过阅读代码......)但是对于程序读取的每个图像:
detector->detect(image, keypoints);
extractor->compute(image, keypoints, descriptors);
bowTrainer.add(descriptors);
完成创建字典。
训练数据路径和标签是从文本文件中读取的,如上所述,我使用 -1 和 1 作为标签,因为我只有 2 个类。
现在我将谈谈我的 SVM 部分:
SVMParams param = SVMParams () ;
param . svm_type = SVM :: C_SVC ;
param . kernel_type = SVM :: LINEAR ;
param . degree = 10;
param . gamma = 20;
param . coef0 = 0;
param . C = 7;
param . nu = 0.5;
param . p = 0.5;
param . class_weights = NULL ; // for CV_SVM_C_SVC
param . term_crit . type = CV_TERMCRIT_ITER ;
param . term_crit . max_iter = 100;
param . term_crit . epsilon = 1e-6;
请注意我已经调整的一些参数只是为了看看我是否更接近响应,但这无济于事。初始参数是从 libsvm 库中提取的,我对其进行了更改以查看是否得到任何结果。但这没有帮助。
最后我训练而不是预测。支持向量机支持向量机;svm.train(train__,labels, Mat(), Mat(), param);
现在我的问题又是我没有得到正确的结果。确切地说,如果我测试来自 -1 类的数据,svm predict 给出 1,对于 1,它也给出 1。有人可以向我解释一下我错过了阻止我的程序获得正确响应的步骤吗?
谢谢你,很抱歉很长的问题。