计算一张图片X在特征空间上的投影系数(也可以理解为X在空间U中的坐标):
3.识别
Y=UT*X∈ℜr*1
(2)
利用公式
(2),首先把所有训练图片进行投影,然后对于测试图片也进行同样的投影,采用判别函数对投影系数进行识别。
1.2PCA的理论基础
1.2.1投影[2]
设d维样本x1,x2,",xn,以及一个d维基w,那么标量:
ii
y=wTx
是相当于xi在基上的坐标值。
如果w
=1,yi就是把xi向方向为w的直线进行投影的结果,
可以从图1看到。
推广之,如果有一组基(m个)组成的空间W=[w1,w2,",wm],那么可
Tm*1
以得到xi在空间W上的坐标为:
Y=Wx∈ℜ。
x证明:
wTx=
w
又∵
θy
w⋅x⋅cosθ
x⋅cosθ=y,w=1
i
⇒wTx=y
图1投影图
进一步,表达式w=m+ae表示w是一条通过点m,方向为e的直线。
1.2.2PCA的作用及其统计特性[3]
采用PCA对原始数据的处理,通常有三个方面的作用—降维、相关性去除、概率估计。
下面分别进行介绍:
ƒ去除原始数据相关性
从统计学上讲,E{[X−E(X)][Y−E(Y)]}称为随机变量X与Y协方差,记为
Cov(X,Y)。
令ρXY=
Cov(X,Y)
,称为随机变量X与Y的相关系数。
ρXY=1则X与
D(X)
D(Y)
Y是相关的,ρXY=0,则X与Y是不相关的。
AAT
命题1对于矩阵A来说,如果
是一个对角阵,那么A中的向量是非相关的。
由PCA处理的人脸库数据的非相关性可以从两点进行说明。
(1)基底的非相关性
T
特征空间基U=[u0,u1,",ur−1]是非相关的,即UU
=I。
(2)投影系数的非相关性
T
由SVD可知A={φ1,φ2,...,φM}=UΛV
其中φi=xi−mx,mx是平均人脸。
根
据公式
(2)可以把A映射到特征空间上,得到:
关的,可由下面得到证明:
B=UT*A,其中B是非相
Y的协方差矩阵为:
C
=1BBT=
1UTAATU=
1Λ2
(3)
BMMM
由命题1可知,B是非相关的。
ƒ统计参数(均值及方差)
均值即mx--平均人脸。
命题2随机变量方差越大,包含的信息越多,当一个变量方差为0时,该变量为常数,不含任何信息。
用PCA计算主分量,就是寻找一组向量,使得原始数据A={φ1,φ2,...,φM}在这组向量上的投影值的方差尽可能大。
最大方差对应的向量就是第一主成份,以后递推就是
第二主成份,第三主成份……。
用PCA计算主分量就是求原始数据A={φ1,φ2,...,φM}(其中φi=xi−mx)协方差
T
矩阵的特征向量U=[u0,u1,",ur−1],由公式(3)可知,P=ui
A=(p1,p2,",pm)是A在ui
上的投影值,其中P的方差就是ui对应的特征值λi,可以理解为:
命题3所有原始数据在主分量ui上的投影值方差为λi。
ƒ降维
如果在原始空间表示一幅n*m大小的图片X,那么需要一个N=n*m维矢量,但是当用公式
(2)把它映射到特征空间后,只需要一个r*1维的向量就可。
另外,由命题2可知,可以根据方差的大小来判断特征向量的重要性。
由ORL图片库的200个人脸计算得到的特征值呈图2分布,可知特征向量重要性呈指数下降,据此可以只选用前面几个重要的特征向量来构建特征空间。
通过计算,前71个特征值占了90.17%,因此r可以取71而非200,从而达到进一步降维的作用。
图2特征值的分布
1.2.3特征脸
U=[u0,u1,",ur−1]中的每一个单位向量都构成一个特征脸,如图3所示。
由这些特征脸
所张成的空间称为特征脸子空间,需要注意对于正交基的选择的不同考虑,对应较大特征值的特征向量(正交基)也称主分量,用于表示人脸的大体形状,而对应于较小特征值的特征向量则用于描述人脸的具体细节,或者从频域来看,
主分量表示了人脸的低频部分,而此分量则描述了人脸的高频部分(源码见’EigenFace.m’)。
12105070average
图3特征脸,分别是第1,2,10,50,70分量,最后一张是平均脸。
1.2.4图片重建
X
要进行图片X的重建,首先对X投影到特征空间上,得到系数Y=UT(X−m
),然后选用一
部分系数与特征向量进行原始图片的重建:
X'=mX+U(1:
t)*Y(1:
t),其中1:
t表示取前t个
元素。
(见’reconstruct.m’)
在图4中,其中前两张图片来自训练样本,第3张来自测试样本,可以看到对于训练样本,
PCA系数可以对图片实现很好重建,而对于训练样本以外的图片重建效果很差。
Original
1550100150199
图4人脸图像重建。
第列张图片是输入原始图,其它列图片是重建结果,数字表示t的数目。
1.2.5奇异值分解(SVD)[1]
设A是秩为r的m*n(m>>n)维矩阵,则存在两个正交矩阵和一个对角阵:
T
A=[a1,a2,",ar]=UΛV
T
其中U=[u0,u1,",ur−1],V=[v0,v1,",vr−1],Λ=diag(λ0,λ1,",λr−1),且UU
=I,VVT
=I,
2Tm*mT
n*nTT
λi呈降序排列。
其中λi
为AA
∈ℜ和AA∈ℜ的非零特征值,ui和vi分别是AA和AA
i
对应于λ2的特征向量。
可得一个推论:
U=AVΛ−1
可以计算ATA的特征值λ2及相应的正交归一特征向量v后,可由推论知AAT的正交归一特
ii
征向量
u=1
i
i
Avi
注意,协方差矩阵CA
=(AiAT)/M的特征值为:
λ2/M。
1.2.6利用小矩阵计算大矩阵特征向量
高阶矩阵的特征向量可以转化为求低阶矩阵的特征向量:
设:
A是秩为r的m*n(m>>n)维矩阵,CX
=AAT∈ℜm*m,是一个矩阵,现在要求C的
X
特征值及特征向量,可通过先求小矩阵ATA∈ℜn*n的特征向量[v,v,",v
]和特征值
01r−1
[λ0,λ1,",λr−1],两者之间有以下关系:
iii
ATA⋅v=λ⋅v
iii
⎯左⎯乘⎯A→AAT(A⋅v)=λ(A⋅v)
显然,C
=AAT的特征向量是A⋅v(注意没有单位化),[λ,λ,",λ
]亦为其特征值。
Xi01
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)
σ
所以要对一组图片中的一张Xi进行归一化(标准化),只需要减去均值,除以方差就可以了。
M
均值mX=∑Xi
i
M,方差为D=E⎡⎣(X−m
X)(X−mX)⎤⎦
1.3参考文献
[1]邓楠,基于主成份分析的人脸识别,西北大学硕士学位论文,2006.06
[2]R.O.Duda,P.E.Hart,andD.G.Stork,PatternClassification,seconded.JohnWiley&Sons,
2001.
[3]SamiRomdhani.FaceImageAnalysisusingaMultipleFeatureFittingStrategy.PhDThesis,UniversityofBasel,Switzerland,January2005.
[4]SamiRomdhani.FACERECOGNITIONUSINGPRINCIPALCOMPONENTSANALYSIS.
1.4附录—matlab源码
1.4.1人脸识别
%FaceRec.m
%PCA人脸识别修订版,识别率88%
%calcxmean,sigmaanditseigendecompositionallsamples=[];%所有训练图像
fori=1:
40
forj=1:
5a=imread(strcat('e:
\ORL\s',num2str(i),'\',num2str(j),'.jpg'));
%imshow(a);
b=a(1:
112*92);%b是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右
b=double(b);
allsamples=[allsamples;b];%allsamples是一个M*N矩阵,allsamples中每一行数据代表一张图片,其中M=200
endend
samplemean=mean(allsamples);%平均图片,1×N
fori=1:
200xmean(i,:
)=allsamples(i,:
)-samplemean;%xmean是一个M×N矩阵,xmean
每一行保存的数据是“每个图片数据-平均图片”
end;
%获取特征值及特征向量sigma=xmean*xmean';%M*M阶矩阵[vd]=eig(sigma);
d1=diag(d);
%按特征值大小以降序排列
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));
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(i<=p&&dsort(i)>0)
%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
%以下两行addbygongxun将训练样本对坐标系上进行投影,得到一个M*p阶矩阵allcoorallcoor=allsamples*base;%allcoor里面是每张训练人脸图片在M*p子空间中的一个点,即在子空间中的组合系数,
accu=0;%下面的人脸识别过程中就是利用这些组合系数来进行识别
%测试过程
fori=1:
40
forj=6:
10%读入40x5副测试图像a=imread(strcat('e:
\ORL\s',num2str(i),'\',num2str(j),'.jpg'));b=a(1:
10304);
b=double(b);
tcoor=b*base;%计算坐标,是1×p阶矩阵
fork=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;
ifclass1~=class2&&class2~=class3class=class1;
elseifclass1==class2class=class1;
elseifclass2==class3
class=class2;
end;
ifclass==iaccu=accu+1;
end;
end;
end;
accuracy=accu/200%输出识别率
1.4.2特征人脸
%eigface.m
function[]=eigface()
%calcxmean,sigmaanditseigendecompositionallsamples=[];%所有训练图像
fori=1:
40
forj=1:
5a=imread(strcat('e:
\ORL\s',num2str(i),'\',num2str(j),'.jpg'));
%imshow(a);
b=a(1:
112*92);%b是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右
b=double(b);
allsamples=[allsamples;b];%allsamples是一个M*N矩阵,allsamples中每一行数据代表一张图片,其中M=200
endend
samplemean=mean(allsamples);%平均图片,1×N
fori=1:
200xmean(i,:
)=allsamples(i,:
)-samplemean;%xmean是一个M×N矩阵,xmean
每一行保存的数据是“每个图片数据-平均图片”
end;
%获取特征值及特征向量sigma=xmean*xmean';%M*M阶矩阵[vd]=eig(sigma);
d1=diag(d);
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));
endp=199;
%(训练阶段)计算特征脸形成的坐标系
%while(i<=p&&dsort(i)>0)
%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:
\test\average.jpg');
%将模型保存
save('e:
\ORL\model.mat','base','samplemean');
1.4.3人脸重建
%Reconstruct.m
function[]=reconstruct()
%计算新图片在特征子空间中的系数
img='D:
\test2\10.jpg'a=imread(img);
b=a(1:
112*92);%b是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右
b=double(b);
b=b-samplemean;
c=b*base;%c是图片a在子空