2017-06-02 1 views
0

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] 

Répondre

0

Il y a deux conditions qui doivent être remplies pour que le Bayes Classifier pouvoir probabilités de sortie: 1) Vous devez former avec plusieurs échantillons deux à la même valeur de réponse. 2) Les échantillons d'entraînement devraient être normalisés.

J'ai eu cette même question, et après avoir écumé l'Internet pour trouver des réponses enfin ce lien m'a aidé à conclure la déclaration ci-dessus: Opencv3 Bayes Classifier predictProb giving strange results