2013-02-17 2 views
3

Я использую CvSVM для классификации только двух типов выражения лица. Я использовал гистограмму LBP (Local Binary Pattern) для извлечения функций из изображений и обучался с использованием cvSVM::train(data_mat,labels_mat,Mat(),Mat(),params), гдеCvSVM.predict() дает выход «NaN» и низкую точность

data_mat имеет размер 200x3452, содержащий нормированную гистограмму (0-1) 200 образцов в основной форме строки с 3452 особенностью каждого (зависит от числа точек окрестностей)

labels_mat является соответствующей матрицей меток, содержащей только два значения 0 и 1. параметров:

CvSVMParams PARAMS;

params.svm_type  =CvSVM::C_SVC; 
params.kernel_type =CvSVM::LINEAR; 
params.C   =0.01; 
params.term_crit=cvTermCriteria(CV_TERMCRIT_ITER,(int)1e7,1e-7); 

Проблема заключается в том, что: -

  1. во время тестирования я получаю очень плохой результат (около 10% -30% точности), даже после применения с различным ядром и функцией train_auto().

  2. CvSVM::predict(test_data_mat,true) дает 'NaN' выход

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

ответ

1

Я полагаю, что ваши классы линейно жесткие/неразделимые в пространстве объектов, которые вы используете. Может быть, лучше применить PCA к вашему набору данных до этапа обучения классификатора и оценить эффективную размерность этой проблемы. Также я думаю, что это будет удобный тест вашего набора данных с другими классификаторами. Вы можете адаптировать для этой цели стандартный пример opencv points_classifier.cpp. Он включает в себя множество разных классификаторов с похожим интерфейсом, с которым вы можете играть.

1

Сила обобщения SVM низкая. Вначале уменьшите размер данных по анализу основных компонентов, затем измените тип SVM kerenl на RBF.

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