Обнаружение объектов с помощью OpenCV SVM

Я не смог найти хороших объяснений в одном месте в Интернете. Там слишком много вещей, и вместо того, чтобы понять, что делать, я еще больше запутался.

Моя цель: Создать приложение для Android, которое в режиме реального времени обнаруживает объекты с помощью камеры (мои объекты — руль и автомобильная шина).

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

Теперь я узнал о Feature Detectors и обучении SVM. Мои вопросы:

1: Какой алгоритм мне следует использовать (SURF, ORB, FREAK и т. д.)?

2: Что вы думаете о HOG + Bag-Of-Words?

3: Не могли бы вы рассказать, как обучить SVM или дать ссылку, если у вас есть? - Я не нашел никакого учебника по этому поводу. Я продолжаю искать, но мое время ограничено, и я решил спросить.

4: Какой алгоритм даст наилучшие результаты?

5: Должен ли я реализовать его в Android NDK или не будет такой большой разницы с реализацией Java?

Если у вас есть какие-либо учебные пособия или ссылки, добавьте их в свой ответ или в комментарии. Извините за длинный вопрос, поскольку я сказал, что мое время ограничено (это школьный проект), и я также думаю, что было бы хорошо, если бы люди могли найти эти ответы в одном месте. Я буду признателен за каждый ответ, даже если это не полный ответ. Заранее спасибо!


person dephinera    schedule 10.12.2014    source источник
comment
(мои объекты - руль и автомобильная покрышка.) - и, имхо, ваша основная проблема. Вы можете повторно обсудить это? (школьная проблема). отличать яблоки от бананов было бы гораздо более дружелюбным сценарием. Вы знаете, что означает «внутренняя дисперсия класса»? ваши предыдущие посты показали, что чертовски трудно найти такую ​​вещь, как «тот самый» руль. там не станет намного лучше, даже с более сложными алгоритмами.   -  person berak    schedule 13.12.2014
comment
Я точно уверен, что понимаю, что вы хотите мне сказать (возможно, потому, что мои знания английского недостаточно хороши). И нет, я не знаю, что означает внутренняя классовая дисперсия.   -  person dephinera    schedule 13.12.2014
comment
Кроме того, я еще не достиг своей цели, потому что я впервые использую OpenCV, и это сложно.   -  person dephinera    schedule 14.12.2014


Ответы (1)


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

Вы можете попробовать SIFT и SURF, которые являются наиболее популярными дескрипторами, но они не очень эффективны (медленны) и требуют много памяти. Если вашей целью является эффективность, вы можете попробовать двоичные дескрипторы (например, BRIEF, ORB, BRISK, FREAK), которые намного эффективнее и требуют меньше места для хранения. Взгляните также на детектор FAST.

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

Bag-Of-Words предоставит вам векторное представление каждого обучающего изображения.

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

3: Здесь вы найдете руководство по полному подходу (BOW + SVM) в OpenCV 2.3. Вам нужно будет внести некоторые изменения в код, но общая идея здесь: http://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2-3-w-code/

Кроме того, руководство по OpenCV для SVM: http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

4: Как я уже говорил, идеального алгоритма не существует, поэтому я не могу вам ответить. Я думаю, что после нескольких тестов с вариантами, которые у вас есть в (1.), вы сможете ответить нам на него. :)

5. Я думаю, вам следует использовать Android NDK, но я мало разбираюсь в разработке для Android.

http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/android_dev_intro.html http://opencv.org/platforms/android.html

person zedv    schedule 13.12.2014
comment
Во-первых, спасибо за подробный ответ! И во-вторых, я хотел бы спросить вас, BOW + SVM лучший или хороший подход для достижения моей цели? - person dephinera; 13.12.2014
comment
Как я уже объяснял вам, невозможно сказать, эффективно ли этот подход решит вашу проблему. В любом случае я ставлю на то, что подход BOW + SVM даст вам хорошие результаты. Но нужно попытаться это подтвердить. - person zedv; 15.12.2014
comment
Во-первых, извините за то, что я продолжаю задавать вопросы, но для меня это непросто. Я обнаружил, что не могу использовать BOW с бинарными дескрипторами. К сожалению, SIFT и SURF не бесплатны, поэтому я не хочу их использовать. Я не могу найти, как обучить SVM с извлеченной функцией FAST. Это возможно? У вас есть ссылки для этого? Заранее большое спасибо. (Может быть, если у вас есть ответы на эти вопросы, будет хорошо, если вы добавите их в свой ответ) - person dephinera; 23.12.2014
comment
На самом деле вы можете использовать BOW с двоичными дескрипторами. Мой совет — сначала попробовать этот подход с помощью SIFT или SURF. Если результаты хорошие, то можно попробовать использовать бинарные дескрипторы. Как я уже сказал, FAST — это всего лишь детектор. То есть он определяет только ключевые точки, после чего вам нужно описать ключевые точки с помощью дескриптора. - person zedv; 29.12.2014