Мультиклассовая классификация изображений с оценкой вероятности

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

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

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

Любые советы приветствуются. Спасибо!

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

2

Решение

Некоторые реализации алгоритма SVM предоставляют оценки вероятности. Тем не менее, SVM делает не по своей сути обеспечивают оценки вероятности. Это функция, которая «привязывается» после создания алгоритма. Эти оценки вероятности не являются «заслуживающими доверия», и, если я правильно помню, возможность вычисления оценок вероятностей была удалена из библиотеки Scikit-Learn несколько выпусков назад по этой причине. Тем не менее, если вы настаиваете на использовании SVM, посмотрите на Практическое руководство по поддержке векторной классификации из LibSVM. Это библиотека, которую вызывает OpenCV. Вы можете пропустить математику, чтобы добраться до подсказок. Выводы LibSVM и, следовательно, SVM OpenCV, объяснены в документе. Или же вы можете использовать LibSVM. Это позволит вам перейти к оценкам вероятности без перекомпиляции OpenCV (как предлагается в вашей ссылке), но недостатком является то, что вам придется передавать свои данные в соответствующую форму для LibSVM (т. Е. Mat OpenCV вряд ли будет работать напрямую с LibSVM ).

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

В качестве альтернативы рассмотрите возможность использования классификатора Random Forest (или его варианта, Extremely Randomized Trees). Они также предоставляют оценки вероятности как долю обучающих выборок в данном листовом узле, достигнутую вашей тестовой выборкой. Сказав это, эти два классификатора не основаны на принципиальной математике (хотя исследователи пытаются выяснить, как они работают теоретически), хотя известно, что они прекрасно работают во многих реальных условиях (например, оценка позы Kinect).

Придумать оценки вероятности очень сложно, если ваш классификатор не предназначен для этого с самого начала, т. Е. Не относится к тем, которые вы найдете в стандартном учебнике по статистическому машинному обучению. Это как вытащить числа из своей задницы. Большинство алгоритмов, которые выполняют классификацию, просто вычисляют «оценку» для каждой категории / метки для каждого тестового образца и используют тот, у которого «лучший» результат. Это гораздо проще сделать. Для SVM он пытается «перевести» этот показатель в «вероятность», но он не «откалиброван», что фактически делает его бесполезным.

Вы можете взглянуть на эту статью: Прогнозирование хороших вероятностей при контролируемом обучении для получения более подробной информации о том, как вычисляются вероятности для некоторых из этих классификаторов и почему их необходимо калибровать.

В общем, я бы посоветовал брать оценки вероятности, возвращаемые классификатором с зерном соли. Если вы хотите их, используйте статистический классификатор, например, Логистическая регрессия, а не SVM.

Что касается библиотек, то хотя OpenCV предоставляет некоторые алгоритмы машинного обучения, они очень ограничены. Попробуйте правильную библиотеку ML. Я предполагаю, что вы используете C ++, поэтому я рекомендую взглянуть на бесплатный Библиотека сёгунского машинного обучения.

Если вы используете Python или просто хотите ознакомиться с учебными пособиями по использованию алгоритмов машинного обучения, ознакомьтесь с Библиотека Scikit-Learn.

Несколько общих советов по применению алгоритмов машинного обучения к отраслевым проблемам (слайды): Опыт и уроки в разработке программного обеспечения для машинного обучения и интеллектуального анализа данных..

3

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


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