如何用词袋训练和预测?

时间:2012-12-03 18:46:17

标签: opencv machine-learning sift feature-detection

我从各个角度都有一个汽车图像文件夹。我想用一袋文字的方法训练系统识别汽车。一旦完成训练,我希望如果给出该车的图像,它应该能够识别它。

我一直在尝试在opencv中学习BOW功能,以便完成这项工作并达到我现在不知道该做什么的水平,并且会得到一些指导。

这是我用来制作文字包的代码:

Ptr<FeatureDetector> features = FeatureDetector::create("SIFT");
    Ptr<DescriptorExtractor> descriptors = DescriptorExtractor::create("SIFT");
    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");

    //defining terms for bowkmeans trainer
    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);

    //training data now
    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 documentation

我认为在这个阶段我的系统已经过培训。下一步是预测。

这是我不知道该怎么做的地方。如果我使用SVMNormalBayesClassifier,则他们都使用术语train和predict。

此后如何预测和训练?任何指导将不胜感激。如何将分类器的训练连接到我的`bowDE``函数?

1 个答案:

答案 0 :(得分:15)

下一步是提取实际的单词描述符包。您可以使用BOWImgDescriptorExtractor中的compute函数执行此操作。像

这样的东西
 bowDE.compute(img, keypoints, bow_descriptor);

使用此功能可以创建描述符,然后将其收集到矩阵中,该矩阵用作分类器函数的输入。也许this教程可以指导你一点。

我想提到的另一件事是,对于分类,您通常需要至少2个班级。因此,您还需要一些不包含汽车的图像来训练分类器。