Некоторые реализации алгоритма SVM предоставляют оценки вероятности. Тем не менее, SVM делает не по своей сути обеспечивает оценки вероятности. Это функция, которая «привязана» после создания алгоритма. Эти оценки вероятности не являются «заслуживающими доверия», и если я правильно помню, возможность вычисления вероятностных оценок была удалена из библиотеки Scikit-Learn несколькими релизами по этой причине. Тем не менее, если вы настаиваете на использовании SVM, посмотрите на A Practical Guide to Support Vector Classification от LibSVM. Это библиотека, которую вызывает OpenCV. Вы можете пропустить математику, чтобы добраться до советов. Выводы LibSVM и, следовательно, SVM OpenCV, описаны в документе. Кроме того, вы можете использовать LibSVM вместо этого. Это позволит вам получить оценки вероятности без повторной компиляции OpenCV (как указано в вашей ссылке), но недостатком является то, что вам придется передавать ваши данные в соответствующую форму для LibSVM (т. Е. Mat Matrix OpenCV вряд ли будет работать напрямую с LibSVM).
Если вы используете линейный SVM, то есть SVM с линейным ядром, то вы можете попробовать заменить его классификатором логистической регрессии, поскольку они эмпирически ведут себя одинаково (оба являются линейными классификаторами, только для них используется потеря петли и другие, логистические потери). Оценки вероятности от логистической регрессии будут работать.
В качестве альтернативы рассмотрите использование классификатора Random Forest (или его варианта, чрезвычайно рандомизированных деревьев). Они также предоставляют оценки вероятности как долю учебных образцов в данном листовом узле, полученном вашим тестовым образцом. Сказав это, эти два классификатора не основаны на принципиальной математике (хотя исследователи работают над выяснением того, как они работают теоретически), хотя они, как известно, отлично работают во многих реальных условиях (пример позы в Kinect является примером).
Вещь с вероятностными оценками очень сложна, если ваш классификатор не предназначен для этого с самого начала, т. Е. Не из тех, которые вы найдете в стандартном учебнике по статистическому обучению. Это походит на вытаскивание чисел из своей задницы.Большинство алгоритмов, которые выполняют классификацию, просто вычисляют «оценку» для каждой категории/метки для каждого тестового образца и идут с одним с «лучшим» счетом. Это гораздо легче сделать. Для SVM он пытается «перевести» этот показатель на «вероятность», но он не «откалиброван», что фактически делает его бесполезным.
Вы можете ознакомиться с этой статьей: Predicting Good Probabilities With Supervised Learning для получения более подробной информации о том, как вычисляются вероятности для некоторых из этих классификаторов и почему их нужно откалибровать.
В целом, я бы посоветовал получить оценки вероятности, возвращенные классификатором с зерном соли. Если вы хотите их, перейдите со статистическим классификатором, например, Logistic Regression, а не SVM.
Что касается библиотек, в то время как OpenCV действительно предоставляет некоторые алгоритмы машинного обучения, они очень ограничены. Попробуйте надлежащую библиотеку ML. Я предполагаю, что вы используете C++, поэтому я рекомендую взглянуть на бесплатный Shogun Machine Learning Library.
Если вы используете Python или хотите ознакомиться с учебниками по использованию алгоритмов машинного обучения, ознакомьтесь с отличным Scikit-Learn library.
Некоторые общие рекомендации по применению алгоритмов машинного обучения к отраслевым проблемам (слайды): Experiences and Lessons in Developing Industry-Strength Machine Learning and Data Mining Software.
http://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2-3-w-code/ –