2

Моя цель - сделать классификацию изображений с несколькими классами с оценкой вероятности.Классификация изображений с несколькими оценками с оценкой вероятности

До сих пор классификация «один ярлык» прекрасно работает из-за коробки со всеми замечательными функциями, предоставляемыми библиотеками OpenCV C++. В настоящее время я использую дескриптор BoW с локальными дескрипторами Sift и классификацией SVM. Все идет нормально. Но теперь мне нужны оценки вероятности для изображений. Поэтому вместо «image A is class X», Мне нужен вывод «Изображение A с 50% вероятностным классом X, с классом 10% Y, 30% класса Z» и т. Д. С оценками для всех классов.

К сожалению, я не компетентен в обучении машинам. Я начал исследовать проблему, и теперь мой мозг болит. Мои ном-вопросы для вас:

  • Является опцией libsvm -b probability_estimates, что я ищу?
  • Есть ли способ сделать это исключительно с OpenCV? (Если Get SVM classification score in multiclass classification with OpenCV - единственный способ, может кто-нибудь объяснить мне вывод?)
  • Есть ли у вас какие-либо другие предложения о том, как достичь моей цели? Бумаги для чтения, библиотеки для использования?

Любые советы приветствуются. Благодаря!

P.S .: Я знаю, что здесь есть несколько подобных вопросов, но для меня никто из них не захватил мою точку зрения.

+0

http://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2-3-w-code/ –

ответ

3

Некоторые реализации алгоритма 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.

+0

Спасибо за ваши идеи. Сёгун выглядит очень интересно, я не знал эту библиотеку. И да, я использую C++, но могу также пойти с Python. Что означает «но это не« откалибровано », что фактически делает его бесполезным» в отношении SVM? Калибровка в смысле нормализации? Я не знаю классификатора случайного леса, но буду исследовать. Я могу использовать любой алгоритм, который я хочу, не нужно придерживаться SVM. Я видел, что OpenCV имеет функциональность Random Forest. Или мне лучше начать сёгун? – Legie

+0

Для проблемы калибровки см. Этот документ: [Предсказание хороших вероятностей с контролируемым обучением] (http://machinelearning.org/proceedings/icml2005/papers/079_GoodProbabilities_NiculescuMizilCaruana.pdf). В нем также объясняется, как результаты от различных методов «переводятся» на вероятности (включая SVM). Далее, он описывает «смещение» (т. Е. Некоторый классификатор стремится порождать вероятности около 0, некоторые около 1), следовательно, необходимо «откалибровать». Наконец, он также показывает, какие классификаторы предсказывают «лучшие» вероятности (для их данных). Мой собственный опыт работы с SVM противоречит заключению. – lightalchemist

+0

(продолжение) Но тогда это может быть моя реализация или мои данные ... В любом случае, если у вас уже установлен SVM, никакого вреда не будет. Но я предлагаю попробовать разные классификаторы. Вы будете удивлены, что, хотя некоторые могут договориться о жестком решении (т. Е. О классификации), предсказанные вероятности могут быть совершенно разными (по крайней мере, из моего опыта). – lightalchemist