0
我有一些訓練數據,包括從圖像和不同的類標籤中提取的許多特徵。我設法使用C++中的OpenCV3來訓練Normal Bayes分類器。我能夠將新的測試數據傳入分類器,以使用predict()函數獲取預測的類標籤。 但是,我不想簡單地得到預測的類標籤,我也希望使用類NormalBayesClassifier的predictProb()函數知道每個測試數據的每個類標籤的概率。opencv Normbal貝葉斯預測概率輸出零
有這似乎是能夠回到每類標籤的概率的predictProb()函數:
virtual float cv::ml::NormalBayesClassifier::predictProb
( InputArray inputs,
OutputArray outputs,
OutputArray outputProbs,
int flags = 0
) const
然而,當我測試的代碼,我總是得到0的載體或混合物0s和Inf作爲預測概率,儘管我確實得到了正確的預測。我嘗試將RAW_OUTPUT添加到標誌並且結果相同。
int N=4;
vector<string> loc;
loc.push_back("1.jpg");
loc.push_back("2.jpg");
loc.push_back("3.jpg");
loc.push_back("4.jpg");
loc.push_back("5.jpg");
loc.push_back("6.jpg");
Ptr<ml::NormalBayesClassifier> rt = cv::ml::NormalBayesClassifier::create();
Mat img,features,dictionary;
vector<cv::KeyPoint> keyPoints;
Mat X;
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");
Ptr<SURF> detector = SURF::create(400,4,2,1,1);
Ptr<DescriptorExtractor> extractor = detector;
FileStorage fs("Bag-Of-Features.yml", FileStorage::READ);
fs["dictionary"] >> dictionary;
fs.release();
Ptr<BOWImgDescriptorExtractor> bowDE=makePtr<BOWImgDescriptorExtractor>(extractor, matcher);
bowDE->setVocabulary(dictionary);
for(int i=0;i<4;i++)
{
img=imread(loc[i]);
detector->detect(img,keyPoints);
bowDE->compute(img,keyPoints,features);
int rows = features.rows;
int cols = features.cols;
//cout << "r"<< rows << "c "<< cols ;
X.push_back(features);
}
Mat_<int> Y(N,1);
Y << 0,0, 1,1 ;
rt->train(X, ml::ROW_SAMPLE, Y);
rt->save("classifier.yml");
/////////prediction/////////////
Mat features1;
vector<cv::KeyPoint> keyPoints1;
Mat r,p;
Mat inp;
Mat R1,P1;
for (int i=0;i<2;i++)
{
inp=imread(loc[4+i]);
//inp.convertTo(inp,CV_8U);
detector->detect(inp, keyPoints1);
bowDE->compute(inp, keyPoints1, features1);
//features1.convertTo(features1,CV_32F);
rt->predictProb(features1,r,p);
R1.push_back(r);
P1.push_back(p);
}
cout << "Probability"<<P1 <<endl ;
return 0;
}
輸出繼電器:
Probability[0, 0;inf, 0]