基于Gabor+PCA+SVM的性别识别(3)(完)

欢迎转载,请注明出处;本人能力有限,错误在所难免,欢迎指导

基于前两博文,已经训练出一个性别分类器。那就应该运用这个分类器进行性别分类。

这个测试过程与训练过程一样。只不过,训练时,是大批量的处理样本数据数据。测试过程,针对需要识别的图像进行处理。

  1. 首先进行人脸识别,即在图像中找出人脸,把人脸区域提取出来。
  2. 第二步,运用Gabor小波对人脸提取特征。
  3. 第三步,运用PCA对Gabor提取的特征进行降维处理。
  4. 最后,把降维后特征,输入训练好的分类器,得出分类结果。


结果显示:

结果分析:

训练过程man样本 409,woman样本287。其实,对于机器学习来说,这些样本还是很少的。在进行测试时,6个man图像可以正确识别。woman图像识别过程出现了错误识别。因为样本图片都是老外,而且人数有限。对其他图片效果应该不是很好。

本人分析的主要原因有两点:1)在训练过程,Gabor小波、PCA降维过程的参数选取没有进行严格的测试;

2)训练样本太少,而且样本中就那几个人的脸。可以增加训练样本的数量。

最后还得提一点,由于训练过程运算量大。训练600多个样本,运行了应该有半个小时。

main.cpp   (Gabor类文件同(2))

  1 #include <opencv2/opencv.hpp>
  2 #include <opencv2/highgui/highgui.hpp>
  3 #include <opencv2/ml/ml.hpp>
  4 #include "GaborFR.h"
  5 using namespace cv;
  6 using namespace std;
  7 Mat detectAndDisplay( Mat);
  8 //加载Opencv自带人脸识别级联分类器文件
  9 string face_cascade_name ="D:\\Program Files\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
 10 CascadeClassifier face_cascade;
 11 int iSize=10;//Gabor的scale
 12 int main()
 13 {
 14     if( !face_cascade.load( face_cascade_name ) )
 15       {
 16         printf("[error] 无法加载级联分类器文件!\n");
 17         return -1;
 18       }
 19
 20     Mat testI = imread("man5.png");
 21     if(testI.data ==0)
 22        {
 23           printf("[error] 没有图片\n");
 24           return -5;
 25        }
 26     //提取人脸*****************************************************
 27      Mat  ROI= detectAndDisplay(testI);
 28     //Gabor变换*************************************************************
 29      normalize(ROI,ROI,1,0,CV_MINMAX,CV_32F);
 30      Mat feature_Gabor;
 31      feature_Gabor.release();
 32       for(int i=0;i<8;i++)
 33     {
 34
 35         for(int j=0;j<5;j++)
 36         {
 37             Mat M1= GaborFR::getRealGaborKernel(Size(iSize,iSize),
 38                                                  2*CV_PI,
 39                                                  i*CV_PI/8+CV_PI/2,
 40                                                  j,
 41                                                  1);
 42             Mat M2 = GaborFR::getImagGaborKernel(Size(iSize,iSize),
 43                                                  2*CV_PI,
 44                                                  i*CV_PI/8+CV_PI/2,
 45                                                  j,
 46                                                  1);
 47             //加了CV_PI/2才和大部分文献的图形一样,不知道为什么!
 48             Mat outR,outI;
 49             GaborFR::getFilterRealImagPart(ROI,M1,M2,outR,outI);
 50             Mat M_Magnitude=GaborFR::getMagnitude(outR,outI);
 51             normalize(M_Magnitude,M_Magnitude,0,1,CV_MINMAX,CV_32F);
 52             Mat line= M_Magnitude.reshape(0,1);
 53             feature_Gabor.push_back(line);
 54
 55         }
 56     }
 57
 58 //PCA降维**************************************************
 59     PCA pca(feature_Gabor, cv::Mat(), CV_PCA_DATA_AS_ROW,5);
 60     Mat dst=pca.project(feature_Gabor) ;
 61     Mat line =dst.reshape(0,1);
 62
 63 //SVM进行性别识别**************
 64     CvSVM mySVM;
 65     mySVM.load("SVM_PCA4.xml");//从XML文件读取训练好的SVM分类器模型
 66     float response = mySVM.predict(line );
 67
 68     cout<< response<<endl;
 69     if(response==1)
 70         cout<<"boy"<<endl;
 71     if(response==-1)
 72          cout<<"girl"<<endl;
 73     waitKey(0);
 74     system("pause");
 75 }
 76
 77
 78 Mat detectAndDisplay( Mat frame)
 79 {
 80     std::vector<Rect> faces;
 81     Mat frame_gray,ROI;
 82     frame_gray= frame;
 83     cvtColor( frame, frame_gray, CV_BGR2GRAY );
 84     equalizeHist( frame_gray, frame_gray );
 85
 86     face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
 87
 88     for( int i = 0; i < faces.size(); i++ )
 89     {
 90         Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
 91        // ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
 92      rectangle(frame,                //图像.
 93                  faces[i].tl(),             //矩形的一个顶点。
 94                  faces[i].br(),             //矩形对角线上的另一个顶点
 95                  Scalar(0, 255, 0),  //线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)
 96                   3);                 //组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形
 97      ROI=frame_gray(Rect(faces[i].tl().x,faces[i].tl().y,faces[i].width,faces[i].height));
 98      resize(ROI,ROI,Size(21,18),0,0,CV_INTER_LINEAR);
 99     }
100
101     //namedWindow("qq",2);
102     //imshow( "qq", ROI );
103
104     imshow( "window_name", frame );
105     return ROI;
106 }
时间: 2024-10-13 00:35:20

基于Gabor+PCA+SVM的性别识别(3)(完)的相关文章

简述人脸特异性识别&amp;&amp;一个基于LBP和SVM的人脸识别小例子

原谅我用图片,MAC在Safari里给文章进行图文排版太麻烦啦~ 本文适合初入计算机视觉和模式识别方向的同学们观看~ 文章写得匆忙,加上博主所知甚少,有不妥和勘误请指出并多多包涵. 本文Demo的代码由HZK编写,特征点由月神和YK选择和训练. 转载请注明 copyleft by sciencefans, 2014 为了方便大家学习,附上高维LBP的核心代码 1 ################################################### 2 # 3 # 4 # NO

C++开发人脸性别识别教程(6)——通过SVM实现性别识别

上一篇教程中我们介绍了怎样使用OpenCv封装的FaceRecognizer类实现简单的人脸性别识别,这里我们为大家提供第二种主要的性别识别手段--支持向量机(SVM). 支持向量机在解决二分类问题方面有着强大的威力(当然也能够解决多分类问题).性别识别是典型的二分类模式识别问题,因此非常适合用SVM进行处理,同一时候OpenCv又对SVM进行了非常好的封装,调用非常方便,因此我们在这个性别识别程序中考虑增加SVM方法. 在这里我们採用了HOG+SVM的模式来进行,即先提取图像的HOG特征.然后

(转)C++开发人脸性别识别教程(6)——通过SVM实现性别识别

原文地址:http://blog.csdn.net/u013088062/article/details/50480518 上一篇教程中我们介绍了如何使用OpenCv封装的FaceRecognizer类实现简单的人脸性别识别,这里我们为大家提供另外一种基本的性别识别手段——支持向量机(SVM). 支持向量机在解决二分类问题方面有着强大的威力(当然也可以解决多分类问题),性别识别是典型的二分类模式识别问题,因此很适合用SVM进行处理,同时OpenCv又对SVM进行了很好的封装,调用非常方便,因此我

C++开发人脸性别识别教程(12)——添加性别识别功能

经过之前几篇博客的讲解,我们已经成功搭建了MFC应用框架,并实现了基本的图像显示和人脸检测程序,在这篇博文中我们要向其中添加性别识别代码. 关于性别识别,之前已经专门拿出两篇博客的篇幅来进行讲解,这里不再赘述,具体参见:C++开发人脸性别识别教程(5)——通过FaceRecognizer类实现性别识别和C++开发人脸性别识别教程(6)——通过SVM实现性别识别. 一.分类器训练 在进行人脸性别识别之前需要训练性别识别的分类器,而分类器的训练过程是相对耗时的(大约五分钟),因此这里我们采用离线训练

基于OpenCV性别识别

描述 所谓性别识别就是判断检测出来的脸是男性还是女性,是个二元分类问题.识别所用的算法可以是SVM,BP神经网络,LDA,PCA,PCA+LDA等等.OpenCV官网给出的文档是基于Fisherfaces检测器(LDA)方法实现的.链接:http://docs.opencv.org/modules/contrib/doc/facerec/tutorial/facerec_gender_classification.html#id5 .这篇博文(http://www.bytefish.de/blo

OpenCV+Qt:基于PCA主成分分析的人脸识别例程

在模式识别领域中,PCA是一种常用的数据集降维手段,在此基础上,保留数据集中对方差贡献最大的特征从而进行模式分类.OpenCV中提供PCA的类,因此可以方便地使用PCA来进行人脸识别研究.在学习了网上的相关实现和代码,在以下开发平台跑通了代码:win8.1+OpenCV2.4.9+Qt5.3.2. 一.基本步骤 关于PCA的一些理论,可参照:http://blog.csdn.net/liyuefeilong/article/details/45126255 以下是实现PCA的基本思路: 1.把原

C++开发人脸性别识别教程(5)——通过FaceRecognizer类实现性别识别

在之前的博客中已经解决了人脸检测的问题,我们计划在这篇博客中介绍人脸识别.性别识别方面的相关实现方法. 其实性别识别和人脸识别本质上是相似的,因为这里只是一个简单的MFC开发,主要工作并不在算法研究上,因此我们直接将性别识别视为一种特殊的人脸识别模式.人脸识别可能需要分为几十甚至上百个类(因为有几十甚至上百个人),而性别识别则是一种特殊的人脸识别——只有两个类. 一.基本工具 通过OpenCv进行性别识别的基本工具是FaceRecognizer.这是OpenCv2.x版本中的一个基本的人脸识别类

人脸性别识别文献阅读笔记(2)

11.使用自动编码去噪的性别信息模型的情感识别(Modeling gender information for emotion recognition using Denoising autoencoder)(英文,会议论文,2014年,IEEE检索) 自动去噪编码器在语音识别领域的应用,先进行性别识别,在进行情感识别. 12.通过RGB-D数据的学习来识别RGB图像(Recognizing RGB Images by Learning from RGB-D Data)(英文,会议论文,2014

人脸性别识别文献阅读笔记(1)

之前研究过一段时间的人脸性别识别,将之前查阅的论文总结总结,与大家分享一下,也方便日后汇总. 1.基于LBP,亮度.形状直方图的多尺度特征融合的性别识别(Gender Classification Based on Fusion of Different Spatial Scale Features Selected by Mutual Information From Histogram of LBP, Intensity, and Shape)(英文,期刊,2013年,IEEE检索) 在性别