2013-05-26 2 views
2

Я разрабатываю рукописную систему распознавания символов с использованием OpenSV LibSVM. я выделил 14 признаков для вектора функции, включая моменты Hu, аффинные инвариантные моменты, числа углов и т. д. Для каждого символа я использую 5 выборок (для буквы «A», там 5 типов A). Я знаю, что 5 образцов недостаточно, но в моменты у меня есть только 5 образцов для каждого символа.Как настроить CvSVM для классификации изображений в OpenCV и C++

Я использую основной пример LINEAR SVM в документации opencv. Моя проблема заключается в том, могу ли я использовать этот пример документации, как есть, для моей цели. Я читал о системах OCR, которые используют многоуровневые SVM. Мне нужен такой Multi-Class SVM для моего приложения. Я не понимаю об этом. Может кто-нибудь объяснить? Вот мой код.

У меня есть 180 образцов цифр и английских заглавных букв, и для одного образца есть 14 функций.

float labels[180][1] = {1.0, 2.0, 3.0, 4.0, 5.0, ,,,,, -> 180.0}; 
Mat matlabesls(180,1, CV_32FC1, labels); 

Mat mattrainingDataMat(180, 14, CV_32FC1, ifarr_readtrainingdata); 
CvSVMParams params; 

params.svm_type = CvSVM::C_SVC; 
params.kernel_type = CvSVM::LINEAR; 
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6); 

CvSVM SVM; 
SVM.train(mattrainingDataMat,matlabesls,Mat(),Mat(),params); 

Mat matinput(1,14,CV_32FC1,ifarr_testarray); 
is_recognizedcharacter= SVM.predict(matinput); 

return is_recognizedcharacter; 

ответ

8

Неверная настройка ярлыков. Вы определили 180 уникальных ярлыков, но у вас есть только 26 классов данных. Ярлыки должны быть 180 в lengeth, но они должны содержать только значения 1..26 (любые 26 различных значений будут делать) в порядке, соответствующем порядку символов в mattrainingDataMat.

Вам понадобится больше, чем 5000 образцов каждой буквы, а не только 5. Вы можете начать с набора данных цифр ручной записи MNIST до тех пор, пока не получите правильные данные.

Ваш код, похоже, тренирует svm, чтобы распознать только 1 символ. Вы не должны делать это так, потому что это может занять длинные времени для обучения svm. Вы должны тренировать svm отдельно и сохранять модель, чтобы ее можно было повторно использовать, не переучиваясь каждый раз.

Мое понимание заключается в том, что код svm в OpenCV основан на старой версии Libsvm. Поэтому я просто использую последнюю версию libsvm напрямую, а не версию OpenCV.

Кроме того, для вашего случая вы почти наверняка получите гораздо более четкое представление с ядром RBF, чем линейное ядро ​​(хотя линейно легче тренировать). Кажется, у вас есть 26 классов, поэтому, конечно, вам нужен мультиклассический SVM (на самом деле это всего лишь несколько двоичных SVM). Libsvm справляется с проблемой многоклассов.

+0

привет спасибо, что рассмотрели мой вопрос. Я изменяю код следующим образом. У меня 36 классов (26 букв, 10 цифр). На данный момент я использую только 5 образцов (пока я не получу четкую идею). для одного класса имеется 5 образцов, а для одного образца - 14 функций. то для одного класса имеется 70 функций (5 * 14). это то, что вы имели ввиду ?? plz help .. \t 'float labels [36] [1] = {1.0, 2.0, ... -> 36.0}; Mat matlabesls (36,1, CV_32FC1, ярлыки) Mat mattrainingDataMat (36, 70, CV_32FC1, ifarr_readtrainingdata); –

+0

Если ваши данные состоят из функций для 3-х примеров «A», 2 «C» и 3 из «5» (в этом порядке), ваши метки будут «float labels» [7] [1] = {11.0 , 11.0, 11.0, 13.0,13,0, 5.0, 5.0, 5.0} при использовании 0.0..9.0 используются для обозначения «0» и «9» и 11.0..35.0 используются для обозначения «A» .. «Z», , Если порядок ваших данных был перепутан, метки должны были быть помечены для соответствия. Этикетки сообщают SVM, что каждый элемент данных является образцом. – Bull

+0

Большое спасибо, я знаю о маркировке. не могли бы вы рассказать мне о том, где здесь находится многоклассовый SVM. я чувствую, как вы сказали, что есть 3 11,0, 2 13,0 ... и т. д. это называется MultiClass SVM ?? –

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