人脸识别系统
姓名:许倩文
学号:2009302332
班级:09030902
摘要:本文分别通过PCA,LDA,NWF等方法对脸识别特征提取进行了改进,并将人脸识别效果做了对比。
一 引言
人脸识别技术是近年来随着图像处理技术、计算机技术、模式识别技术等的快速进步而出现的一种崭新生物特征识别技术。相对于指纹、虹膜等其他生物特征识别技术,人脸识别具有直接、友好、方便的特点,尤其是对于个人来说,几乎无任何心理障碍,因此在商业,司法,监控和视频检索等众多领域有着广泛的应用南京。在“9.11”事件以后,各国都投入大量力物力研究并发展各类识别技术,使得人脸识别技术受到了前所未有的重视。
人脸识别是图像识别的一个重要分支,其基本结构如图所示。为了保证人脸位置的一致性,在一定程度上克服背景、头发等冗余信息的干扰,首先要对人脸库中的图像进行一些预处理操作。紧接着,进行特征抽取,将得到的人脸特征和训练样本特征进行比对,根据相似程度的高低决定最后的识别结果。
目标图像
特征库
训练
图像采集 预处理 特征提取
测试 特征匹配 识别结果
二 人脸图像的预处理
为了保证所有的人脸在图像中的大小、位置和偏斜的不变性,需要去除头发、脖子、肩膀及图像背景等与人脸无关的部分。在特征提取前必须对人脸图像进行几何归一化处理。由于两眼之间的距离对于大多数人来说都是基本相同的,因此,采用两只眼睛的位置作为人脸图像几何归一化的依据。
EE假设人脸图像中两只眼睛的位置分别是和, 通过下面步骤12
可以实现人脸图像的几何归一化。
具体包括:
EE1、图像旋转:以使和的连线保持水平。这保证了人脸方向12
上的一致性,体现了人脸在图像平面内的旋转不变性。
2、图像裁剪:根据如图所示的比例关系,进行图像剪裁。该图
EEEE中点O为的中点,且设d=。经过裁剪,这样在2d*2d的图1212
像内,保证点O固定于(0.5d,d)处。这保证了人脸位置的一致性,体现了人脸在图像平面内的评议不变性。
3、尺度变换:进行图像缩放变换,得到统一大小的
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
图像。
EE统一规定图像的大小是32*32像素点,即使d=为定长(16个像12
,素),则缩放倍数=2d/32。这保证了人脸图像大小的一致性,体现了人脸在图像平面内尺度不变性。
图1
经过归一化后的图像如下:
代码:preorl.m
三 人脸图像特征提取
经过预处理之后,ORL人脸库中图像的维数依然很高。在这样的高维空间中,人脸图像的分布很不紧凑,因而不利于分类,且计算复杂度也非常大。因此,必须通过有效的手段对图像进行降维,即特征提取。子空间
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
法是广泛应用于人脸识别的一种特征提取算法,具有计算代价小,描述能力强、可分性好等特点。它的基本思想就是根据一定的性能目标来寻找一个线性或非线性的子空间,把原始图像压缩到一个低维子空间内,使数据在子空间内的分布更加紧凑,更好地提取出数据中所蕴涵的特征信息。利用子空间分析法进行人脸图像特征提取一般有一下两个步骤:
, 对训练样本进行学习,得到由基向量构成的子空间,,并将训
练样本向子空间做投影,得到的投影系数预先存储在样本特
征库里。
, 将待识别的样本向子空间做投影,得到待识别的样本的特征。
主向量分析(Principal Component Analysis, PCA)、线性判别分析(Linear Discriminant Analysis, LD)和非负矩阵分解(Non-negative
Matrix Factorization, NWF)是3中常用的子空间分析法。在ORL人脸库中随机选取每人的1、2、3、4、5幅作为训练,剩余的作为测试,分别利用PCA、LDA和NWF算法进行特征提取。
1 主成分分析法(PCA)
PCA算法的理论基础依据是K-L变换,通过一定的性能目标寻找线性变换W,实现对高维数据的降维。
nmx},Rx已知存在n个训练样本{,其中=(1,2,…,n)是一个维列,1iii
向量,是由一幅人脸图像的非负灰度值所组成的,变换矩阵W可以通过最大化如下目标函数来得到:
TWMax(SW)
式中:S为样本的协方差矩阵,其定义如下:
n11TT S,(x,x)(x,x),XX,iinn,1i
n1x,x,...,x,x式中:, X=[]。 x,x1n,in,1i
,将S的特征值按照降序排列,选择前m(mn)个非零特征值所对
,,,,...,,应的特征向量作为基向量来形成变换矩阵,即W=[]。对于12m人脸识别问题,基向量也被称为本征向量(Eigenface)。变换矩阵W也叫做本征空间(Eigenspace),将任意一幅图像x向变换矩阵W做投影,即可得到她的,,,特征:
Ty,W(x,x) (,,,,,,(((,,) jj
当每人的训练样本数目是,时,令,,,,,应用,,,算法得到的,,个本征脸构成了,,,子空间,。
代码:,:,,,
,(线性判别分析法(,,,)
与,,,寻求样本数据的最优重建不同,,,,以提高样本在子空间中的可分性为目标。寻找一组基向量,在这些基向量张成的子空间中,不同类别的训练样本能有最小的类内离散度,最大的类间离散
mx,Rx度。假设,幅人脸图像构成训练样本,,,,,,,,,(((,,,ii
SS分别属于,个不同的类别,定义类间离散度矩阵和类内离散度bw为:
CTS, (,,,)(,,,)b,ii,1i
nCi,iiiTS, (x,,)(x,,)w,,jiji1ij,
ix,式中: 为第,个类别中的第,个样本;为第i个类别的均值向ji
,n量;有样本的均值;为第i类样本的本数。 i
子空间W可以通过最小化Fisher准则来求取,即:
TWSWbJW (),argmaxtWSWw
S可以证明,当非奇异时,最优投影矩阵W的列向量恰为下列w
,广义特征方程的d(dC-1)个最大的特征值所对应的特征向量,即:
S,,,S, biwi
将训练样本向LDA子空间W做投影,即:
Ty,Wx ii
y低维向量即样本的LDA特征。 i
在人脸识别中,训练图像的数目相对于图像的维数来说是很小的,因此类内离散度矩阵总是奇异的,这将导致LDA算法失效。为解决这个问题,在应用LDA算法之前,必须要先用PCA给图像降维。
当每人的训练样本数是5时,令d=25,对ORL人脸库中的训练图集利用LDA算法进行运算,得到由25个基向量构成的LDA子空间W。
程序:LDA.m
3 (基于非负矩阵分解(,,,)的人脸特征提取算法
由于,,,和,,,基向量的像素点可以是正值也可以是负值,所以这两种方法都缺少直观意义上的由部分合成整体的效果。,,,的基本 是找到一个线性子空间,,使得构成子空间的基图像的像素点都是正值,而且人脸图像在子空间上的投影系数也是正值。
n{x}x对于由,幅人脸图像构成的训练样本,,(是一个,维,ii1i列向量,是由一幅人脸图像的非负灰度值所构成),,,,将其分解为一个非负,,,维的矩阵,和一个非负,,,维的矩阵,和一个非负的,,,维矩阵,的乘积:
V,WH
对于非负矩阵分解问题,常用的目标函数如下式:
vij minD(VWH),(vlog,v,y),ijijijW,Hyi,jij
其中,,和,都满足一下关系:
b,1W,H,0 ,iji
对于上述优化问题,可采用交替梯度投影法,得到迭代公式如下:
,1/2ik h,(hv),klilkl,hi,ikklk
hij,v,klkj,hj,klljk, ,klh,ljj
,kl, ,kl,,jlj
由此可以得到由r个基向量构成的子空间W=[w1,w2,„wr]。训练样
x本向子空间W做投影,即: i
Ty,Wx ii
yx低维向量即样本的NMF特征。 ii
四 分类过程
xxjiyy采用最邻近分类。任意两个图像和的特征向量和之间ij的距离定义为他们的欧式距离:
2d(y,y),y,y ijij
xy将待识别图像向子空间做投影,得到其分类特征,如果newnew
xnewd(y,y),mind(y,y)x,并且属于第k类,则分类结果也属于newlnewjl
第k类。
代码:;,,,,,,(,
五 识别结果
对ORL人脸库中的训练集分别应用,,,、,,,算法进行识别测试,并与,,,算法进行对比,识别结果如下表,当每人的训练样本数目是,时,特征向量维数和个算法识别率之间的关系如下图所
示。
维数与识别率之间关系曲线(注:x轴每
个刻度代表五维)
PCA1
LDA0.96
0.92NMF0.88
0.84
0.8
12345678
随着训练样本的增多,,,,和,,,及,,,三种算法的识别率都有所增加,这说明训练样本数目越多,学习的越充分,识别率也就越高。随着维数的增加,识别率也相应增加。而且,,,,算法识别效果明显优于其他两种算法。
附:源代码
function imglist = procORL( list ,savapath)
%UNTITLED3 Summary of this function goes here
% Detailed explanation goes here
nfiles = length(list); %人脸图像数目
%I = imread(list(1).direct); images = zeros(112,92,nfiles); %orl库112*92的人脸图 %%用鼠标标出人眼的位置
for i=1:nfiles
images(:,:,i) = imread(list(i).direct);
clf;
imagesc(images(:,:,i));
%imagesc(I);
%imshow(I);
colormap(gray);
hold on;
[x1 y1] = ginput(1);
plot(x1,y1,'rx');
drawnow;
[x2 y2] = ginput(1);
plot(x2,y2,'rx');
eyelocs(i,:) = [x1 y1 x2 y2];
hold off;
pause;
end
%%1) 人脸图像旋转
eyedist =
sqrt((eyelocs(:,1)-eyelocs(:,3)).^2+(eyelocs(:,2)-eyelocs(:
,4)).^2);%计算两眼睛的距离ErEl
dx = eyelocs(:,3)-eyelocs(:,1);%计算两眼睛的水平距离 dy = eyelocs(:,4)-eyelocs(:,2);%计算两眼睛的垂直距离 rotation = atan(dy./dx)*180/pi;%计算旋转角度 %计算ErEl的中点坐标
eyex = round((eyelocs(:,1)+eyelocs(:,3))/2);
eyey = round((eyelocs(:,2)+eyelocs(:,4))/2);
%close all;
for i=1:nfiles
imset(:,:,i) =
imrotate(images(:,:,i),rotation(i),'bilinear','crop'); %旋转人脸
%images(:,:,i) =
imrotate(images(:,:,i),rotation(i),'bilinear','crop');
d = round(eyedist(i));
[h,w] = size(imset(:,:,i));
leftpad = eyex(i)-d;
%下面的if防止剪裁时超出图像边界
if leftpad<1
leftpad = 1;
end
toppad = eyey(i) - round(0.5*d);
if toppad<1
toppad = 1;
end
rigthpad = eyex(i) + d;
if rigthpad>w
rigthpad = w;
end
bottompad = eyey(i) + round(1.5*d);
if bottompad>h
bottompad = h;
end
I1 =[];
I2 =[];
I1(:,:) = imset(toppad:bottompad,leftpad:rigthpad,i); %2)
人脸图像剪裁
I2(:,:) = imresize(I1,[32 32]); %3) 图像尺度变换为
32*32统一大小的图像
ds = '';
ds = [savapath '\' list(i).folder];
if (~exist(ds,'dir'))
mkdir(ds);
end
pos = strfind(list(i).name,'.');
name = list(i).name(1:pos-1);
imwrite(uint8(I2),[savapath '\' list(i).folder '\' name
'.jpg'],'jpg');%保存归一化的人脸图像
%imwrite(I,[savapath '\' list(i).folder '\'
list(i).name]);
end
imglist = images;
end
,,,(,
function [eigvector,eigvalue,Y]=LDA(X,gnd)
%X 数据矩阵,每一行代表一个数据点
%gnd 数据矩阵,每一列代表一个数据点的类别
old_X=X;
[nSmp,nFea]=size(X);
classLabel = unique(gnd); nClass= length(classLabel); bPCA=0;
if nFea>(nSmp-nClass)
PCAoptions=[];
PCAoptions.ReducedDim=nSmp - nClass;
[eigvector_PCA,eigvalue_PCA,meanData,new_X]=PCA(X,PCAoption
s);
X=new_X;
[nSmp,nFea]=size(X);
bPCA=1;
end
sampleMean=mean(X);
MMM=zeros(nFea,nFea);
for i=1:nClass,
index = find(gnd == classLabel(i));
classMean = mean(X(index,:));
MMM = MMM + length(index) * classMean' * classMean;
end
W=X'* X-MMM;
B=MMM-nSmp*sampleMean'*sampleMean; W=(W+W')/2;
B=(B+B')/2;
option=struct('disp',0);
[eigvector,eigvalue]=eigs(B,W,nClass-1,'la',option);
eigvalue= diag(eigvalue);
for i=1:size(eigvector,2)
eigvector(:,i)=eigvector(:,i)./norm(eigvector(:,i));
end
if bPCA
eigvector = eigvector_p\PCA*eigvector; end
if nargout ==3
Y=old_X*eigvector;
end
;,,,,,,(,
function classification =classif(Ytrain , Ytest) % Ytrain;训练样本的特征
% Ytest: 测试样本的特征
% 已知训练样本特征和测试样本特征,函数返回一个分类结果
calssification
distances = dist(Ytrain, Ytest); classification = zeros(size(Ytest,2),1); for a=1:size(Ytest,2),
aux=find(distances(:,a)==min(distances(:,a)));
classification(a)=aux(1);
end
%imglist = procORL( list ,savapath) %imglist =
procORL( list ,C:\Users\xuweiqian\Documents\MATLAB)
datta=[];%所有训练图像
for i=1:40
for j=1:5
a=imread(strcat('C:\Users\xuweiqian\Documents\MATLAB\orl\s'
,num2str(i),'\',num2str(j),'.pgm'));
% imshow(a);
b=a(1:112*92); % b是行矢量 1×N,其中N,10304,提取顺
序是先列后行,即从上到下,从左到右
b=double(b);
datta=[datta; b]; % allsamples 是一个M * N 矩阵,
allsamples 中每一行数据代表一张图片,其中M,200
end
end;
gnd=[];
%gnd=[1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 .....]
k = 0;
for i=1:40
for j=1:5
k=5*(i-1)+j;
gnd(k)=i;
end
end
options=struct('ReducedDim',40,'PCARatio',0.9); PCAoptions=struct('ReducedDim',40,'PCARatio',0.9); [eigvector,eigvalue,meanDate,new_date]=PCA(datta,options); save new-data;
[eigvector,eigvalue,Y]=LDA(new_date,gnd); save Y eigvector eigvalue;