实验一 基于matlab的人脸识别技术
一、 实验目的
1.熟悉人脸识别的一般流程与常见识别方法; 2.熟悉不同的特征提取方法在人脸识别的应用;
3.了解在实际的人脸识别中,学习样本数等参数对识别率的影响; 4.了解非人脸学习样本库的构建在人脸识别的重要作用。
使用MATLAB平台编程,采用K-L变换、特征提取及图像处理技术,实现人脸识别
二、实验内容与实验仪器、设备
1.构建非人脸学习样本库;
2.观测不同的特征提取方法对人脸识别率的影响; 3.观测不同的学习样本数对人脸识别率的影响; 1. PC机-系统最低配置 512M 内存、P4 CPU;
2. Matlab 仿真软件 - 7.0 / 7.1 / 2006a 等版本的Matlab 软件。 3. CBCL人脸样本库
三、实验原理
1.人脸特征提取的算法
通过判别图像中所有可能区域是否属于“人脸模式”的方法来实现人脸检测。这类方法有:特征脸法、人工神经网络法、支持向量机法;积分图像法。
本次使用的是PCA(主成分分析法)其原理是:利用K-L变换抽取人脸的主要成分,构成特征脸空间,识别时将测试图像投影到此空间,得到一组投影系数,通过与各个人脸图像比较进行识别。
对于一幅M*N的人脸图像,将其每列相连构成一个大小为D=M*N维的列向量。D就是人脸图像的维数,即是图像空间的维数。设n是训练样本的数目;Xj表示第j幅人脸图像形成的人脸向量,则所需样本的协方差矩阵为:
S??(xi?u)(xi?u)Ti?1m (1)
其中U为训练样本的平均图像向量:
1mu??xini?1 (2)
令A=[x1-u,x2-u,...xn-u],则有Sr=AAT,其维数为D×D。根据K-L变换原理,需要求得的新坐标系由矩阵AAT的非零特征值所对应的特征向量组成。直接计算的计算量比较大,所以采用奇异值分解(SVD)定理,通过求解ATA的特征值和特征向量来获得AAT的特征值和特征向量。
依据SVD定理,令li(i=1,2,?,r)为矩阵ATA的r个非零特征值,vi为ATA对应于li的特征向量,则AAT的正交归一特征向量Ui为:
ui?1Avi(i?1,2,...r)li (3)
则“特征脸”空间为:w=(U1,U2,...,Un)
将训练样本投影到“特征脸”空间,得到一组投影向量Ω=wTu,构成人脸识别的数据库。在识别时,先将每一幅待识别的人脸图像投影到“特征脸”空间,再利用最邻近分类器比较其与库中人脸的位置,从而识别出该图像是否是库中的人脸,如果是,是哪一幅人脸。
2.图像的采集
图像的获取都是通过摄像头摄取,摄取的图像可以是真人也可以是人脸的图片,为了方便计算直接使用需要识别的人脸图像 。
人脸检测主要任务是判断所给图像是否存在人脸,若存在人脸需要给出人脸的大小(区域面积),坐标位置,是否为二值图像 等信息。
通过人脸特征点的检测与标定可以确定人脸图像中显著特征点的位置如眼睛、眉毛、鼻子、嘴巴等器官,同时还可以得到这些器官及其面部轮廓的形状信息的描述。根据人脸特征点检测与标定的结果,通过某些运算得到人脸特征的描述。
3.人脸库的建立
(1)照片预处理
预处理的主要作用有两方面:第一,消除噪音;第二,归一尺度。为了提高识别速度,应该尽量减少入库照片的冗余信息。因此库中的照片中涵盖的信息主要为人脸五官信息,其他与人脸特征提取与比对不相关的信息都视为背景信息,需要剔除 经过尺度归一化处理及灰度均衡化处理,样本照片存储为像素大小112*92的灰度图像 (2)人脸样本分类
通常的人脸识别方法是将人脸库视为一个整体进行训练,得出整个人脸库的特征值,之后再进行人脸识别。把一个常规的人脸库看成是若干个相对较小的人脸库的集合。进行人脸识别时,按照需求查找相应的子库,这样降低了参加训练的样本基数,从而达到了在不降低识别准确性的前提下,降低了人脸识别耗时的效果。 (3)数据库的建立
数据库起到了辅助的作用,是人脸识别算法与人脸库连接的一个桥梁。当识别待测样本时候,首先需要把待测样本进行人脸分类,在确定了该样本属于哪个聚类之后,从数据库中查找与之对应的人脸子库,进而进行人脸识别工作。该数据库中存储了人脸库中的每个照片的数据信息,包括:姓名,照片编号,协同模式分类:存储该样本的物理地址等信息
四、实验步骤与实验数据及结果分析
1.基于matlab图像处理的基本操作
读取和显示图像可以通过imread()和imshow()来实现;图像的输出用imwrite()函数就可以很方便的把图像输出到硬盘上;另外还可以用imcrp(),imrisize(),imrotate()等来实现图像的裁剪,缩放和旋转。
2 图像处理功能的Matlab实现
1)图像类型的转换
因后面的图像增强,边缘检测都是针对灰度图像进行的,而我们的原图是RGB图像,所以首先我们要对原图类型进行转换,实现代码如下: i=imread(’f:\\face1.jpg’);j=rgb2gray(i); imshow(j);imwrite(j,’f:\\face1.tif) 效果图如下: 2)图像增强
灰度图像直方图均衡化,代码如下: i=imread(’f:\\face1.tif’); j=histeq(i);imshow(j);
figure,subplot(1,2,1),imhist(i); subplot(1,2,2),imhist(j) 效果入下图:
3)灰度图像平滑与锐化处理
采用了预定义高斯滤波器的方法对图像进行锐化滤波。功能实现的代码如下:
i=imread(’f:\\face1.tif’);
j=imnoise(i,’gussian’,0,0.02); subplot(1,2,1),imshow(j);
j1=wiener2(j);subplot(1,2,2),imshow(j1);
h=fspecial(‘gaussian’,2,0.05);j2=imfilter(i,h);figure,subplot(1,2,1) imshow(i)
subplot(1,2,2),imshow(j2) 效果图如下: 4)边缘检测
采用canny算子进行边缘检测,代码如下: i=imread(’f:\\face.tif’);
j=edge(i,’canny’,[0.04,0.25],1.5); imshow(j) 效果如下图:
3.人脸识别系统
人脸识别是一个复杂的过程,一个计算机人脸识别包括几个步骤:对采集到的图像,首先进行人脸检测(在输入图像中需找人脸),给出人脸有无的结果;然后进行人脸定位,确定人脸额位置并提取出来。对人脸的定位在输入是图像序列时一般称之为人脸跟踪。通常检测和定位结合进行。对提取出来的人脸借助人脸描述就可以进行(狭义的)人脸识别,即通过提取特征来确定其身份。
程序代码如下: clear;
I=imread('D:\\Program Files (x86)\\Matlab\\mawenting.jpg'); O=rgb2ntsc(I); G=O(:,:,2); [m n]=size(G); U=zeros(m,n); for i=1:m for j=1:n
if G(i,j)>0.03&&G(i,j)<0.16 U(i,j)=1; end end end
sr=strel('disk',6); C=imclose(U,sr); L=bwlabel(C);
B=regionprops(L,'area'); Se=[B.Area];Sm=max(Se); if Sm>m*n/27
B1=bwareaopen(C,Sm); k_y1=m;k2=m;l2=n; for i=1:m
if any(B1(i,:))==1 k_y1=i; break end end
for i=k_y1:m if B1(i,:)==0 k2=i; break end end
for j=1:n
if any(B1(:,j))==1 l_y1=j; break end end
for j=l_y1:n if B1(:,j)==0 l2=j; break end
end
k_y=k2-k_y1; l=l2-l_y1;
if k_y>.5*l&&k_y<3*l
I1=imcrop(B1,[l_y1 k_y1 l .4*k_y]); [n1 m1]=size(I1); L1=bwlabel(I1);
E=regionprops(L1,'area'); Si=[E.Area]; Sm=max(Si); if Sm/(n1*m1)>.3
B2=bwareaopen(I1,floor(.5*Sm)); g_y1=m1;g2=m1; for j=1:m1
if any(B2(:,j))==1 g_y1=j; break end end
for j=g_y1:m1 if B2(:,j)==0; g2=j;break end end
g=g2-g_y1; figure;imshow(I); hold on
h1=line([l_y1+g_y1,l_y1+g_y1+g],[k_y1,k_y1]);
h2=line([l_y1+g_y1+g,l_y1+g_y1+g],[k_y1,k_y1+1.1*g]); h3=line([l_y1+g_y1+g,l_y1+g_y1],[k_y1+1.1*g,k_y1+1.1*g]); h4=line([l_y1+g_y1,l_y1+g_y1],[k_y1+1.1*g,k_y1]); h=[h1 h2 h3 h4];
set(h,'Color',[1 0 0],'LineWidth',2); else
figure;imshow(I); end else
figure;imshow(I); end else
figure;imshow(I); end
脸部识别处理效果如图所示: