2017-06-02 56 views
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] 

回答

0

有兩個條件需要滿足的貝葉斯分類器能夠輸出概率: 1)你必須用多個樣品是對來車吧相同的響應值。 2)訓練樣本應歸一化。

我有同樣的問題,最後這個環節幫助在網上淘的答案後,我得出結論:上述聲明: Opencv3 Bayes Classifier predictProb giving strange results