Классификация объектов, когда использовать полное изображение или извлеченный объект?

Я пытаюсь настроить систему классификации объектов с помощью OpenCV. Когда я обнаруживаю новый объект в сцене, я хочу знать, принадлежит ли новый объект известному классу объектов (это ящик, боттель, что-то неизвестное и т. Д.).

Мои шаги до сих пор:

  • Вырубка изображения в Рой, где может появиться новый объект
  • Расчет ключевых точек для каждого изображения (cv::SurfFeatureDetector)
  • Вычисление дескрипторов для каждой ключевой точки (cv::SurfDescriptorExtractor)
  • Генерация словаря с помощью Bag of Words (cv::BOWKMeansTrainer)
  • Расчет гистограмм ответов (cv::BOWImgDescriptorExtractor)
  • Используйте гистограммы Response для обучения cv::SVM для каждого класса объектов
  • Используя тот же набор изображений снова, чтобы проверить классификацию

Я знаю, что с моим кодом все еще что-то не так, поскольку классификация еще не работает.

Но я на самом деле не знаю, где мне следует использовать полное изображение (сокращенное до roi) или когда я должен извлечь новый объект из изображения и использовать только сам объект.

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

Я надеюсь, что кто-то может уточнить это для меня.

1 ответ

Вы не должны использовать одни и те же изображения для тестирования и обучения.

При обучении в идеале вам нужно извлечь ROI, который включает в себя только один доминирующий объект, поскольку алгоритм будет предполагать, что кодовые слова, извлеченные из положительных выборок, должны быть представлены в тестовом изображении, чтобы пометить его как положительный. Однако, если у вас действительно большой набор данных, такой как ImageNet, алгоритм должен сделать обобщение.

При тестировании вам не нужно извлекать ROI, потому что SIFT/SURF - это функции, не зависящие от масштаба. Тем не менее, хорошо также иметь один доминирующий объект в тестовом наборе.

Я думаю, что вы должны тренировать 1 классификатор для каждого класса вашего объекта. Это называется классификатор "один против всех".

Одно маленькое замечание, если вы не хотите беспокоиться об этих проблемах и имеете большой набор данных. Просто используйте Convolutional Neural Networks. Они имеют действительно хорошую способность к обобщению и по своей сути являются мульти-метками благодаря полностью подключенному последнему уровню.

Другие вопросы по тегам