【发布时间】: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