opencv Normbal Bayes предсказывает вероятность выхода ноль

У меня есть некоторые тренировочные данные, которые состоят из ряда функций, извлеченных из изображений и различных ярлыков классов. Мне удалось обучить Нормальных Байесовских классификаторов, используя OpenCV3 в C ++. И я могу передать новые тестовые данные в классификаторы, чтобы получить предсказанные метки классов с помощью функции предиката ().
Однако я не хочу просто получать прогнозируемую метку класса, я также хочу знать вероятности для каждой метки класса для тестовых данных, используя функциюgnasttProb () класса NormalBayesClassifier.

Существует функция предиката (), которая, по-видимому, может возвращать вероятности для метки класса:

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;
}

Ouput:

Probability[0, 0;inf, 0]

0

Решение

Есть два условия, которые должны быть выполнены для байесовского классификатора, чтобы иметь возможность выводить вероятности:
1) Вы должны обучить его нескольким выборкам, которые соответствуют одному и тому же значению ответа.
2) Обучающие образцы должны быть нормализованы.

У меня был тот же вопрос, и после поиска в Интернете ответов, наконец, эта ссылка помогла мне завершить приведенное выше утверждение:
OpenCV3 Байесовский классификатор предсказываетProb, давая странные результаты

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]