我有一个包含从各个角度拍摄的汽车图片的文件夹。我想使用词袋模型来训练系统识别这辆汽车。训练完成后,如果给出一张该车的图片,系统应该能够识别它。
为了实现这一点,我一直在学习OpenCV中的BOW函数,现在我已经到了不知道该怎么做的阶段,任何指导都会被非常感激。
以下是我用来创建词袋的代码:
Ptr<FeatureDetector> features = FeatureDetector::create("SIFT"); Ptr<DescriptorExtractor> descriptors = DescriptorExtractor::create("SIFT"); Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased"); //定义bowkmeans训练器的术语 TermCriteria tc(MAX_ITER + EPS, 10, 0.001); int dictionarySize = 1000; int retries = 1; int flags = KMEANS_PP_CENTERS; BOWKMeansTrainer bowTrainer(dictionarySize, tc, retries, flags); BOWImgDescriptorExtractor bowDE(descriptors, matcher); //现在是训练数据 Mat features; Mat img = imread("c:\\1.jpg", 0); Mat img2 = imread("c:\\2.jpg", 0); vector<KeyPoint> keypoints, keypoints2; features->detect(img, keypoints); features->detect(img2,keypoints2); descriptor->compute(img, keypoints, features); Mat features2; descripto->compute(img2, keypoints2, features2); bowTrainer.add(features); bowTrainer.add(features2); Mat dictionary = bowTrainer.cluster(); bowDE.setVocabulary(dictionary);
这都是基于BOW文档的。
我认为此时我的系统已经训练好了。下一步是预测。
这是我不知道该怎么做的部分。如果我使用SVM
或NormalBayesClassifier
,它们都使用训练和预测这两个术语。
在这一点之后,我该如何预测和训练?任何指导都会被非常感激。我该如何将分类器的训练与我的`bowDE`函数连接起来?
回答:
您的下一步是提取实际的词袋描述符。您可以使用BOWImgDescriptorExtractor中的compute
函数来实现这一点。比如说
bowDE.compute(img, keypoints, bow_descriptor);
使用这个函数,您可以创建描述符,然后将它们收集到一个矩阵中,该矩阵作为分类器函数的输入。也许这个教程可以为您提供一些指导。
我想提到的另一件事是,对于分类,您通常需要至少两个类别。所以您还需要一些不包含汽车的图片来训练分类器。