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

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

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

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

Теперь я узнал о функциональных детекторах и тренинге SVM. Мои вопросы:

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

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

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

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

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

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

Ответ 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