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

  1. 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.
  2. you haven't set c parameter (you need find value via cross validation) - need more data.
  3. possibly hog descriptors faces , cars not separable linear kernel, try rbf. unlikely issue since d&l use linear svm in paper.
  4. read this: http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf
  5. if haven't done yet, svm working simpler case (e.g. use image patches instead of hog).

Comments

Popular posts from this blog

.htaccess - First slash is removed after domain when entering a webpage in the browser -

Automatically create pages in phpfox -

c# - Farseer ContactListener is not working -