opencv中SVM的那些事

如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢。 




最近在搞人脸性别识别,用到了opencv中封装的SVM分类器,遇到了一些小问题,解决之后感觉对其理解更深一点了,总结下。

首先,理解下SVM得输入格式。SVM的train()函数主要包含两个输入数据:训练数据矩阵以及对应标签组成的矩阵。其中训练数据为行向量,标签矩阵为列向量。举个例子吧,比如在实验里一共用到300张图片作为训练数据,其中150张为正例样本,150张为负例样本,那么最终得到的训练数据矩阵大小应为150行n列,这里的n代表的就是每一张图片进行特征提取(包括下采样的方法)之后的特征维数,一般在一两千左右。对应的,标签矩阵应为300行1列,存储的内容为对应行特征向量所代表的正负标签,一般去+1和-1,当然取成别的数也可以。

其次需要说明的是就是SVM对于输入的数据类型是有要求的,即mTrainData(训练数据矩阵)以及mFlagPosNeg(标签矩阵)都必须为CV_32FC1类型,因此需要进行类型转换,而且必须保证转换完之后数值都不能大于1,这就给我们了两点启示:1、不能直接用下采用后的图像像素作为训练数据的输入,需要进行类型的归一化。2、类型转换时要使用normlize()函数,保证其数值范围不大于1,而不能简单的使用Mat的成员函数coverto,只变类型不变数值范围。

最后,把之前找的代码贴在这里,与网上的差不多,大家参考吧,是Hog+SVM的一段代码,批量读取图片时采用的是Csv文件的方法:

        String stCsvFilePos = "E:\\Gender_Reognition_Database\\训练样本\\发型区域\\最终训练样本\\正样本-男性短发\\pos_man.txt";
	String stCsvFileNeg = "E:\\Gender_Reognition_Database\\训练样本\\发型区域\\最终训练样本\\中性负样本\\negative.txt";
	ifstream ifstCsvFilePos(stCsvFilePos,ifstream::in);
	String stImagePath;
	Mat mImageTemp;
	Mat mTrainData;
	int iTrainOrder = 0;
	int iNumCurrent = 0;

	while (getline(ifstCsvFilePos,stImagePath))
	{
		mImageTemp = imread(stImagePath,0);
		resize(mImageTemp,mImageTemp,cv::Size(64,64));

		HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8), 9);  //具体意思见参考文章     		vector<float>descriptors;//结果数组       
		hog->compute(mImageTemp, descriptors, Size(1,1), Size(0,0)); //调用计算函数开始计算
		if (iNumCurrent==0)  
		{  
			mTrainData = Mat::zeros( 300,descriptors.size(), CV_32FC1 ); //根据输入图片大小进行分配空间   
		}  

		int n=0;    
		for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)    
		{    
			mTrainData.at<float>(iNumCurrent,n) = *iter;    
			n++;    
		}   
		++iNumCurrent;
	}

	ifstream ifstCsvFileNeg(stCsvFileNeg,ifstream::in);
	while (getline(ifstCsvFileNeg,stImagePath))
	{
		mImageTemp = imread(stImagePath,0);
		resize(mImageTemp,mImageTemp,cv::Size(64,64));

		HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8), 9);      
		vector<float>descriptors;//结果数组       
		hog->compute(mImageTemp, descriptors, Size(1,1), Size(0,0)); //调用计算函数开始计算
		if (iNumCurrent==0)  
		{  
			mTrainData = Mat::zeros( 300,descriptors.size(), CV_32FC1 ); //根据输入图片大小进行分配空间   
		}  

		int n=0;    
		for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)    
		{    
			mTrainData.at<float>(iNumCurrent,n) = *iter;    
			n++;    
		}   
		++iNumCurrent;
	}

	Mat mFlagPosNeg = Mat::zeros( 300, 1, CV_32FC1 );
	for (int i = 0; i < 150; i++)
	{
		mFlagPosNeg.at<float>(i,0) = 1;
	}
	for (int i = 150; i < 300; i++)
	{
		mFlagPosNeg.at<float>(i,0) = 2;
	}

    CvSVM svm;  
    CvSVMParams param;    
    CvTermCriteria criteria;      
    criteria = cvTermCriteria( CV_TERMCRIT_EPS, 1000, FLT_EPSILON );      
    param = CvSVMParams( CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria );     

	svm.train(mTrainData,mFlagPosNeg,Mat(),Mat(),param);
	svm.save("E:\\Gender_Reognition_Database\\训练样本\\SVM分类器\\ManShortHairModel.xml");


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用提到了OpenCV官方文档关于SVM(支持向量机)的相关内容。OpenCV是一个开源计算机视觉库,提供了众多图像处理和计算机视觉算法。SVM是其之一的机器学习算法,用于二分类或多分类问题的建模和预测。 在OpenCV 4.3版本SVM类的相关文档可以在OpenCV官方文档找到。SVM类的主要功能是通过训练数据集来构建支持向量机模型,并且可以使用该模型对新的数据进行分类预测。SVM类提供了多种参数和方法,可以对模型进行定制和优化。 如果您想要了解有关OpenCV 4.3版本SVM类的详细信息,建议您参考OpenCV官方文档提供的文档链接。在该文档,您可以找到有关SVM类的使用方法、参数说明和示例代码等内容,以帮助您更好地理解和应用这个机器学习算法。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [OpenCVSVM目标分类简单示例](https://blog.csdn.net/sss_369/article/details/90404331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [指针式仪表倾斜校正opencv算法python代码及仪表图像(包含倾斜的和模板图像)](https://download.csdn.net/download/sunnyrainflower/88221223)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值