【问题标题】:Training CvSVM to detect humans in images using HOGDescriptor训练 CvSVM 以使用 HOGDescriptor 检测图像中的人类
【发布时间】:2014-04-01 23:57:03
【问题描述】:

我是opencv的新手。我正在尝试在 opencv 中使用 HOGDescriptor 提取图像的特征。我正在尝试使用 Opencv2.2 训练一个能够检测图像中的人类的 SVM。我正在使用包含 614 个正例和 1218 个负例的 INRIA 训练样本。

问题:我没有得到好的结果。当我用训练样本测试 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();

}

这里的列表初始化了存储从训练样本中提取的特征的文件名,即负和正。总数每个图像的特征数 = 1620。

【问题讨论】:

  • 尝试不同的内核类型?
  • 我只有 2 个类,即人类或非人类,所以我认为我只能使用线性内核......因为我没有相等的正负样本,所以我认为我必须设置参数......请帮助 -
  • 内核类型与可能的类的数量没有太大关系,它更多地与分类示例的分布方式有关。可能是线性内核根本无法将它们划分得足够好。但我同意这个答案,它或多或少是尝试直到成功。使用内核类型是一种有效的选择。
  • 我其实对内核类型不太了解...如果您能解释一下可以使用哪种类型的内核,我将不胜感激。在 opencv 文档中,这个想法也很模糊。
  • 只需阅读一些有关支持向量机的文档,例如 cs.columbia.edu/~kathy/cs4701/documents/jason_svm_tutorial.pdf、wiki en.wikipedia.org/wiki/Support_vector_machine 或该页面上的内容:kernel-machines.org/tutorials

标签: c++ opencv svm


【解决方案1】:

我认为设置参数没有硬性规定。它或多或少是基于一定限度内的命中和试炼。

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

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

【讨论】:

  • 由于我的正负样本不相等,所以我认为我必须设置参数...
猜你喜欢
  • 2013-08-29
  • 2015-10-06
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
相关资源
最近更新 更多