问题描述
我在理解如何将 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 (将#修改为@)