数字图像处理(五) 利用PCA算法进行人脸识别
2014-02-13 16:15
543 查看
把你的脸部识别出来这样高科技的东西,原来可以简单的实现,说是简单,其实不像之前的那些,这次写不出来,直接拿了高材生老师的代码来理解整个思路(请尊重他的知识产权),将算法读懂。数字图像处理,觉得挺实用的而写这些东西。
首先需要我们提取人脸库,如一个公司,一所学校,把每个人的头像切下来。imcrop一下,截取成一个个小方框,就如南大标准脸那样的照片。
(:)是将矩阵转成一列。n个人可以排成n列,存成一个库。为了让识别的效果更好,同一个人可以用多个图片取样。所以可以用个三维的矩阵存储。(这里一个人用了两张样照。)
i 为 1 1 2 2 3 3 4 4
k 为 1 2 1 2 1 2 1 2
识别部分利用了PCA算法。
识别处理源码:
pca可以降维,因为如果这么大的一个矩阵数据进行处理匹配,速度肯定很慢,所以线性代数派上用场,一个这么大的矩阵,如果能得到两幅图像之间几乎相似的特征即可。
而PCA的求解:对样本的散布矩阵进行特征值分解,所求子空间为过样本均值,以最大特征所对应的特征向量为方向的子空间。PCA是一种非监督的算法,能找到很好地代表所有样本的方向,但这个方向对于分类未必是最有利的。(转自降维(一)),有时,数学的用处就用上了。
参考资料
特征向量的几何意义,学线性代数学了很久,也搞不懂这个的东西,很好的一篇文章:
http://blog.csdn.net/hexbina/article/details/7525850
还有个12届毕业的师兄:
http://www.cnblogs.com/blue-lg/archive/2012/05/14/2499581.html
还有PCA方法从原理到实现。
http://blog.csdn.net/celerychen2009/article/details/9048033#comments
首先需要我们提取人脸库,如一个公司,一所学校,把每个人的头像切下来。imcrop一下,截取成一个个小方框,就如南大标准脸那样的照片。
(:)是将矩阵转成一列。n个人可以排成n列,存成一个库。为了让识别的效果更好,同一个人可以用多个图片取样。所以可以用个三维的矩阵存储。(这里一个人用了两张样照。)
i 为 1 1 2 2 3 3 4 4
k 为 1 2 1 2 1 2 1 2
filelist=dir('*.bmp'); FileNum=length(filelist); %for i=1:FileNum/2 for j=1:FileNum inFilename = filelist(j).name; fa=imread(inFilename); fa=fa(:); %取整 i=ceil(j/2); if mod(j,2) == 1 k=1; else k=2; end FaceLib(:,k,i)=double(fa); end save FaceLib;save之后会保存为一个mat文件,通过load方法可将数据拿到。
识别部分利用了PCA算法。
识别处理源码:
load('FaceLab.mat'); %他人源码,未经同意不得随便转载 % filelist=dir('*.bmp'); %inFilename = filelist.name; %读入识别图像 testface = imread('test.bmp'); % testface = rgb2gray(testface); % testface = imresize(testface, [128 128], 'bicubic'); testface = double(testface(:)); dim=size(StuFaceLab,1); tal=size(StuFaceLab,2); class=size(StuFaceLab,3); ell=2; % ell training sample; ellsample=1; % ellsample test sample; t=1e7; % Similarity matrix 的参数 order=1; dita=1e7; NumTotal=ell*class; lpp=NumTotal-class; lda=class-1; polynomial=1; pca=40; %------------------- KPCA ------------------------------% Itr=zeros(dim,ell,class); % Training sample feature vector for classnum=1:class for e=1:ell % Itr(:,e,classnum)=Iv(:,e,classnum); % Itr(:,e,classnum)=StuFaceLab(:,e,classnum); % end end %----------------------------------------------------------------% % 倒入向量 Iv(dim,ell) % 样本类数 class Imean=zeros(dim,1); for classnum=1:class for i=1:ell Imean=Imean+Itr(:,i,classnum); end end Imean=(1/(ell*class))*Imean; %求平均向量 Q=zeros(dim,ell*class); for classnum=1:class for num=1:ell Q(:,num+(classnum-1)*ell)=Itr(:,num,classnum)-Imean(:,1); end end R=zeros(ell*class,ell*class); R=Q'*Q; % R's size is ell * ell d=rank(R); d=pca; [U,L]=eigs(R,d,'LM'); % 求出 R 的eigenvector and eigenvalue Wpca=zeros(dim,d); for p=1:d Wpca(:,p)=(1/(sqrt(L(p,p))))*Q*U(:,p); end % 程序至此得到了线形变换的矩阵 Wpca . %----------------------------------------------------------------% Iy=zeros(d,ell,class); % training feature vector % for classnum=1:class for num=1:ell Y=zeros(d,1); Iy(:,num,classnum)=Wpca'*Itr(:,num,classnum); end end %---------------------------循环体开始-------------------------------% % X=Tldalpp(:,img,cl); % X input sample vector % %以下为改进算法, 求每个类的 Z1 的平均值 % Iymean=zeros(dimension,class); Iymean=zeros(d,class); % because there two training face, revised by Y.G.Wang for classnum=1:class % Z1 : the mean of Z1 for i=1:ell Iymean(:,classnum)=Iymean(:,classnum)+Iy(:,i,classnum); end Iymean(:,classnum)=(1/ell)*Iymean(:,classnum); end %-------------------------进行匹配-------------------% %----------------此处可以进行修改,利用其他simlarity measure------------% G2=zeros(1,class); for classnum=1:class G2(1,classnum)=(X'*Iymean(:,classnum))/(norm(X)*norm(Iymean(:,classnum))); end Sclass=max(G2); %---------------得出最后的结果---------------------% for classnum=1:class if Sclass==G2(1,classnum) lastresult=classnum; end end clc if Sclass > 0.97 fprintf('此脸在本库中,且是学号:%d\n', lastresult); else fprintf('此脸不在本库中!\n'); end
pca可以降维,因为如果这么大的一个矩阵数据进行处理匹配,速度肯定很慢,所以线性代数派上用场,一个这么大的矩阵,如果能得到两幅图像之间几乎相似的特征即可。
而PCA的求解:对样本的散布矩阵进行特征值分解,所求子空间为过样本均值,以最大特征所对应的特征向量为方向的子空间。PCA是一种非监督的算法,能找到很好地代表所有样本的方向,但这个方向对于分类未必是最有利的。(转自降维(一)),有时,数学的用处就用上了。
参考资料
特征向量的几何意义,学线性代数学了很久,也搞不懂这个的东西,很好的一篇文章:
http://blog.csdn.net/hexbina/article/details/7525850
还有个12届毕业的师兄:
http://www.cnblogs.com/blue-lg/archive/2012/05/14/2499581.html
还有PCA方法从原理到实现。
http://blog.csdn.net/celerychen2009/article/details/9048033#comments
相关文章推荐
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结(转载)
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结2——级联分类器与检测过程
- (链接) AdaBoost中利用Haar特征进行人脸识别算法分析与总结
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图 .
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结2——级联分类器与检测过程
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
- 利用Multi-LBP和PCA、LDA进行人脸识别
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图 .
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结2——级联分类器与检测过程
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结2——级联分类器与检测过程 .