使用HOGDescriptor训练CvSVM以检测图像中的人物

时间:2014-02-28 19:38:54

标签: c++ opencv svm

我是opencv的新手。我试图在opencv中使用HOGDescriptor提取图像的功能。我正在尝试使用Opencv2.2训练SVM,它能够在图像中检测人类。我正在使用INRIA训练样本,其中包含614个阳性和1218个底片。

问题:我的效果不佳。当我使用训练样本测试SVM时,准确度为70%。任何人都可以帮助我如何调整SVM的参数不等于负和&阳性。 我的SVM的参数是:

CvMat *m=cvCreateMat(2,1,CV_32FC1);
cvmSet(m,0,0,1);
cvmSet(m,1,0,1);

CvSVMParams params;

params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
params.class_weights=m;
params.C=1000;

SVM培训的完整代码是:

void svm_train(char * list) {
      int num_files = 1832;

 int features=1620;

  float des;

int val=0;
int file_num=0;
int total=num_files*features;
int count=0;
Mat training_mat(num_files,features,CV_32FC1);
float label[1832];
for(int i=0;i<614;i++)
    label[i]= 1.0;
for(int j=614;j<1832;j++)
    label[j]= -1.0;
Mat labels(num_files,1,CV_32FC1,label);
    char *s;
fstream inputfile(list,ios::in);


while(count<=total)
{  

                if(val<=(features-1))
         {inputfile>>des;

    training_mat.at<float>(file_num,val)= des;
           val++;

        }
        else
        {
            val=0;
            file_num++;

        }
        count++;
}
count--;
cout<<count;




CvMat *m=cvCreateMat(2,1,CV_32FC1);
cvmSet(m,0,0,1);
cvmSet(m,1,0,1);
CvSVMParams params;
params.svm_type=CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
 params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
  params.class_weights=m;

 inputfile.close();
CvSVM svm;
pg=svm.get_default_grid(CvSVM::C);

         params.C=1000;
     fstream filelist("result1.txt",ios::app);
     filelist<<params.C;
     filelist<<"\t1218";
     filelist<<"\t\t614";

     svm.train(training_mat,labels,Mat(),Mat(),params);
     svm.save("svm_train.xml");
    filelist.close();

}

这里列表是初始化文件名​​,该文件名存储从训练样本中提取的特征,即负和&amp;正。总数没有。每幅图像的特征数= 1620。

1 个答案:

答案 0 :(得分:1)

我不认为设置参数有严格的规则。它更多&amp;在一定限度下基于命中和审判的较少。

但是您应该阅读以下链接,该链接是关于设置SVM开发人员编写的参数。这不是数学......看看

http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf