#c #svm #opencv3.0
#c #svm #opencv 3.0
Вопрос:
Я использую C и OpenCV 3.3.1
Я пытаюсь обучить SVM с помощью OpenCV, мои шаги следующие:
- Предварительная обработка изображения
- Извлечение объектов с помощью SURF
- создание набора данных для изучения положительных и отрицательных изображений
- измените форму изображений в 1 строке в 1 функции
- создаем labelsmat с -1 для негатива и 1 для позитива
- изучение SVM
- прогнозировать
И теперь моя проблема: допустим, мои изображения имеют размер 128 x 128, и после извлечения объектов я получил таблицу с 16 строками и 128 столбцами, после изменения формы я получил 1 строку и 2048 столбцов, теперь SVM обучен с таким размером строк и столбцов. И когда я пытаюсь спрогнозировать с помощью своей SVM, у меня возникла проблема, заключающаяся в том, что SVM требует того же размера матрицы объектов (1 строка и 2048 столбцов), но мое изображение для прогнозирования получило больше функций, чем обучающие изображения, поэтому таблица для прогнозирования намного больше, чем необходимо.
Предсказание с тем же изображением, которое я использовал для обучения, работает хорошо, поэтому я предполагаю, что SVM работает.
Как я могу использовать SVM для изображений большего размера?
Ответ №1:
Использование дескрипторов SURF / SIFT путем создания для них 1X функции 2048 не очень хорошая идея по двум причинам:
-
Вы ограничиваете количество полезных функций для каждого изображения (= 16), и если количество функций отличается от 16, вы получаете ошибку. Даже если вы заставляете использовать 16 функций каждый раз, вы можете в конечном итоге потерять функции и, следовательно, результаты ухудшатся
-
Вы обучаете классификатор SVM для измерения 2048 без использования какой-либо связи между извлеченными дескрипторами объектов.
Более надежный и стандартный способ сделать это — использовать набор слов. Вы получаете K-мерный дескриптор из функций SIFT, используя набор слов и подход гистограммы, а затем вы обучаете SVM-классификатор этим K-мерным дескрипторам, которые будут одинаковыми для каждого изображения.
Эта ссылка может быть вам полезна,
https://www.codeproject.com/Articles/619039/Bag-of-Features-Descriptor-on-SIFT-Features-with-O
Если вы хотите использовать MATLAB; тогда vlfeat имеет реализацию всего конвейера.
Комментарии:
1. Теперь я извлекаю объекты из каждого изображения, переношу их обратно в Mat и группирую их с помощью KMeans. После этого я создаю пакет функций со словарем из K-means и дескрипторами из функций. Результатом является дескриптор Mat bow. После этого я передаю в SVM bowDescritpor с метками. Каждая строка в дескрипторе Bow обозначает 1 изображение. А столбцы — это размер словаря. Синтаксис работает, но если я вызываю svm-> istrained(), он возвращает false. Прогнозирование всегда равно 100%. Есть идеи, что не так?