« AdaBoosting----小分类器累积的力量不妨一看 »

opencv 中SVM + PCA 人脸识别

这一周一直都在弄人脸识别的东西,这个也可以算是我个人第一个DIY项目,虽然没有在MFC框架下来实现,但我觉得 SVM + PCA 人脸识别这个东西 最主要的还是算法 和效果没有必要一定要在MFC框架下去实现,况且由于鄙人马上就要准备英语了,时间实在有限,所以就只能在控制台下来实现。
话说,这其实是我帮师姐写的程序,只是他们项目的一部分,但对我意义深远!从不懂到慢慢明白一些道理,写这样一个技术文档无非就是怕以后忘记这样一个过程,我总觉得人的记忆细胞是有限的,要去记忆新的知识就必须要忘记一部分东西。
这个项目得到的经验:
1:我真正领悟到了“二八法则”的真谛。准备加编程阶段看了不少论文,试了不少方法,但
最后真正用到的无非就只有20%不到,但并非是白用功,没有多余的付出,也就不会有多余的回报;
2:体会到了理论与应用之间有着一道很深的鸿沟,理论再扎实,到头来编程还是个新手。当然了,我并不是说我理论有多么深厚,本人也是个菜鸟而已;
3:在调试的时候切记耐心,细心;很多错误都是基于一时意识的模糊造成,并非水平问题, 细心可以解决一切问题;

 
好了,我再说说在编程中遇到的问题及解决方案吧!希望对来看的人有所帮助!
1:opencv 有PCA函数,用起来还是比较好用的,但是PCA各个函数的参数设置还是需要经过仔细推敲的;比如:
CvMat data;
cvInitMatHeader( &data, (训练样本数), (单一图片维数), CV_32FC1, (数据存储矩阵(行:训练样本数;列:单一图片维数));
CvMat *pMeanVector = cvCreateMat( 1, (单一图片维数), CV_32FC1); 
CvMat *pEigenValue = cvCreateMat( (用户取出的特征向量个数), 1, CV_32FC1); 
CvMat *pEigenVector = cvCreateMat( (用户取出的特征向量个数), (单一图片维数), CV_32FC1); 
这些事PCA中很重要的几个参数;当然了图片是需要做标准处理的;其余的原理什么的还希望大家都去找找论文;多看论文有很大的帮助;
2:SVM训练问题,这个也是整了我好久的一个问题,下面我说的只是我个人的经验,并不能代表绝对正确,只是在我的程序中这样做成功了而已:
其实SVM训练问题一定要看那个日本人写的例子,写的非常的好,但是他的例子有3个,人脸检测部分效果一般,我觉得这个跟我在做识别的时候效果不好可能有相同的不足之处。后来在经过别人指导,在做SVM训练之前一定要将用PCA提取出来能够代表人脸的权值矩阵归一化,这用到了cvNormalize函数,这个函数还是自己找找怎么用的吧!
不光在训练之前要做归一化,也要在识别的时候做归一化的处理。我未做归一化处理之前识别率为0;做了归一化后识别率为75%, 虽然识别率不是很高,这个可能与我选取的特征向量个数,还有就是人脸前期未进行预处理造成的。切记一定要归一化。

 

 
这样一个小项目,用了VS2008 + opencv2.0 这样的环境,其实接触opencv也不是很久,对于里面一些函数还不是很了解.

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。