Тестирование классификатора SVM работает только с изображениями, размер которых превышает обучающий набор

#opencv #image-processing #svm #svmlight

#opencv #обработка изображений #svm #svmlight

Вопрос:

Я впервые внедряю sw для обнаружения объектов для статических изображений. Моя первая цель — обнаружить простые круги, затем я перейду к более сложному объекту. К сожалению, кажется, у меня проблема при проверке моего классификатора.

Моим выбором было использовать дескриптор HOG (с использованием OpenCV) и svm в качестве классификатора (с использованием svmlight). Код компилируется и работает, но есть кое-что, что кажется мне странным, вероятно, в отношении svm.

У меня есть:

  • обучающий набор, состоящий из 5 изображений 48×48 пикселей разных кругов и 5 изображений 48×48 пикселей не-кругов (я знаю, что их слишком мало, чтобы иметь надежный классификатор, но, насколько я знаю, это для проверки того, что все работает)
  • тестовый набор, состоящий из 4 изображений размером 48×48 пикселей (с кругами размером, равным тем, которые использовались для обучения) и 1 изображения намного большего размера (765×600 пикселей) с кругами разных размеров и другими геометрическими формами.

Что происходит, так это:

  • круги в тестовом наборе не обнаруживаются, когда изображения имеют размер 48×48, даже если в тестовом наборе есть некоторые изображения, используемые на этапе обучения.
  • на изображении 765×800 (которое содержит круги любого размера) круги того же размера, что и обучающий набор, или больше, правильно идентифицированы.

Я использую следующие параметры:

  • hog: winSize= 48x48px, winStride= 4x4px, cellSize = 4px, blockSize = 8px, blockStride = 4x4px
  • классификатор: регрессия svm с линейным классификатором с C = 0,01. (Результаты RBF хуже, чем линейные)

Это API, который выполняет обнаружение с параметрами, которые я использую.

 vector<Rect> found;
double hitThreshold = 0.; // tolerance
Size padding(Size(32, 32));
double scale = 1.05;
int groupThreshold = 2;
hog.detectMultiScale(testImg, found, hitThreshold, win_stride, padding, scale, groupThreshold);
 

Есть ли какая-либо причина, по которой круги на изображениях 48×48 пикселей не обнаружены, а круги на большем изображении обнаружены? Я ожидаю, что изображения размером 48×48 пикселей будут правильно классифицированы для проверки классификатора. Я добавил изображение большего размера, когда на изображениях 48×48 пикселей ничего не обнаружено.

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

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

Любая помощь приветствуется!

Заранее спасибо 🙂

Комментарии:

1. Вы сказали, что используете SVM в режиме регрессии, пытались ли вы с его помощью просто классифицировать каждый класс как положительный или отрицательный? Я часто находил полезным, когда моя SVM не работала, быстро взглянуть на значения вектора объектов HOG, это может дать приблизительное представление о проблемах в функциях..

2. имхо, отзывы должны быть больше размера, на котором был обучен дескриптор hog. (в противном случае многомасштабный подход не работает)

3. Каков размер выходного дескриптора hog?

4. Спасибо всем за ваши комментарии. @GilLevi вы имеете в виду размер обученных дескрипторов hog? то есть: 4357 (значение 4356 b).

5. @powder Я пытался просто классифицировать, но это дает те же результаты. Теперь я попробую отобразить обученные векторы объектов hog. Однако классификатор работает корректно, только с изображениями большего размера. Я надеюсь, что это так, как говорит берак.