opencv - cv::SVM response one class for every sample -
i new in match faces , trying learn how use svm hog descriptors. wrote simple face recognizer svm, when activate , code returns 1
float *gethog(const cv::mat &image, int* count)//compute hog { cv::hogdescriptor hog; std::vector<float> res; cv::mat img2; cv::resize(image, img2, cv::size(64, 128)); hog.compute(img2, res, cv::size(8, 8), cv::size(0, 0)); *count = res.size(); float* result = new float[*count]; for(int = 0; < res.size(); i++) { result[i] = res[i]; } return result; } const int datasetlength = 10; float **gettraininigdata(int* setlen, int* veclen)//load samples of data { char *names[datasetlength] = { "../faces/s1/1.pgm", "../faces/s1/2.pgm", "../faces/s1/3.pgm", "../faces/s1/4.pgm", "../faces/s1/5.pgm", "../faces/cars/1.jpg", "../faces/cars/2.jpg", "../faces/cars/3.jpg", "../faces/cars/4.jpg", "../faces/cars/5.jpg", }; float **res = new float* [datasetlength]; for(int = 0; < datasetlength; i++) { std::cout<<names[i]<<"\n"; cv::mat img = cv::imread(names[i], 0); res[i] = gethog(img, veclen); } *setlen = datasetlength; return res; } void test()//training , activate svm { int setlen, veclen; float **trainingdata = gettraininigdata(&setlen, &veclen); float *labels = new float[datasetlength]; for(int = 0; < datasetlength; i++) { labels[i] = (i < datasetlength/2)? 0.0 : 1.0; } cv::mat labelsmat(setlen, 1, cv_32fc1, labels); cv::mat trainingdatamat(setlen, veclen, cv_32fc1, trainingdata); cv::svmparams params; params.svm_type = cv::svm::c_svc; params.kernel_type = cv::svm::linear; params.term_crit = cv::termcriteria(cv_termcrit_iter, 100, 1e-6); std::cout<<labelsmat<<"\n"; cv::svm svm; svm.train(trainingdatamat, labelsmat, cv::mat(), cv::mat(), params); cv::mat img = cv::imread("../faces/s1/2.pgm", 0);//sample train data, ansewer 1 every sample auto desc = gethog(img, &veclen); cv::mat samplemat(1, veclen, cv_32fc1, desc); float response = svm.predict(samplemat); std::cout<<"resp "<< response<<"\n"; } what wrong code ?
ps sorry writing mistakes. english in not native language
- you don't have training data. note how dalal , triggs in original paper on hog (http://lear.inrialpes.fr/people/triggs/pubs/dalal-cvpr05.pdf) used thousands of examples train svm, have 5 negative , 5 positive.
- you haven't set c parameter (you need find value via cross validation) - need more data.
- possibly hog descriptors faces , cars not separable linear kernel, try rbf. unlikely issue since d&l use linear svm in paper.
- read this: http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf
- if haven't done yet, svm working simpler case (e.g. use image patches instead of hog).
Comments
Post a Comment