《科研训练成果PCA人脸识别》由会员分享,可在线阅读,更多相关《科研训练成果PCA人脸识别(23页珍藏版)》请在金锄头文库上搜索。
1、研究成果展示基于PCA主成分分析算法的人脸识别系统功能描述 假设有一张给定的测试图像Test。系统能够从本身的训练库中找出与测试图像相同或近似度最大的图像,并将之输出。系统流程v输入测试图像文件;v将训练库中的图像文件读入矩阵, 创建图像数据库T; CreateDatabase()v利用Principle Component Analysis (PCA)主成分分析算法提取图像数据库T的特征,得到特征脸矩阵Eigenfaces;EigenfaceCore()v导入测试图像文件TestImge,获取测试图像的特征向量,并与特征脸比较得到欧几里得距离矩阵,找到最佳匹配对象;Recognition()
2、v寻找结果输出开始开始选择测试图像选择测试图像TestImage创建标准匹配数据库创建标准匹配数据库CreateDatebase提取特征脸提取特征脸EigenfaceCore读入测试图像,匹配识别读入测试图像,匹配识别Recognition输出匹配结果输出匹配结果结束结束详细过程 假设有n=10张测试图像(在本系统中我们将文件名设为110.jpg的格式以方便之后程序的调用处理),本地有一已存在的训练库。 第一步 选择测试图像选择测试图像TestImage 因为系统一次只处理一张测试图像,所以程序开始阶段需要从这n张测试图像中选择一个对象,名为TestImage。 第二步 创建标准匹配数据。函数
3、为创建标准匹配数据。函数为CreateDatebase CreateDatabase()流程函数开始计算训练库中图像的数量逐步读入图像数据并将其转换为灰度图像,然后将每个灰度图像转换一维列向量存于矩阵T中。函数结束返回矩阵TCreateDatebase函数vDescriptions: This function reshapes all 2D images of the training database into 1D column vectors. Then, it puts these 1D column vectors in a row to construct 2D matrix T
4、.vArgument: TrainDatabasePath - Path of the training database Returns: T - A 2D matrix, containing all 1D image vectors. Suppose all P images in the training database have the same size of MxN. So the length of 1D column vectors is MN and T will be a MNxP 2D matrix.CreateDatebase函数的描述v首先找到TrainDatab
5、ase文件,计算文件中所含图片的数量(记数量为Train_Number)。v定义一个空矩阵T,用rgb2gray()函数分别对每一张图片进行灰度处理。此时TrainDatabase中的RGB图像被全部转换为灰度图像。v调用reshape()函数将每一张图片用一个列向量T(i)表示。 irow icol = size(img); irow为第i个灰度图像的行数,icol为相应列数,那么一个灰度图像的所含数据个数为irow*icol。 temp = reshape(img,irow*icol,1); 将irow*icol大小的灰度图像用一个列向量表示。v将所有的列向量组合成一个新的一维矩阵T。它的
6、每一个元素表示一个灰度图像。 至此,训练库中的图像被表示为一个irow*icol行, Train_Number列的矩阵T。 第三步 提取特征脸。 函数为EigenfaceCore()()函数开始求出矩阵T每一行数据的均值m计算每一幅图像相对均值的偏差a获取特征脸Eigenfaces函数结束返回均值吗,偏差啊,特征脸Eigenfaces 这一步中我们要对矩阵T做一些处理,其实就是PCA分解的过程。A、取得图库矩阵T的行均值矩阵(m) 在上一步中我们得到矩阵T行数为H=M*N=irow*icol,列数为P=Train_number。 获得的行均值矩阵m大小为M*Nx1,其中B、 则偏差矩阵的计算方
7、法为A=double(T(:,i) m,显然矩阵A的大小和矩阵T一样为H=M*N.每一幅图像在矩阵T中体现为一个列向量,如此即可计算出没幅图像相对于均值矩阵m的偏差。下面为具体步骤:如何取得图像库的偏差矩阵(A)1、 用Size()函数得到图片库矩阵的列数。 P=Train_Number = size(T,2). 2、提取代码如下: A = ; for i = 1 : Train_Number temp = double(T(:,i) - m; A = A temp; end 数学过程C、该步骤也是整个函数最关键的一步。经过上面的步骤偏差矩阵A已经被计算出,将A做如下处理: L = A*A;其
8、中矩阵A大小为H*P,行数H远远大于列数P(本次训练库中存放有20张图片。)做如此处理后,L大小变为P*P。 通过 V D = eig(L)提取L的特征向量和对角矩阵。Eig的运算为L*V=V*D,其中D为对角特征值矩阵,V为特征向量矩阵。A=,(A- E)=0,即(L-D)V=0。 我们是想求得协方差矩阵A*A的特征值与特征向量,但是由于图像数量通常远远小于相应图像的像素(M*N),若处理协方差A*A显然其维数过大,于是转而去求A*A的特征值与特征向量,再根据A*A与A*A的特征值与特征向量的关系,求出A*A的特征值与特征向量。因为特征值对角矩阵D是L=A*A 和 C=A*A共同的特征. 训
9、练库中可能存在某些干扰,为了找出人脸的主元向量,在此阶段设置一定的阈值将干扰隔离。代码如下:L_eig_vec = ;for i = 1 : size(V,2) if( D(i,i)1 ) L_eig_vec = L_eig_vec V(:,i); endEnd 消除了影响因素,并对原特征向量矩阵V重新排序组成新的L_eig_vec特征向量矩阵。Eigenfaces = A * L_eig_vec 让偏差矩阵A和特征向量基矩阵相乘,得到特征脸矩阵,该矩阵中每一列表示一副特征脸。L_eig_vec为P行L列的矩阵,其中L小于P,则Eigenfaces矩阵为H行L列的矩阵。 第四步 匹配识别函数开
10、始函数结束将特征脸映射入脸域ProjectedImages将测试图像映射入脸域ProjectedTestImage计算欧几里得距离寻找最大相似度图像,输出结果Recognition函数v在上面的步骤中我们将训练库中所有图像的主元特征用一个矩阵表示。v从主函数中传递过来TestImage(为需要测试图像的路径),除此之外还有从训练文件夹中运算得到的三个参量Eigenfaces , m,A:一:一: 获取矩阵Eigenfaces矩阵的列数Train_Number =size(Eigenfaces,2);Train_Number=L。 ProjectedImages= Eigenfaces*A(:,
11、i) 。脸域中 的一个列描述了一副图像的主要特征。即在此,我们用一个L维的向量基表示每幅图像。ProjectedImage为L阶方阵。将测试图像读入矩阵中,并用相同的方法处理测试图像矩阵,然后映射入测试脸域,得到ProjectedTestImage。 ProjectedTestImage为一个含有L个元素的单列矩阵。二:二:利用欧几里得几何距离的算法求解出测试图像和原来经过训练的图像所得参数进行最小距离的计算,此最小距离可以理解为测试图像和标准库中每个图像之间最大的相似度。 设aij表示脸域中地j列表示的一副图像(即一列数据),bi表示映射入脸域的测试图像,都含有L个元素。欧几里得距离: 将对
12、比后的数据存入Euc_dist矩阵中,显然Euc_dist中含有L个元素。 找到拥有最大相似度的图像,即欧氏距离最小,目标图像找到。 后边是matlab代码。附注:附注:完整程序代码:clear allclcclose all% You can customize and fix initial directory pathsTrainDatabasePath = uigetdir(D:Program FilesMATLABR2006awork, Select training database_path );TestDatabasePath = uigetdir(D:Program File
13、sMATLABR2006awork, Select test database_path);prompt = Enter test image name (a number between 1 to 10):;dlg_title = Input of PCA-Based Face Recognition System;num_lines= 1;def = 1;TestImage = inputdlg(prompt,dlg_title,num_lines,def);TestImage = strcat(TestDatabasePath,char(TestImage),.jpg);im = imr
14、ead(TestImage);T = CreateDatabase(TrainDatabasePath);m, A, Eigenfaces = EigenfaceCore(T);OutputName = Recognition(TestImage, m, A, Eigenfaces);SelectedImage = strcat(TrainDatabasePath,OutputName);SelectedImage = imread(SelectedImage);imshow(im)title(Test Image);figure,imshow(SelectedImage);title(Equ
15、ivalent Image);str = strcat(Matched image is : ,OutputName);disp(str)function T = CreateDatabase(TrainDatabasePath)% File managementTrainFiles = dir(TrainDatabasePath)Train_Number = 0; for i = 1:size(TrainFiles,1) if not(strcmp(TrainFiles(i).name,.)|strcmp(TrainFiles(i).name,.)|strcmp(TrainFiles(i).
16、name,Thumbs.db) Train_Number = Train_Number + 1; % Number of all images in the training database endend% Construction of 2D matrix from 1D image vectorsT = ;for i = 1 : Train_Number str = int2str(i); str = strcat(,str,.jpg); str = strcat(TrainDatabasePath,str); img = imread(str); img = rgb2gray(img)
17、; irow icol = size(img); temp = reshape(img,irow*icol,1); T = T temp; endfunction m, A, Eigenfaces = EigenfaceCore(T)% Calculating the mean image m = mean(T,2); Train_Number = size(T,2);A = ; for i = 1 : Train_Number temp = double(T(:,i) - m; end% Snapshot method of EigenfacemethosL = A*A; V D = eig
18、(L); % Sorting and eliminateingL_eig_vec = ;for i = 1 : size(V,2) if( D(i,i)1 ) L_eig_vec = L_eig_vec V(:,i); endend% Calculating the eigenvectors of covariance matrix CEigenfaces = A * L_eig_vec; % A: centered image vectors function OutputName = Recognition(TestImage, m, A, Eigenfaces)% Projecting
19、centered image vectors into facespaceProjectedImages = ;Train_Number = size(Eigenfaces,2);for i = 1 : Train_Number temp = Eigenfaces*A(:,i); ProjectedImages = ProjectedImages temp; end% Extracting the PCA features from test imageInputImage = imread(TestImage);temp = InputImage(:,:,1);irow icol = siz
20、e(temp);InImage = reshape(temp,irow*icol,1);Difference = double(InImage)-m; ProjectedTestImage = Eigenfaces*Difference; % Calculating Euclidean distances % Euclidean distances(欧几里得几何距离)Euc_dist = ;for i = 1 : Train_Number q = ProjectedImages(:,i); temp = ( norm( ProjectedTestImage - q ) )2; Euc_dist = Euc_dist temp;endEuc_dist_min , Recognized_index = min(Euc_dist);OutputName = strcat(int2str(Recognized_index),.jpg);