OpenCV4 BOW + SIFT - 步骤和语法

问题描述

我在理解如何将 SIFT 与 BOW((视觉)词袋)一起使用时遇到问题。 假设我有一个包含 100 张图像的训练数据集,50 张 0 类图像和 50 张 1 类图像。我也有训练标签。还有一个混合测试集图像。

步骤 1) 我创建了一个 SIFT 检测器,它在训练图像中检测关键点并计算关键点的描述符。

第 2 步)我使用 BOWKMeansTrainer 对描述符进行聚类并获取字典。 BOWKMeansTrainer 的构造函数将参数 clusterCount 设置为 2,因为我的数据有两个类,而我想要两个包?是否有可能通过标签分离样本,因为我知道哪些图像应该属于哪个集群。 当我聚集我的描述符 Mat 时,我得到一个大小为 2x128 的 Mat。

第 3 步)我实例化一个 BOWImgDescriptorExtractor 对象来计算测试图像的描述符。

第 4 步)然后我训练,例如,使用字典训练 Knn,并使用测试图像中的描述符对其进行测试。

我最大的问题是:如何处理具有多个类的数据集?如何使用创建的字典和 testDescriptor 进行最终预测?


    // step 1
    int dataSetSize = trainingImages.size();
    vector<KeyPoint> keypoints;
    Mat descriptor;
    Mat descriptorCollection;
    Ptr<SIFT> detector = SIFT::create();

    for(int i=0; i<dataSetSize; i++){
        detector->detect(trainingImages[i],keypoints);
        detector->compute(trainingImages[i],keypoints,descriptor);
        descriptorCollection.push_back(descriptor);
    }

    // step 2
    int dictionarySize=2;
    BOWKMeansTrainer bowkTrainer(dictionarySize);
    Mat dictionary=bowkTrainer.cluster(descriptorCollection);

    // step 3
    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::FLANNBASED);
    Ptr<FeatureDetector> detector = SIFT::create();
    Ptr<DescriptorExtractor> extractor = SIFT::create();

    BOWImgDescriptorExtractor bow(extractor,matcher);
    bow.setVocabulary(dictionary);

    vector<KeyPoint> keypoints;
    detector->detect(testimage,keypoints);
    Mat testDescriptor;
    bow.compute(testimage,testDescriptor);

    // step 4
    Ptr<cv::ml::KNearest> knn  =  ml::KNearest::create();
    Mat trainingLabel(Size(1,50),CV_32F,Scalar(0));
    Mat label2(Size(1,Scalar(1));
    trainingLabel.push_back(label2);
    knn->train(dictionary,ml::ROW_SAMPLE,trainingLabel),Mat predMat;
    Mat predRes;
    Mat distance;

    knn->findNearest(testDescriptor,5,predMat,predRes,distance);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)