支持OpenCV中的Vector Machine图像分类器

时间:2013-06-17 09:15:23

标签: opencv image-processing svm libsvm

我正在使用SVM开发图像分类器。仅仅出于开发和调试的原因,我现在使用16个图像,每个2个不同的类别。我的程序中的问题是,当我确定对象属于哪个类时,它只给我一个类。例如,我的16张图像的标签是{-1和1}。即使我用标签-1预测我的训练数据,我总是得到1。

我的算法: 我正在使用word模型包来创建每个包含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 svm;     svm.train(train __,labels,Mat(),Mat(),param);

现在我的问题是我没有得到正确的结果。如果我从-1的类测试数据,那么svm预测给出1,而对于1,它也给出1。有人可以向我解释我错过的步骤是阻止我的程序获得正确的响应。

谢谢你,对不起,我很抱歉。

0 个答案:

没有答案