2022年PCA人脸识别理论基础附源码.pdf
PCA人脸识别理论基础附源码1 2 n 1 2 n0 1 PCA 与人脸识别及其理论基础1、1 问题描述1对于一幅图像可以瞧作一个由像素值组成的矩阵,也可以扩展开, 瞧成一个矢量,如一幅N*N 象素的图像可以视为长度为N2 的矢量 ,这样就认为这幅图像就是位于N2 维空间中的一个点 , 这种图像的矢量表示就就是原始的图像空间, 但就是这个空间仅就是可以表示或者检测图 像的许多个空间中的一个。不管子空间的具体形式如何, 这种方法用于图像识别的基本思想 都就是一样的 ,首先选择一个合适的子空间,图像将被投影到这个子空间上,然后利用对图像的这种投影间的某种度量来确定图像间的相似度,最常见的就就是各种距离度量。1、1、1 K-L 变换1PCA 方法就是由Turk 与 Pentlad 提出来的 ,它的基础就就是Karhunen-Loeve 变换 (简称KL 变换 ),就是一种常用的正交变换。下面我们首先对K-L 变换作一个简单介绍:假设 X 为 n 维的随机变量 ,X 可以用 n 个基向量的加权与来表示:nX = iii =1式中 : i 就是加权系数, i 就是基向量 ,此式还可以用矩阵的形式表示:X = (, ,)(,)T= 取基向量为正交向量,即T ?1i = j T则系数向量为 : j = ?i j?j = I= T X综上所述 ,K-L 展开式的系数可用下列步骤求出:步骤一 求随即向量X 的自相关矩阵R = E ?X T X ?,由于没有类别信息的样本集的 均值向量,常常没有意义 ,所以也可以把数据的协方差矩阵K_L 坐标系的产生矩阵 ,这里 就是总体均值向量。= E ?( x -)( x -)T ?作为步骤二 求出自相关矩阵或协方差矩阵R 的本征值i 与本征向量i , = (1 ,i ,n ) 步骤三 展开式系数即为= T XK_L 变换的实质就是建立了一个新的坐标系,将一个物体主轴沿特征矢量对齐的旋转变换 ,这个变换解除了原有数据向量的各个分量之间相关性,从而有可能去掉那些带有较少信息的坐标系以达到降低特征空间维数的目的。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 12 页 - - - - - - - - - - PCA人脸识别理论基础附源码T T?i x i xAN * r A1、1、2 利用 PCA 进行人脸识别完整的 PCA 人脸识别的应用包括几个步骤:人脸图像预处理;读入人脸库 ,训练形成特征子空间 ;把训练图像与测试图像投影到上一步骤中得到的子空间上;选择一定 的距离函数进行识别。下面详细描述整个过程(源码见 faceRec、m ) 。1、 读入人脸库归一化人脸库后,将库中的每人选择一定数量的图像构成训练集, 其 余构成测试集。设归一化后的图像就是n*m, 按列相连就构成N=n*m 维矢量 ,可视为 N 维空间中的一个点,可以通过 K-L 变换用一个低维子空间描述这个图像。2、 计算 K- L 变换的生成矩阵所有训练样本的协方差矩阵为 (以下三个等价) :?1、?CA = ( Mk = 1xk ixk ) / M -mx imx?2、 C = ( AiAT ) / M(1)?M ?3、 C?A= ?i =1( x - m )( x - m )T ?A =1,2 , 、 ,M ,i= xi - mx , mx 就是平均人脸, M 训练人脸数 ,协方差矩阵CA 就是一个 N*N 的矩阵 , N 就是xi 的维数。为了方便计算特征值与特征向量,一般选用第 2个公式。根据 K - L 变换原理 ,我们所求的新坐标系即由矩阵Ai AT 的非零特征值所对应的特征向量组成。直接求N*N 大小矩阵C 的 特征值与正交归一特征向量就是很困难的, 根据奇异值分解原理(见段落 1、2、5与 1、2、6) ,可以通过求解AT i A的特征值与特征向量来获得AT i A的特征值与特征向量, 。在计算得到CA 的所有非零特征值0 ,1 ,r -1 (从大到小排序 ,1 r n)维矩阵 ,则存在两个正交矩阵与一个对角阵:A = a1 ,a2 ,ar = U V其中U = u0 ,u1 , ,ur - 1 , V = v0 ,v1 , ,vr - 1 , = diag(0 ,1 , ,r - 1 ) ,且UU= I , VVT= I ,精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 12 页 - - - - - - - - - - PCA人脸识别理论基础附源码iiiXi i ii i iT2 T m*m Tn* n T Ti 呈降序排列。 其中i为AA?与A A ?的非零特征值 ,ui 与vi 分别就是AA 与A A对应于 2 的特征向量。可得一个推论: U = AV -1可以计算AT A 的特征值 2 及相应的正交归一特征向量v 后,可由推论知AAT 的正交归一特i i征向量u = 1iAvi注意 ,协方差矩阵CA= ( Ai AT ) / M 的特征值为 : 2 / M 。1、2、6 利用小矩阵计算大矩阵特征向量高阶矩阵的特征向量可以转化为求低阶矩阵的特征向量:设:A 就是秩为r 的 m*n (mn)维矩阵 , CX= AAT ?m* m ,就是一个矩阵 ,现在要求C 的特征值及特征向量 ,可 通过先求小矩阵AT A ?n*n 的特征 向量v ,v , ,v 与特征值0 1 r - 1 0 ,1 ,r - 1 ,两者之间有以下关系:AT A?v = ?v?左?乘?A AAT (A?v ) = (A?v )显然 , C= AAT 的特征向量就是A?v (注意没有单位化) ,亦为其特征值。X i 0 1 r - 1结论 :1、2、5 与 1、2、6 的方法计算协方差矩阵的特征向量,特征值的结果就是一致的,只就是要注意 1、2、5 中的特征值要除以M,1 、2、6 中的特征向量要单位化。1、2、7 图片归一化图片标准化通常就是一个整体概念,要求把图片归一到均值为0,方差为 1 下情况下。这个概念类似于一般正态分布向标准正态分布的转化: 命题4 若 X N(,2 ) ,则 Z = X - N (0,1)所以要对一组图片中的一张X i 进行归一化 (标准化 ) , 只需要减去均值 , 除以方差就可以了。M均值mX = XiiM ,方差为D = E ?( X - mX )( X - mX ) ?精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 12 页 - - - - - - - - - - PCA人脸识别理论基础附源码1、3 参考文献1 邓楠 , 基于主成份分析的人脸识别, 西北大学硕士学位论文,2006、 06 2 R 、O、 Duda, P、E、 Hart, and D 、G、 Stork, Pattern Classification, seconded 、 John Wiley & Sons, 2001、3 Sami Romdhani 、Face Image Analysis using a Multiple Feature Fitting Strategy、 PhD Thesis, University of Basel, Switzerland, January 2005 、4 Sami Romdhani 、FACE RECOGNITION USING PRINCIPAL COMPONENTS ANAL YSIS、1、4 附录 matlab 源码1、4、1 人脸识别% FaceRec、 m % PCA 人脸识别修订版,识别率 88% calc xmean,sigma and its eigen decomposition allsamples=;% 所有训练图像for i=1:40 for j=1:5 a=imread(strcat(e:ORLs,num2str(i),num2str(j),、jpg); % imshow(a); b=a(1:112*92); % b 就是行矢量1N, 其中 N10304, 提取顺序就是先列后行, 即从上到下 ,从左到右b=double(b); allsamples=allsamples; b; % allsamples 就是一个M * N 矩阵 , allsamples 中每一行数据代表一张图片,其中 M200 end end samplemean=mean(allsamples); % 平均图片 ,1 N for i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean 就是一个M N 矩阵 ,xmean每一行保存的数据就是“每个图片数据-平均图片”end; % 获取特征值及特征向量sigma=xmean*xmean; % M * M 阶矩阵v d=eig(sigma); d1=diag(d); % 按特征值大小以降序排列dsort = flipud(d1); vsort = fliplr(v);精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 7 页,共 12 页 - - - - - - - - - - PCA人脸识别理论基础附源码%以下选择90%的能量dsum = sum(dsort); dsum_extract = 0; p = 0; while( dsum_extract/dsum 0 、9) p = p + 1; dsum_extract = sum(dsort(1:p);i=1;end% (训练阶段 )计算特征脸形成的坐标系base = xmean * vsort(:,1:p) * diag(dsort(1:p) 、 (-1/2); % base 就是 N p 阶矩阵 ,除以 dsort(i)(1/2) 就是对人脸图像的标准化(使其方差为1)% 详见基于PCA 的人脸识别算法研究p31% xmean * vsort(:,i)就是小矩阵的特征向量向大矩阵特征向量转换的过程%while (i0) % base(:,i) = dsort(i)(-1/2) * xmean * vsort(:,i); % base 就是N p 阶矩阵, 除 以dsort(i)(1/2)就是对人脸图像的标准化(使其方差为1)% 详见基于PCA 的人脸识别算法研究p31% i = i + 1; % xmean * vsort(:,i) 就是小矩阵的特征向量向大矩阵特 征向量转换的过程%end % 以下两行add by gongxun 将训练样本对坐标系上进行投影,得到一个M*p 阶矩阵allcoor allcoor = allsamples * base; % allcoor 里面就是每张训练人脸图片在M*p 子空间中的一个点, 即在子空间中的组合系数, accu = 0; % 下面的人脸识别过程中就就是利用这些组合系数来进行识别% 测试过程for i=1:40 for j=6:10 % 读入 40 x 5 副测试图像a=imread(strcat(e:ORLs,num2str(i),num2str(j),、jpg); b=a(1:10304); b=double(b); tcoor= b * base; % 计算坐标 ,就是 1p 阶矩阵for k=1:200 mdist(k)=norm(tcoor-allcoor(k,:);end; %三阶近邻dist,index2=sort(mdist); class1=floor( (index2(1)-1)/5 )+1; class2=floor(index2(2)-1)/5)+1; class3=floor(index2(3)-1)/5)+1;精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 8 页,共 12 页 - - - - - - - - - - PCA人脸识别理论基础附源码if class1=class2 & class2=class3 class=class1; elseif class1=class2 class=class1; elseif class2=class3 class=class2;end; if class=i accu=accu+1;end;end; end;accuracy=accu/200 %输出识别率1、4、2 特征人脸% eigface、m function = eigface() % calc xmean,sigma and its eigen decomposition allsamples=;% 所有训练图像for i=1:40 for j=1:5 a=imread(strcat(e:ORLs,num2str(i),num2str(j),、jpg); % imshow(a); b=a(1:112*92); % b 就是行矢量1N, 其中 N10304, 提取顺序就是先列后行, 即从上到下 ,从左到右b=double(b); allsamples=allsamples; b; % allsamples 就是一个M * N 矩阵 , allsamples 中每一行数据代表一张图片,其中 M200 end end samplemean=mean(allsamples); % 平均图片 ,1 N for i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean 就是一个M N 矩阵 ,xmean每一行保存的数据就是“每个图片数据-平均图片”end; % 获取特征值及特征向量sigma=xmean*xmean; % M * M 阶矩阵v d=eig(sigma); d1=diag(d);精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 9 页,共 12 页 - - - - - - - - - - PCA人脸识别理论基础附源码dsort = flipud(d1); vsort = fliplr(v); %以下选择90%的能量dsum = sum(dsort); dsum_extract = 0; p = 0; while( dsum_extract/dsum 0 、9) p = p + 1; dsum_extract = sum(dsort(1:p);end p = 199; % (训练阶段 )计算特征脸形成的坐标系%while (i0) % base(:,i) = dsort(i)(-1/2) * xmean * vsort(:,i); % base 就是N p 阶矩阵 ,除以dsort(i)(1/2) 就是对人脸图像的标准化,详见基于PCA 的人脸识别算法研究p31% i = i + 1; % xmean * vsort(:,i) 就是小矩阵的特征向量向大矩 阵特征向量转换的过程%end base = xmean * vsort(:,1:p) * diag(dsort(1:p) 、(-1/2); % 生成特征脸for (k=1:p), temp = reshape(base(:,k), 112,92); newpath = d:test int2str(k) 、jpg; imwrite(mat2gray(temp), newpath); end avg = reshape(samplemean, 112,92); imwrite(mat2gray(avg), d:testaverage 、jpg); % 将模型保存save(e:ORLmodel 、mat, base, samplemean); 1、4、3 人脸重建% Reconstruct、m function = reconstruct()精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 10 页,共 12 页 - - - - - - - - - - PCA人脸识别理论基础附源码% 计算新图片在特征子空间中的系数img = D:test210 、jpg a=imread(img); b=a(1:112*92); % b 就是行矢量1 N, 其 中 N10304, 提取顺序就是先列后行, 即 从上到下 , 从左到右b=double(b); b=b-samplemean; c = b * base; % c 就是图片a 在子空间中的系数, 就是 1*p 行矢量% 根据特征系数及特征脸重建图% 前 15 个t = 15; temp = base(:,1:t) * c(1:t); temp = temp + samplemean; imwrite(mat2gray(reshape(temp, 112,92),d:test2t1 、jpg); % 前 50 个t = 50; temp = base(:,1:t) * c(1:t); temp = temp + samplemean; imwrite(mat2gray(reshape(temp, 112,92),d:test2t2 、jpg); % 前 100 个t = 100; temp = base(:,1:t) * c(1:t); temp = temp + samplemean; imwrite(mat2gray(reshape(temp, 112,92),d:test2t3 、jpg); % 前 150 个t = 150; temp = base(:,1:t) * c(1:t); temp = temp + samplemean; imwrite(mat2gray(reshape(temp, 112,92),d:test2t4 、jpg); % 前 199 个t = 199; temp = base(:,1:t) * c(1:t); temp = temp + samplemean; imwrite(mat2gray(reshape(temp, 112,92),d:test2t5 、jpg);精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 11 页,共 12 页 - - - - - - - - - - PCA人脸识别理论基础附源码精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 12 页,共 12 页 - - - - - - - - - -