1
我正在嘗試使用SVM進行3級分類。爲此,我正在準備SVM培訓期間的詞彙。但是,由於我在SVM預測中得到隨機結果,所以我懷疑我的詞彙創建方法中存在一些問題。我創建詞彙表的代碼如下:使用Bag功能進行分類的詞彙/字典
//Mat train --- it should contain the feature vectors
//Mat response-- it will contain the class labels
void svm::createTrainingDateUsingBOW(int flag,Mat& train, Mat& response, int label)
{
int cluster = 9; // Common for all classes
cv::Mat imageForTraining;
std::vector<cv::KeyPoint> keypoints;
cv::SurfFeatureDetector detector(500);
cv::Ptr<cv::DescriptorExtractor> cvDescExt = new cv::SurfDescriptorExtractor();
cv::Mat descriptors;
cv::BOWKMeansTrainer bow(cluster, cv::TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, FLT_EPSILON), 1, cv::KMEANS_PP_CENTERS);
cv::Mat vocabulary;
if (flag == 1)
{
for(int i=1; i<=400; i++)
{
counter++;
cout<<"\n counter: "<<counter;
char filepath[255];
sprintf(filepath, "class1/%d.JPG",i); // we need class1/1.JPG etc
imageForTraining = cv::imread(filepath, CV_LOAD_IMAGE_GRAYSCALE);
// Preparing keypoints using detector
detector.detect(imageForTraining, keypoints);
// now getting the DESCRIPTORS for the given keypoints
cvDescExt->compute(imageForTraining, keypoints, descriptors);
//BOW
if(keypoints.size() > cluster) // so that (N<k) error won't come
{
if (!descriptors.empty()) bow.add(descriptors);
//VOCABULARY
vocabulary = bow.cluster();
cv::Ptr<DescriptorExtractor> extractor = new SurfDescriptorExtractor();
cv::Ptr<DescriptorMatcher> matcher = cv::DescriptorMatcher::create("FlannBased");
cv::BOWImgDescriptorExtractor descExtractor (extractor, matcher);
descExtractor.setVocabulary(vocabulary);
Mat bowDescriptors;
descExtractor.compute(imageForTraining, keypoints, bowDescriptors);
if (!bowDescriptors.empty())
{
train.push_back(bowDescriptors);
response.push_back(label);
}
}// ending if loop
} // ending For loop
}// ending if(flag) loop
if (flag == 2)
{
for(int i=1; i<=400; i++)
{
counter++;
cout<<"\n counter: "<<counter;
char filepath[255];
sprintf(filepath, "class2/%d.JPG",i); // we need class1/1.JPG etc
imageForTraining = cv::imread(filepath, CV_LOAD_IMAGE_GRAYSCALE);
// Preparing keypoints using detector
detector.detect(imageForTraining, keypoints);
// now getting the DESCRIPTORS for the given keypoints
cvDescExt->compute(imageForTraining, keypoints, descriptors);
//BOW
if(keypoints.size() > cluster) // so that (N<k) error won't come
{
if (!descriptors.empty()) bow.add(descriptors);
//VOCABULARY
vocabulary = bow.cluster();
cv::Ptr<DescriptorExtractor> extractor = new SurfDescriptorExtractor();
cv::Ptr<DescriptorMatcher> matcher = cv::DescriptorMatcher::create("FlannBased");
cv::BOWImgDescriptorExtractor descExtractor (extractor, matcher);
descExtractor.setVocabulary(vocabulary);
Mat bowDescriptors;
descExtractor.compute(imageForTraining, keypoints, bowDescriptors);
if (!bowDescriptors.empty())
{
train.push_back(bowDescriptors);
response.push_back(label);
}
}// ending if loop
} // ending For loop
}// ending if(flag) loop
....Similary for Class-3
}
你能否提供更多的答案嗎?示例代碼展示如何解決這個問題會更有用。 –
我已經提交了另一個答案 – AUG