opencv Normbal bayes预测概率输出为零

时间:2017-06-02 07:47:33

标签: c++ machine-learning opencv3.0 predict naivebayes

我有一些训练数据,包括从图像和不同类标签中提取的许多特征。我已经设法在C ++中使用OpenCV3训练Normal Bayes分类器。我能够将新的测试数据传递到分类器中,以使用predict()函数获得预测的类标签。 但是,我不想简单地获得预测的类标签,我也希望使用类NormalBayesClassifier的predictProb()函数知道每个测试数据的每个类标签的概率。

有一个predictProb()函数似乎能够返回每个类标签的概率:

virtual float cv::ml::NormalBayesClassifier::predictProb    
(   InputArray  inputs,
OutputArray     outputs,
OutputArray     outputProbs,
int     flags = 0 
)       const

然而,当我测试代码时,即使我得到正确的预测,我总是得到0的矢量或者0和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]

1 个答案:

答案 0 :(得分:0)

贝叶斯分类器需要满足两个条件才能输出概率: 1)您必须使用与同一响应值配对的多个样本对其进行训练。 2)训练样本应该标准化。

我有同样的问题,在网上搜索完答案之后,这个链接帮我总结了上述说法: Opencv3 Bayes Classifier predictProb giving strange results