Я пытаюсь подготовить SVM с дескрипторами SIFT, взятыми из изображений. И затем я хочу сохранить SVM в формате .xml
, чтобы я мог загрузить его снова.
Моя структура: у меня есть 10 классов по 100 образцов из каждого класса.
Вопрос: Если я использую 10-50 выборок для каждого класса, тогда SVM будет сохранен, и я могу увидеть файл classifer.xml
в моей папке. Но если я хочу использовать больше образцов, например, ~ 100 выборок на класс, тогда SVM не будет сохранен.
Я думал, что это может занять некоторое время, чтобы спасти, но я уже так долго ждал (и я сделал это несколько раз).
Мой код для обучения SVM следующий:
void svm::svmTrain()
{
cv::Mat trainme; // it should contain the feature vectors
cv::Mat labels; // it will contain the class labels
createTrainingDateUsingBOW( trainme, labels);
//svm parameters
CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);
CvSVMParams svm_params = CvSVMParams (CvSVM::C_SVC, CvSVM::POLY, 10.0 , 8.0 , 1.0 , 10.0 , 0.5 , 0.1 , NULL , criteria); //CvSVMParams --it is a struct
//( svm_type, kernel_type, degree , gamma , coef0 , Cvalue, nu , p , class_weights, term_crit)
cout<<"\n saving SVM \n";
cv::SVM svm;
svm.train(trainme, labels, cv::Mat(), cv::Mat(), svm_params);
svm.save("classifier.xml");
cout<<"\n SVM classifier is saved.";
}
PS: Итак, если мои образцы более 40-60 на класс, то я добираюсь до saving SVM
из приведенного выше кода, но никогда не добирается до SVM classifier is saved.
попробуйте эту замену, вы обнаружите, что, занимая слишком много времени для обучения, после обучения, это вряд ли займет минуту, чтобы сохранить файл.
cout<<"\n training SVM \n";
cv::SVM svm;
svm.train(trainme, labels, cv::Mat(), cv::Mat(), svm_params);
cout<<"\n saving SVM \n";
svm.save("classifier.xml");
cout<<"\n SVM classifier is saved.";
Я никогда лично не сталкивался с SVM, но, имея до 1000 образцов, он не тренируется менее чем за час. В моем случае, когда я пробовал вещи для рыбаков с таким же количеством образцов, это заняло более 2-3 часов.