2013-06-11 4 views
1

Я разрабатываю английский почерк OCR с OpenCV и Visual C++. Я использую подход на основе зоны для извлечения функций. Здесь я использую 64×64 изображений. Итак, у меня есть 64 функции для одного образца изображения. Мой SVM будет Multi-class SVM, потому что у меня есть 52 класса как для обычных, так и простых букв. Вот формат вектор-функции.Как увеличить данные в Open CV LibSVM

Class A image1 0:0.222000 1:0.0250222 ..... 63:0.000052 
Class A image2 (some float values) .... 
Class A image200 (some float values) 

также у меня есть 200 изображений для обоих 52 классов. При тестировании моя текущая точность равна 35% - 40% only.I прочитал как масштабирующие данные повышают точность прогноза. Но у меня есть несколько вещей, которые нужно прояснить.

  1. Как я могу масштабировать эти значения признаков?

  2. Есть ли функция, чтобы получить вероятность соответствия каждого вектора признаков тестов в OpenCV LibSVM (I поиск OpenCV 2.4.5 документации на, но я не мог найти это).

Может кто-нибудь объяснить это? , а также с некоторыми очень мало строк кода, если это возможно.

ответ

2
  1. Ваши данные масштабируются несколько уже, но libsvm ребята рекомендовали бы (http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf) масштабирование линейно [0, 1] или [-1, 1]. Если у вас есть пиксельные данные [0,1], вероятно, имеет больше смысла.

  2. Я тоже этого не вижу. Вы можете связать с C++ libsvm (http://www.csie.ntu.edu.tw/~cjlin/libsvm/), а затем у вас есть два варианта. A) Перечислите вероятности классов, и в этом случае вы получите их обратно или B) попросите расстояния от границы решения.

+0

Хороший вопрос о данных, «немного увеличенных». Так что просто нырнул на 255; на самом деле для этого случая, когда данные по существу двоичные, а максимальное значение не так велико, вы, вероятно, можете узнать об этом без масштабирования. – Bull

+0

Если вы делите на 255, убедитесь, что вы конвертируете в представление с плавающей запятой. –

+0

@ Josh S - большое спасибо за ваши усилия и учитывая мой вопрос. мои данные уже масштабированы (от 0 до 1). Но мне нужно как-то найти подходящую вероятность. Я чувствую, что чистый LibSVM подходит для моей цели вместо интегрированного OpenCV. –

3
  1. Посмотрите на A Practical Guide to Support Vector Classification. В основном, вы должны масштабировать каждое измерение вашего вектор-функции до [-1, 1] или [0, 1] (то же самое во всех измерениях). Например, для первого измерения, если вы знаете возможные максимальные и минимальные значения: v_max и v_min (например, если это значение серого пикселя, то они равны 0 и 255). Затем вы можете вычислить новое значение функции как new_val = (old_val-v_min)/(v_max-v_min);

  2. Это документация для функции прогнозирования OpenCV SVM: predict.

    float CvSVM::predict(const CvMat* sample, bool returnDFVal=false) const

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

Надеюсь, это поможет.

+0

Большое спасибо за рассмотрение моей проблемы и ваших усилий. Я думал использовать чистый LibSVM вместо интегрированного OpenCV. Оба они такие же, но я чувствую, что использование Pure LibSVM решит мою проблему. Большое спасибо –

+0

http://stackoverflow.com/questions/43408031/scaling-for-single-instance-in-matlab-for-libsvm?noredirect11&lq=1 –

Смежные вопросы