Я занимаюсь разработкой системы распознавания рукописных символов с использованием OpenCV LibSVM. я выделил 14 объектов для вектора признаков, включая моменты Ху, аффинно-инвариантные моменты, количество углов и т. д. Для каждого символа я использую 5 образцов (для буквы «А» существует 5 типов «А»). Я знаю, что 5 образцов недостаточно, но на данный момент у меня есть только 5 образцов для каждого персонажа.
Я использую базовый пример 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;
Настройка ваших ярлыков неверна. Вы определили 180 уникальных меток, но у вас есть только 26 классов данных. Длина меток должна составлять 180, но она должна содержать только значения 1..26 (подойдут любые 26 различных значений) в порядке, соответствующем порядку символов в mattrainingDataMat.
Вам понадобится более 5000 образцов каждой буквы, а не просто 5. Вы можете начать с набора рукописных цифр MNIST, пока не получите правильные данные.
Ваш код, кажется, тренирует SVM, чтобы просто распознать 1 символ. Вы не должны делать это так, потому что это может занять долго время тренировать свм. Вы должны обучить SVM отдельно и сохранить модель, чтобы ее можно было использовать повторно без необходимости переподготовки.
Насколько я понимаю, что SVM-код в OpenCV основан на старый версия Libsvm. Так что я просто использую последнюю версию libsvm напрямую, а не версию OpenCV.
Кроме того, в вашем случае вы почти наверняка получите гораздо лучшую точность с ядром RBF, чем с линейным ядром (хотя линейное проще обучить). Кажется, у вас есть 26 классов, поэтому, конечно, вам нужен мультиклассный SVM (который на самом деле просто много бинарных SVM) — Libsvm решает проблему мультикласса за вас.
Других решений пока нет …