Распознавание изображений Классификатора OpenCV SVM

#c #svm #opencv3.0

#c #svm #opencv 3.0

Вопрос:

Я использую C и OpenCV 3.3.1
Я пытаюсь обучить SVM с помощью OpenCV, мои шаги следующие:

  1. Предварительная обработка изображения
  2. Извлечение объектов с помощью SURF
  3. создание набора данных для изучения положительных и отрицательных изображений
  4. измените форму изображений в 1 строке в 1 функции
  5. создаем labelsmat с -1 для негатива и 1 для позитива
  6. изучение SVM
  7. прогнозировать

И теперь моя проблема: допустим, мои изображения имеют размер 128 x 128, и после извлечения объектов я получил таблицу с 16 строками и 128 столбцами, после изменения формы я получил 1 строку и 2048 столбцов, теперь SVM обучен с таким размером строк и столбцов. И когда я пытаюсь спрогнозировать с помощью своей SVM, у меня возникла проблема, заключающаяся в том, что SVM требует того же размера матрицы объектов (1 строка и 2048 столбцов), но мое изображение для прогнозирования получило больше функций, чем обучающие изображения, поэтому таблица для прогнозирования намного больше, чем необходимо.

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

Как я могу использовать SVM для изображений большего размера?

Ответ №1:

Использование дескрипторов SURF / SIFT путем создания для них 1X функции 2048 не очень хорошая идея по двум причинам:

  1. Вы ограничиваете количество полезных функций для каждого изображения (= 16), и если количество функций отличается от 16, вы получаете ошибку. Даже если вы заставляете использовать 16 функций каждый раз, вы можете в конечном итоге потерять функции и, следовательно, результаты ухудшатся

  2. Вы обучаете классификатор 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%. Есть идеи, что не так?