简单实现一个人脸检测器(HOG+SVM实现人脸检测)


  第一步,准备数据。

原始数据采用FDDB人脸检测测评数据集,FDDB是全世界最具权威的人脸检测评测平台之一,包含2845张图片,共有5171个人脸作为测试集。测试集范围包括:不同姿势、不同分辨率、旋转和遮挡等图片,同时包括灰度图和彩色图,标准的人脸标注区域为椭圆形。

       当然,为了简单起见,我们不直接使用这个数据集。我的做法是,自己做一些正样本和负样本数据集。正样本,即人脸,从FDDB数据集中选择一些图片,然后手动裁剪出人脸部分的图片,大概裁剪了100张。部分人脸如下图:



负样本,即非人脸,采用程序,每隔一定的间隔滑动裁剪。当然,可能会裁剪出一些人脸,这些需要手动除去。其中,裁剪图像的大小有几种,分别是64*64,100*100,128*128,144*144,160*160,总共截取了大概500张图片。部分图像结果如下:



       训练数据集,从上述的正样本中拿出90张,负样本中拿出400张,作为训练集。将剩下的正负样本作为测试集。

 

第二步,提取特征。此处特征采用HOG特征。

       具体步骤如下:

1)读取训练的图片

2)将训练图片缩放至64*64大小

3)将图像转换为灰度图像

4)对灰度图像求出HOG特征。

得到的HOG为1*144大小的Mat类型的数据。由于下一步SVM训练中,送入SVM的训练数据为Mat类型的矩阵,其中每一行表示一个训练数据,故SVM训练数据Mat大小为n*144,n表示训练集数量。因此,需要先创建一个n*144的Mat类型数据,然后将每个图像的HOG特征复制到刚才产生的Mat数据,每个图像的HOG特征为刚才产生的Mat数据的一行。

 

 

第三步,训练SVM。opencv3自带SVM,只需要简单几步设置即可。

函数如下:

1)创建SVM

  1. cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();  
cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();

2)设置SVM类型

  1. svm->setType(cv::ml::SVM::Types::C_SVC);  
svm->setType(cv::ml::SVM::Types::C_SVC);

3)设置核函数为线性核函数

  1. svm->setKernel(cv::ml::SVM::KernelTypes::LINEAR);  
svm->setKernel(cv::ml::SVM::KernelTypes::LINEAR);

4)设置迭代终止条件

  1. svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 100, 1e-6));  
svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 100, 1e-6));

5)开始训练

  1. svm->train(sampleFeatureMat, cv::ml::SampleTypes::ROW_SAMPLE, sampleLabelMat);  
svm->train(sampleFeatureMat, cv::ml::SampleTypes::ROW_SAMPLE, sampleLabelMat);

6)保存训练后的SVM参数

  1. svm->save("svm_save.xml");  
svm->save("svm_save.xml");

注:一些参数说明

svm_type –指定SVM的类型,下面是可能的取值:

  CvSVM::C_SVC C类支持向量分类机。 n类分组 (n \geq 2),允许用异常值惩罚因子C进行不完全分类。

  CvSVM::NU_SVC \nu类支持向量分类机。n类似然不完全分类的分类器。参数为 \nu 取代C(其值在区间【0,1】中,nu越大,决策边界越平滑)。

  CvSVM::ONE_CLASS 单分类器,所有的训练数据提取自同一个类里,然后SVM建立了一个分界线以分割该类在特征空间中所占区域和其它类在特征空间中所占区域。

  CvSVM::EPS_SVR \epsilon类支持向量回归机。训练集中的特征向量和拟合出来的超平面的距离需要小于p。异常值惩罚因子C被采用。

  CvSVM::NU_SVR \nu类支持向量回归机。 \nu 代替了 p。

 

  kernel_type –SVM的内核类型,下面是可能的取值:

 

  CvSVM::LINEAR 线性内核。没有任何向映射至高维空间,线性区分(或回归)在原始特征空间中被完成,这是最快的选择。K(x_i, x_j) = x_i^T x_j.

  CvSVM::POLY 多项式内核: K(x_i, x_j) = (\gamma x_i^T x_j + coef0)^{degree},\gamma > 0.

  CvSVM::RBF 基于径向的函数,对于大多数情况都是一个较好的选择: K(x_i, x_j) = e^{-\gamma ||x_i - x_j||^2},\gamma > 0.

  CvSVM::SIGMOID Sigmoid函数内核:K(x_i, x_j) = \tanh(\gamma x_i^T x_j +coef0).

 

  degree –内核函数(POLY)的参数degree。

 

  gamma –内核函数(POLY/ RBF/ SIGMOID)的参数\gamma。

 

  coef0 –内核函数(POLY/ SIGMOID)的参数coef0。

 

  Cvalue – SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C。

 

  nu – SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数 \nu。

 

  p – SVM类型(EPS_SVR)的参数 \epsilon。

 

  class_weights – C_SVC中的可选权重,赋给指定的类,乘以C以后变成 class\_weights_i * C。所以这些权重影响不同类别的错误分类惩罚项。权重越大,某一类别的误分类数据的惩罚项就越大。

 

  term_crit – SVM的迭代训练过程的中止条件,解决部分受约束二次最优问题。您可以指定的公差和/或最大迭代次数。

 

 

 

第四步,测试。将新的图片送入SVM中,让SVM预测结果。

 

总体程序如下:

(测试环境:Win7 64位+ Visual Studio 2015 + Opencv310)


  1. #include<iostream>  
  2. #include <fstream>    
  3. #include<opencv2/opencv.hpp>  
  4. #include<opencv2/highgui/highgui.hpp>  
  5. #include "opencv2/imgproc.hpp"  
  6. #include "opencv2/highgui.hpp"  
  7. #include "opencv2/ml.hpp"  
  8. using namespace std;  
  9. using namespace cv;  
  10.   
  11. //Parameters  
  12. #define N_BINS 16           //Number of bins  
  13. #define N_DIVS 3            //Number of cells = N_DIVS*N_DIVS  
  14. #define N_PHOG N_DIVS*N_DIVS*N_BINS  
  15. #define BIN_RANGE (2*CV_PI)/N_BINS  
  16. //Haar Cascade Path  
  17.   
  18.   
  19. //Input: Grayscale image  
  20. //Output: HOG features  
  21. Mat hog(const Mat &Img);  
  22.   
  23.   
  24. #define PosSamNO 90    //正样本个数    
  25. #define NegSamNO 400    //负样本个数    
  26. #define HardExampleNO 0     
  27.   
  28. #define TRAIN true    //是否进行训练,true表示重新训练,false表示读取xml文件中的SVM模型    
  29.   
  30. int main()  
  31. {  
  32.     // initial SVM  
  33.     cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();  
  34.     int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定    
  35.     Mat sampleFeatureMat;//所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数        
  36.     Mat sampleLabelMat;//训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,-1表示无人   
  37.   
  38.   
  39.     if (TRAIN)  
  40.     {  
  41.         //依次读取正样本图片,生成HOG特征  
  42.         for (int i = 1; i <= PosSamNO; i++)  
  43.         {  
  44.             char pic_name[64];  
  45.             sprintf(pic_name, "E:\\data\\face\\pos\\%04d.jpg", i);  
  46.             //  cout << pic_name << endl;  
  47.             Mat src = imread(pic_name);//读取图片    
  48.             resize(src, src, Size(64, 64));//将图片大小缩放为64*64  
  49.             Mat img_gray;  
  50.             cvtColor(src, img_gray, CV_BGR2GRAY);//将彩色图片转换为灰度图  
  51.             Mat feature = hog(img_gray);//提取HOG特征  
  52.             if (1 == i)  
  53.             {  
  54.                 DescriptorDim = feature.cols;//feature.size();//HOG描述子的维数    
  55.                                              //初始化所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数sampleFeatureMat    
  56.                 sampleFeatureMat = Mat::zeros(PosSamNO + NegSamNO + HardExampleNO, DescriptorDim, CV_32FC1);  
  57.                 //初始化训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,0表示无人    
  58.                 sampleLabelMat = Mat::zeros(PosSamNO + NegSamNO + HardExampleNO, 1, CV_32SC1);  
  59.             }  
  60.   
  61.             for (int j = 0; j < DescriptorDim; j++)  
  62.                 sampleFeatureMat.at<float>(i - 1, j) = feature.at<float>(0, j);//第i个样本的特征向量中的第j个元素    
  63.             sampleLabelMat.at<int>(i - 1, 0) = 1;//正样本类别为1,是人脸  
  64.   
  65.   
  66.         }  
  67.         //依次读取负样本图片,生成HOG特征  
  68.         for (int i = 1; i <= NegSamNO; i++)  
  69.         {  
  70.             char pic_name[64];  
  71.             sprintf(pic_name, "E:\\data\\face\\neg2\\%04d.jpg", i);  
  72.             //  cout << pic_name << endl;  
  73.             Mat src = imread(pic_name);//读取图片    
  74.             resize(src, src, Size(64, 64));  
  75.             Mat img_gray;  
  76.             cvtColor(src, img_gray, CV_BGR2GRAY);  
  77.             Mat feature = hog(img_gray);  
  78.   
  79.             for (int j = 0; j < DescriptorDim; j++)  
  80.                 sampleFeatureMat.at<float>(PosSamNO + i - 1, j) = feature.at<float>(0, j);//第i个样本的特征向量中的第j个元素    
  81.             sampleLabelMat.at<int>(PosSamNO + i - 1, 0) = -1;//负样本类别为1,非人脸  
  82.   
  83.   
  84.         }  
  85.   
  86.         输出样本的HOG特征向量矩阵到文件    
  87.         //ofstream fout("SampleFeatureMat.txt");  
  88.         //for (int i = 0; i < PosSamNO + NegSamNO; i++)  
  89.         //{  
  90.         //  fout << i << endl;  
  91.         //  for (int j = 0; j < DescriptorDim; j++)  
  92.         //      fout << sampleFeatureMat.at<float>(i, j) << "  ";  
  93.         //  fout << endl;  
  94.         //}  
  95.   
  96.         //训练SVM分类器    
  97.         //cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();  
  98.         svm->setType(cv::ml::SVM::Types::C_SVC);//设置SVM类型  
  99.         svm->setKernel(cv::ml::SVM::KernelTypes::LINEAR);//设置核函数  
  100.         svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 100, 1e-6));  
  101.   
  102.         // train operation  
  103.         svm->train(sampleFeatureMat, cv::ml::SampleTypes::ROW_SAMPLE, sampleLabelMat);  
  104.   
  105.         svm->save("svm_save.xml");  
  106.   
  107.     }  
  108.     else//若TRAIN为false,从XML文件读取训练好的分类器    
  109.     {  
  110.         String filename = "svm_save.xml";  
  111.         svm = cv::ml::StatModel::load<cv::ml::SVM>(filename);  
  112.         //svm->load(filename);  
  113.     }  
  114.   
  115.   
  116.   
  117.   
  118.     //下面开始预测  
  119.     for (int i = 1; i < 22; i++)  
  120.     {  
  121.         char pic_name[64];  
  122.         sprintf(pic_name, "E:\\data\\face\\test\\%04d.jpg", i);  
  123.         cout << pic_name << ":";  
  124.         Mat src = imread(pic_name);//读取图片    
  125.         resize(src, src, Size(64, 64));  
  126.         Mat img_gray;  
  127.         cvtColor(src, img_gray, CV_BGR2GRAY);  
  128.         Mat feature = hog(img_gray);  
  129.   
  130.         float respose = svm->predict(feature);  
  131.         if (respose == 1)  
  132.             cout << "人脸" << endl;  
  133.         else if (respose == -1)  
  134.             cout << "非人脸" << endl;  
  135.     }  
  136.   
  137.   
  138.     getchar();  
  139.     return 0;  
  140. }  
  141.   
  142.   
  143.   
  144.   
  145.   
  146. Mat hog(const Mat &Img)  
  147. {  
  148.     Mat Hog;  
  149.     Hog = Mat::zeros(1, N_PHOG, CV_32FC1);  
  150.   
  151.     Mat Ix, Iy;  
  152.   
  153.     //Find orientation gradients in x and y directions  
  154.     Sobel(Img, Ix, CV_16S, 1, 0, 3);  
  155.     Sobel(Img, Iy, CV_16S, 0, 1, 3);  
  156.   
  157.     int cellx = Img.cols / N_DIVS;  
  158.     int celly = Img.rows / N_DIVS;  
  159.   
  160.     int img_area = Img.rows * Img.cols;  
  161.   
  162.     for (int m = 0; m < N_DIVS; m++)  
  163.     {  
  164.         for (int n = 0; n < N_DIVS; n++)  
  165.         {  
  166.             for (int i = 0; i<cellx; i++)  
  167.             {  
  168.                 for (int j = 0; j<celly; j++)  
  169.                 {  
  170.   
  171.                     float px, py, grad, norm_grad, angle, nth_bin;  
  172.   
  173.                     //px = Ix.at(m*cellx+i, n*celly+j);  
  174.                     //py = Iy.at(m*cellx+i, n*celly+j);  
  175.                     px = static_cast<float>(Ix.at<int16_t>((m*cellx) + i, (n*celly) + j));  
  176.                     py = static_cast<float>(Iy.at<int16_t>((m*cellx) + i, (n*celly) + j));  
  177.   
  178.                     grad = static_cast<float>(std::sqrt(1.0*px*px + py*py));  
  179.                     norm_grad = grad / img_area;  
  180.   
  181.                     //Orientation  
  182.                     angle = std::atan2(py, px);  
  183.   
  184.                     //convert to 0 to 360 (0 to 2*pi)  
  185.                     if (angle < 0)  
  186.                         angle += 2 * CV_PI;  
  187.   
  188.                     //find appropriate bin for angle  
  189.                     nth_bin = angle / BIN_RANGE;  
  190.   
  191.                     //add magnitude of the edges in the hog matrix  
  192.                     Hog.at<float>(0, (m*N_DIVS + n)*N_BINS + static_cast<int>(angle)) += norm_grad;  
  193.   
  194.                 }  
  195.             }  
  196.         }  
  197.     }  
  198.   
  199.     //Normalization  
  200.     for (int i = 0; i< N_DIVS*N_DIVS; i++)  
  201.     {  
  202.         float max = 0;  
  203.         int j;  
  204.         for (j = 0; j<N_BINS; j++)  
  205.         {  
  206.             if (Hog.at<float>(0, i*N_BINS + j) > max)  
  207.                 max = Hog.at<float>(0, i*N_BINS + j);  
  208.         }  
  209.         for (j = 0; j<N_BINS; j++)  
  210.             Hog.at<float>(0, i*N_BINS + j) /= max;  
  211.     }  
  212.     return Hog;  
  213. }  
#include<iostream>
#include <fstream>  
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/ml.hpp"
using namespace std;
using namespace cv;

//Parameters
#define N_BINS 16           //Number of bins
#define N_DIVS 3            //Number of cells = N_DIVS*N_DIVS
#define N_PHOG N_DIVS*N_DIVS*N_BINS
#define BIN_RANGE (2*CV_PI)/N_BINS
//Haar Cascade Path


//Input: Grayscale image
//Output: HOG features
Mat hog(const Mat &Img);


#define PosSamNO 90    //正样本个数  
#define NegSamNO 400    //负样本个数  
#define HardExampleNO 0   

#define TRAIN true    //是否进行训练,true表示重新训练,false表示读取xml文件中的SVM模型  

int main()
{
	// initial SVM
	cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
	int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定  
	Mat sampleFeatureMat;//所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数      
	Mat sampleLabelMat;//训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,-1表示无人 


	if (TRAIN)
	{
		//依次读取正样本图片,生成HOG特征
		for (int i = 1; i <= PosSamNO; i++)
		{
			char pic_name[64];
			sprintf(pic_name, "E:\\data\\face\\pos\\%04d.jpg", i);
			//	cout << pic_name << endl;
			Mat src = imread(pic_name);//读取图片  
			resize(src, src, Size(64, 64));//将图片大小缩放为64*64
			Mat img_gray;
			cvtColor(src, img_gray, CV_BGR2GRAY);//将彩色图片转换为灰度图
			Mat feature = hog(img_gray);//提取HOG特征
			if (1 == i)
			{
				DescriptorDim = feature.cols;//feature.size();//HOG描述子的维数  
											 //初始化所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数sampleFeatureMat  
				sampleFeatureMat = Mat::zeros(PosSamNO + NegSamNO + HardExampleNO, DescriptorDim, CV_32FC1);
				//初始化训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,0表示无人  
				sampleLabelMat = Mat::zeros(PosSamNO + NegSamNO + HardExampleNO, 1, CV_32SC1);
			}

			for (int j = 0; j < DescriptorDim; j++)
				sampleFeatureMat.at<float>(i - 1, j) = feature.at<float>(0, j);//第i个样本的特征向量中的第j个元素  
			sampleLabelMat.at<int>(i - 1, 0) = 1;//正样本类别为1,是人脸


		}
		//依次读取负样本图片,生成HOG特征
		for (int i = 1; i <= NegSamNO; i++)
		{
			char pic_name[64];
			sprintf(pic_name, "E:\\data\\face\\neg2\\%04d.jpg", i);
			//	cout << pic_name << endl;
			Mat src = imread(pic_name);//读取图片  
			resize(src, src, Size(64, 64));
			Mat img_gray;
			cvtColor(src, img_gray, CV_BGR2GRAY);
			Mat feature = hog(img_gray);

			for (int j = 0; j < DescriptorDim; j++)
				sampleFeatureMat.at<float>(PosSamNO + i - 1, j) = feature.at<float>(0, j);//第i个样本的特征向量中的第j个元素  
			sampleLabelMat.at<int>(PosSamNO + i - 1, 0) = -1;//负样本类别为1,非人脸


		}

		输出样本的HOG特征向量矩阵到文件  
		//ofstream fout("SampleFeatureMat.txt");
		//for (int i = 0; i < PosSamNO + NegSamNO; i++)
		//{
		//	fout << i << endl;
		//	for (int j = 0; j < DescriptorDim; j++)
		//		fout << sampleFeatureMat.at<float>(i, j) << "  ";
		//	fout << endl;
		//}

		//训练SVM分类器  
		//cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
		svm->setType(cv::ml::SVM::Types::C_SVC);//设置SVM类型
		svm->setKernel(cv::ml::SVM::KernelTypes::LINEAR);//设置核函数
		svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 100, 1e-6));

		// train operation
		svm->train(sampleFeatureMat, cv::ml::SampleTypes::ROW_SAMPLE, sampleLabelMat);

		svm->save("svm_save.xml");

	}
	else//若TRAIN为false,从XML文件读取训练好的分类器  
	{
		String filename = "svm_save.xml";
		svm = cv::ml::StatModel::load<cv::ml::SVM>(filename);
		//svm->load(filename);
	}




	//下面开始预测
	for (int i = 1; i < 22; i++)
	{
		char pic_name[64];
		sprintf(pic_name, "E:\\data\\face\\test\\%04d.jpg", i);
		cout << pic_name << ":";
		Mat src = imread(pic_name);//读取图片  
		resize(src, src, Size(64, 64));
		Mat img_gray;
		cvtColor(src, img_gray, CV_BGR2GRAY);
		Mat feature = hog(img_gray);

		float respose = svm->predict(feature);
		if (respose == 1)
			cout << "人脸" << endl;
		else if (respose == -1)
			cout << "非人脸" << endl;
	}


	getchar();
	return 0;
}





Mat hog(const Mat &Img)
{
	Mat Hog;
	Hog = Mat::zeros(1, N_PHOG, CV_32FC1);

	Mat Ix, Iy;

	//Find orientation gradients in x and y directions
	Sobel(Img, Ix, CV_16S, 1, 0, 3);
	Sobel(Img, Iy, CV_16S, 0, 1, 3);

	int cellx = Img.cols / N_DIVS;
	int celly = Img.rows / N_DIVS;

	int img_area = Img.rows * Img.cols;

	for (int m = 0; m < N_DIVS; m++)
	{
		for (int n = 0; n < N_DIVS; n++)
		{
			for (int i = 0; i<cellx; i++)
			{
				for (int j = 0; j<celly; j++)
				{

					float px, py, grad, norm_grad, angle, nth_bin;

					//px = Ix.at(m*cellx+i, n*celly+j);
					//py = Iy.at(m*cellx+i, n*celly+j);
					px = static_cast<float>(Ix.at<int16_t>((m*cellx) + i, (n*celly) + j));
					py = static_cast<float>(Iy.at<int16_t>((m*cellx) + i, (n*celly) + j));

					grad = static_cast<float>(std::sqrt(1.0*px*px + py*py));
					norm_grad = grad / img_area;

					//Orientation
					angle = std::atan2(py, px);

					//convert to 0 to 360 (0 to 2*pi)
					if (angle < 0)
						angle += 2 * CV_PI;

					//find appropriate bin for angle
					nth_bin = angle / BIN_RANGE;

					//add magnitude of the edges in the hog matrix
					Hog.at<float>(0, (m*N_DIVS + n)*N_BINS + static_cast<int>(angle)) += norm_grad;

				}
			}
		}
	}

	//Normalization
	for (int i = 0; i< N_DIVS*N_DIVS; i++)
	{
		float max = 0;
		int j;
		for (j = 0; j<N_BINS; j++)
		{
			if (Hog.at<float>(0, i*N_BINS + j) > max)
				max = Hog.at<float>(0, i*N_BINS + j);
		}
		for (j = 0; j<N_BINS; j++)
			Hog.at<float>(0, i*N_BINS + j) /= max;
	}
	return Hog;
}


测试集如下:




预测结果如下:




 

结果均正确。

 

说明:这只是一个简单的例子,要想真正很好地实现人脸检测,还需要很多改进。

 

 

参考文献:

OpenCVopencv3.0中的SVM训练 mnist 手写字体识别

自己训练SVM分类器进行HOG行人检测

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MATLAB是一种计算机程序语言和交互式环境,它可以用于各种数据分析、科学计算和工程设计任务,包括图像分类和目标检测。其中,HOG(方向梯度直方图)和SVM(支持向量机)是两种常见的方法用于图像分类。 HOG特征表示一张图像中不同方向的梯度信息,并构建一个直方图来表示每个图像块的特征。这种特征提取方法在行人检测和人脸识别等领域得到了较好的应用。在MATLAB中,可以使用图像处理工具箱中的函数来提取HOG特征,并使用机学习工具箱中的函数来训练分类SVM是一种常用的分类,它可以将不同类别的图像分开。对于训练样本,SVM可以找到一个最优的超平面将它们分割开来。在MATLAB中,可以使用机学习工具箱中的函数来训练SVM分类,并将其用于测试数据的分类。 将HOG特征SVM分类结合在一起,可以实现高效的图像分类。在MATLAB中,可以先使用HOG特征提取函数来生成图像特征,然后使用训练好的SVM分类实现分类。这种方法在机视觉和计算机视觉中有广泛的应用,例如行人检测、人脸识别和物体识别等。总之,MATLAB图像分类hog svm方法是一种常用的图像识别方法,在各种不同的应用领域都有很好的表现。 ### 回答2: MATLAB是一款强大的编程软件,其中包括了图像处理和机学习等领域的工具箱。其中,一种常见的图像分类算法是HOG+SVMHOG(Histogram of Oriented Gradients)提取图像中各个方向的梯度信息,并将其转化为直方图的形式,以描述图像的纹理和形状特征SVM(Support Vector Machine)则利用这些特征来进行二分类或多分类的决策。这种方法广泛应用于人脸识别、物体检测等图像分类领域,具有较高的准确性和稳定性。在MATLAB中,用户可以通过调用相关函数,如hogFeatureExtractor、trainImageCategoryClassifier等,来实现该算法的图像分类。同时,用户也可以根据实际情况对算法进行优化和改进,例如:引入更多的特征描述符、设置合适的SVM参数等。总之,MATLAB提供了丰富的工具和方法,为用户快速、高效地进行图像分类和机学习提供了便利。 ### 回答3: HOG-SVM分类是一种常用的图像分类方法。HOG特征描述子是由Navneet Dalal和Bill Triggs于2005年提出的一种用于图像中物体检测的特征描述子。他们通过传统人工特征提取方法,从人眼视觉能够识别的局部图像特征出发,将图像转换成方向梯度直方图(Histogram of Oriented Gradient, HOG特征HOG特征的提取,是指首先将图像分成很多小的单元格(cell),每个单元格内维护一个梯度方向直方图,然后使用经过分块(block)的梯度直方图来描述每个block中的梯度方向信息,最后将所有的分块信息串起来得到一个用于描述整张图片特征的向量。 SVM分类则是通过对正负样本数据进行训练,使其能够将各类样本分开的一个分类SVM分类最后将每个测试样本特征向量作为其输入,判定其属于哪个类别,并给出对于属于每个类别的置信度。 在图像分类中,使用HOG-SVM分类能够实现对于目标物体的自动识别。先对训练数据进行HOG特征提取和SVM训练,训练完毕后,可以对测试数据进行HOG特征提取,并使用训练好的SVM分类进行物体的分类识别。实验表明,HOG-SVM分类具有较高的分类准确率和较好的鲁棒性,广泛应用于目标检测、人脸识别等领域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值