J'ai quelques données d'apprentissage qui consistent en un certain nombre de caractéristiques extraites d'images et d'étiquettes de classes différentes. J'ai réussi à former des classificateurs Normal Bayes en utilisant OpenCV3 en C++. Et je suis capable de passer de nouvelles données de test dans les classificateurs pour obtenir les étiquettes de classe prédites en utilisant la fonction predict(). Cependant, je ne veux pas simplement obtenir l'étiquette de classe prédite, je souhaite également connaître les probabilités pour chaque étiquette de classe par données de test en utilisant la fonction predictProb() de la classe NormalBayesClassifier.opencv Les bayes de Normbal prédisent la sortie de probabilité zéro
Il y a une fonction predictProb() qui semble être en mesure de retourner les probabilités par étiquette de classe:
virtual float cv::ml::NormalBayesClassifier::predictProb
( InputArray inputs,
OutputArray outputs,
OutputArray outputProbs,
int flags = 0
) const
Cependant, quand je teste le code, je reçois toujours un vecteur de 0 ou un mélange de 0s et Inf pour différentes images de test comme probabilités prédictives même si j'obtiens une prédiction correcte. J'ai essayé d'ajouter RAW_OUTPUT aux drapeaux et le résultat est le même.
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;
}
Ouput:
Probability[0, 0;inf, 0]