K-L变换在人脸识别中的应用
K-L变换在人脸识别中的应用
控制理论与控制工程 杨宪强 学号:2008011629
摘要
主成分分析(PCA)是自动人脸识别的常用方法,其基本原理就是用较少数量的特征对样本进行描述以达到降低特征空间维数的方法,方法的基础是Karhunen-Loeve展开式简称K-L展开式。文中介绍了K-L变换的基本原理,及其应用该方法进行人脸识别的基本步骤,最后给出基于总体散布矩阵和类间散布矩阵做为产生矩阵的K-L变换进行人脸识别的matlab程序,并对识别率进行了统计。
K-L变换的基本原理
特征脸方法是基于K-L变换的人脸识别方法,K-L变换是图像压缩的一种最优正交变换。高维的图像空间经过K-L变换后得到一组新的正交基,保留其中重要的正交基,由这些基可以张成低维线性空间。如果假设人脸在这些低维线性空间的投影具有可分性,就可以将这些投影用作识别的特征矢量,这就是特征脸方法用于人脸识别的基本思想。在人脸识别中,可以用离散K-L变换对人脸图像的原始空间进行转换,即构造人脸图像数据集的协方差矩阵,对之进行正交变换,求出协方差矩阵的特征向量,再依据特征值的大小对这些特征向量进行排序,每一个向量表示人脸图像中一个不同数量的变量,这些特征向量表示特征的一个集合,它们共同表示一个人脸图像。在人脸识别领域,人们常称这些特征向量为特征脸。每一个体人脸图像都可以确切地表示为一组特征脸的线性组合。这样我们首先通过有指导的训练(给定训练样本集已知分类)得到样本集在特征脸空间中的坐标。训练完成后,输入待辨识图像,求得在特征脸空间的坐标,采用最近邻法,就可以实现人脸识别。
2.K-L变换进行人脸识别的基本步骤
2.1 训练过程
1.给定样本集,在这里样本集的大小为360,一共是40人,每人9张图片。我选取每人5张图片一共200张作为训练集,训练集的大小是可选的,它的大小将直接影响到识别的正确率,在后面我对采用不同大小的训练集进行识别的正确率进行了统计。
2.确定采用何种产生矩阵,有总体散布矩阵()和类间散布矩阵(),后面的例子程序中分别采用了这两种产生矩阵,并进行了识别正确率的比较。
3.根据产生矩阵计算出特征脸,这里要用到奇异值分解,其基本原理就是通过计算较低维数矩阵的特征值与特征向量而间接求出较高维数矩阵的特征向量(特征脸),从而达到简化计算的目的。
4.分别求得训练集中各图像在特征脸空间中的坐标。
2.2 识别过程
首先求得待辨识图像相对于训练集平均脸的差值图像,然后求得该图像在特征脸空间中的坐标,最后采用最近邻法对图像进行归类。
3. K-L变换进行人脸识别的程序及结论
3.1 加载原始图片集数据
由于我用的原始图片集数据是.pgm格式的,直接采用matlab中的load指令是无法实现数据加载的,因此需要编写特定的程序将数据加载到工作空间。
程序如下:
clc
clear all
zhongjian=[];%初始化一个中间变量
for i=1:40
for j=1:9 %一共有40人的人脸图片,每人读取9张
image=[]; %初始化变量
strname=strcat('D:\ORL\s',num2str(i),'\',num2str(j),'.pgm');%生成图片文件的路径
fid=fopen(strname,'r'); %打开文件
if fid==-1
error(['can not find file',strname]);
break;
break;
end %当fid==-1时,没有找到指定路径的文件
[imgsize, num]=fscanf(fid, 'P5\n%d\n%d\n255\n');%在.pgm文件中查找imgsize变量,它们标定
%数据的维数
if num~=2
error('error num');
end %当num~=2时,读出的数是错误的
for h=1:imgsize(2)
image=[image fread(fid,imgsize(1),'uint8')];
end %读取由imgsize变量标定的维数的数据
zhongjian=image';%求转置
fclose(fid); %关闭文件
[row clo]=size(zhongjian);
face(:,9*(i-1)+j)=reshape(zhongjian,row*clo,1);%将读出来的图像数据拉长为一个列,存放在%face变量中
end
end
3.2 以类间散布矩阵为产生矩阵的K-L变换进行人脸识别
Total=40; %定义变量,标定了待识别的人数
X=zeros(row*clo,Total);%初始化变量X,训练样本中元素由每个人的平均图像向量组成
for i=1:Total
Yangben=face(:,9*(i-1)+1: 9*(i-1)+3);%把样本集face中的每个人的前三张图片组成训练集
X(:,i)=mean(Yangben,2);%求得每个人的平均图像向量
end
meanvetor=mean(X,2);%求得总体的平均图像向量
for i=1:Total
X(:,i)=X(:,i)-meanvetor;%求得训练集,由每个人平均图像向量减去总体平均图像向量得到
end
pmetrix=X'*X; %求X'*X,应用的原理是奇异值分解的推论
[vet vetvalue]=eig(pmetrix);%求特征值和特征向量
vet=fliplr(vet);
vetvalue=fliplr(vetvalue);%对特征值由大到小排列,相应的特征向量也进行变换
U=X*vet;
U=orth(U);%应用奇异值分解的推论得到正交化的特征脸
Cvetvalue=sum(vetvalue);
Ctotal=sum(Cvetvalue,2);
for i=1:Total
parttotal=sum(Cvetvalue(1:i),2);
ratio=parttotal/Ctotal;
if ratio>0.99
break;
end
end %选择最大的前n个特征值,由这些值的和在总特征值中占得比例大于99%
A= U(:,1:i)';%选择前n个特征值对应的特征向量组成特征脸
y= A*X;%求训练集中各图像在特征脸空间中的坐标
bianshi=zeros(6,Total);
for i=1:Total
for j=4:9 %每个人图像的前三张作为训练集,则后6张就做为待识别的图像
ceshi=face(:,(i-1)*9+j)-meanvetor;%待识别图像减去总体平均图像向量
zbceshi=A*ceshi; %求得其在特征脸空间的坐标
for k=1:Total
wucha=zbceshi-y(:,k);
wuchametrix(:,k)=wucha'*wucha;
end %计算该坐标与训练集中各图像坐标之间的距离
[h,I]=min(wuchametrix); %最近邻法进行人脸识别
if I==i
bianshi(j-3,i)=1;
else
bianshi(j-3,i)=0;
end %统计每个待辨识图像是否成功识别,成功为1,失败为0
end
end
gg=sum(bianshi);
gg=sum(gg,2);
chenggongratio=gg/(6*Total) %用识别正确的图像个数除以总图像个数得到识别正确率
3.2 以总体散布矩阵为产生矩阵的K-L变换进行人脸识别
Total=40;
Shumu=5;
X=zeros(row*clo,Total*Shumu);%初始化训练集,其元素由每个人各Shumu张图像组成
for i=1:Total
X(:,Shumu*(i-1)+1: Shumu*i)=face(:,9*(i-1)+1: 9*(i-1)+Shumu);
end %为训练集赋初值,取每个人的头shumu张图像组成训练集
meanvetor=mean(X,2); %求得总体平均图像向量
for i=1:Total*Shumu
X(:,i)=X(:,i)-meanvetor;
end %各图像减去总体平均图像向量得到差值图像向量
pmetrix=X'*X;
[vet vetvalue]=eig(pmetrix);
vet=fliplr(vet);
vetvalue=fliplr(vetvalue);
U=X*vet;
U=orth(U); %得到初始特征脸
Cvetvalue=sum(vetvalue);
Ctotal=sum(Cvetvalue,2);
for i=1:Total*Shumu
parttotal=sum(Cvetvalue(1:i),2);
ratio=parttotal/Ctotal;
if ratio>0.99
break;
end
end %选择取值最大的前99%的特征值,进一步降低维数
A= U(:,1:i)';%由选取的特征值得到对应的特征向量组成特征脸
y= A*X; %求得训练集中各图像在特征脸空间中的坐标
bianshi=zeros(4,Total);
for i=1:Total
for j=6:9 %样本集
ceshi=face(:,(i-1)*9+j)-meanvetor;
zbceshi=A*ceshi;
for k=1:Total*Shumu
wucha=zbceshi-y(:,k);
wuchametrix(:,k)=wucha'*wucha;
end
[h,I]=min(wuchametrix); %最近邻法进行图像识别
B= ceil(I/Shumu);
if B==i
bianshi(j-5,i)=1;
else
bianshi(j-5,i)=0;
end %识别正确为1,错误为0
end
end
gg=sum(bianshi);
gg=sum(gg,2);
chenggongratio=gg/(4*Total) %统计识别正确率
3.4 识别率统计
表3.1 以类间散布矩阵为产生矩阵的K-L变换进行人脸识别正确率
表3.2 以总体散布矩阵为产生矩阵的K-L变换进行人脸识别正确率
图3.1 基于两种产生矩阵的识别正确率统计
4. 结论
通过对分别采用类间散布矩阵和总体散布矩阵为产生矩阵的K-L变换进行人脸识别的正确率的统计可以看出,应用总体散布矩阵作为产生矩阵的K-L变换进行人脸识别的正确率明显要高。我想主要是因为类间散布矩阵采用每个人的平均图像向量组成训练集,来生成特征脸空间,计算量较之采用总体散布矩阵作为产生矩阵的K-L变换计算量又进一步减少,但是它忽略了每个人的图像的多样性,造成识别率低。以总体散布矩阵作为产生矩阵的K-L变换进行人脸识别的计算量较之采用类间散布矩阵作为产生矩阵的K-L变换要大一些,但是它充分考虑了每个人图像的多样性,使得识别率相对较高。
K-L变换在人脸识别中的应用.doc