我是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。
答案 0 :(得分:1)
我不认为设置参数有严格的规则。它更多&amp;在一定限度下基于命中和审判的较少。
但是您应该阅读以下链接,该链接是关于设置SVM开发人员编写的参数。这不是数学......看看