PCA检测人脸的简单示例_matlab实现

此文转载于mpbchina的博客,转载地址:

http://blog.csdn.net/mpbchina/article/details/7384425



  1. [plain] view plaincopy
  2. %训练  
  3. %Lx=X'*X  
  4. clear;  
  5. clc;  
  6. train_path='..\Data\TrainingSet\';  
  7. phi=zeros(64*64,20);  
  8. for i=1:20  
  9. path=strcat(train_path,num2str(i),'.bmp');  
  10. Image=imread(path);  
  11. Image=imresize(Image,[64,64]);  
  12. phi(:,i)=double(reshape(Image,1,[])');  
  13. end;  
  14. %mean  
  15. mean_phi=mean(phi,2);  
  16. mean_face=reshape(mean_phi,64,64);  
  17. Image_mean=mat2gray(mean_face);  
  18. imwrite(Image_mean,'meanface.bmp','bmp');  
  19. %demean  
  20. for i=1:19  
  21. X(:,i)=phi(:,i)-mean_phi;  
  22. end  
  23. Lx=X'*X;  
  24. tic;  
  25. [eigenvector,eigenvalue]=eigs(Lx,19);  
  26. toc;  
  27. %normalization  
  28. for i=1:19  
  29. %K-L变换  
  30. UL(:,i)=X*eigenvector(:,i)/sqrt(eigenvalue(i,i));  
  31. end  
  32. %display Eigenface  
  33. for i=1:19  
  34. Eigenface=reshape(UL(:,i),[64,64]);  
  35. figure(i);  
  36. imshow(mat2gray(Eigenface));  
  37. end  

得到的均值图像mean_face:

前19个最大主元对应的“特征脸”

测试
测试用样本:

[plain]  view plain copy
  1. %使用测试样本进行测试  
  2. clc;  
  3. test_path='..\Data\TestingSet\';  
  4. error=zeros([1,4]);  
  5. for i=1:4  
  6. path=strcat(test_path,num2str(i),'.bmp');  
  7. Image=imread(path);  
  8. Image=double(imresize(Image,[64,64]));  
  9. phi_test=zeros(64*64,1);  
  10. phi_test(:,1)=double(reshape(Image,1,[])');  
  11. X_test=phi_test-mean_phi;  
  12. Y_test=UL'*X_test;  
  13. X_test_re=UL*Y_test;  
  14. Face_re=X_test_re+mean_phi;  
  15. calculate error rate  
  16. e=Face_re-phi_test;  
  17.   
  18.   
  19. %%display figure  
  20. Face_re_2=reshape(Face_re(:,1),[64,64]);  
  21. figure(i);  
  22.   
  23. imshow(mat2gray(Image));  
  24. title('Original');  
  25. figure(10+i);  
  26. imshow(mat2gray(Face_re_2));  
  27. title('Reconstruct');  
  28. error(1,i)=norm(e);  
  29.   
  30. %dispaly error rate  
  31. error_rate=error(1,i);  
  32. display(error_rate);  
  33. end  
重建出的测试样本与原样本的对比:

四副测试样本的重建误差分别为:
1.4195e+003
1.9564e+003
4.7337e+003
7.0103e+003

可见测试样本为人脸的样本的重建误差显然小于非人脸的重建误差。



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCA(Principal Component Analysis)是一种常用的数据降维技术,在人脸识别中也得到了广泛应用。通常,对于一张人脸图像,我们可以提取其特征向量并进行降维,从而得到一个比较紧凑的描述,再将其与已知的训练数据进行比较,最终判断该图像所属的人。 以下是MATLAB实现PCA人脸识别的代码示例: 1. 准备数据:读取一组已经预处理好的人脸图像作为训练数据,存储在一个数据矩阵X中,每个样本对应矩阵的一列。 2. 计算均值脸,即将每一列的所有元素分别求和并平均,得到一个长度为P的均值向量mean_face。 3. 对样本矩阵X进行中心化,即将每一列都减去均值向量,得到新的样本矩阵X_centered。 4. 计算协方差矩阵C,即将X_centered转置后与自己相乘再除以N - 1,其中N为样本个数。 5. 对C进行特征值分解,得到特征值向量与特征向量矩阵,其中特征向量矩阵的每一列对应一个主成分。 6. 选择前K个主成分组成投影矩阵W,并将X_centered乘以W,得到新的样本矩阵X_pca。 7. 对于一个待识别的人脸图像,将其也进行中心化并乘以W,得到该图像的特征向量x,与X_pca中的所有特征向量进行比较,选择最相似的一个作为识别结果。 以下是MATLAB代码的实现: % Step 1: 准备数据 load faces.mat % 读取人脸数据矩阵X N = size(X, 2); % 样本个数 P = size(X, 1); % 每个样本的维度(像素数) K = 20; % 选择前K个主成分进行降维 % Step 2: 计算均值脸 mean_face = mean(X, 2); % 求每一列的平均值 imshow(reshape(mean_face, [64,64])) % 显示均值脸 % Step 3: 对样本矩阵进行中心化 X_centered = X - repmat(mean_face, [1 N]); % 将均值脸重复N次并减去X % Step 4: 计算协方差矩阵 C = X_centered * X_centered' / (N - 1); % Step 5: 进行特征值分解 [V, D] = eig(C); % V为特征向量矩阵,每一列对应一个主成分 % Step 6: 根据K选择主成分并进行投影 W = V(:, end-K+1:end); % 选择最后K个特征向量 X_pca = W' * X_centered; % 投影得到新的样本集 % Step 7: 进行识别 new_face = imread('new_face.jpg'); % 读取待识别的图像文件 new_face = rgb2gray(new_face); % 转为灰度图 imshow(new_face); % 显示待识别的图像 new_face = double(new_face(:)); % 将图像展成向量 new_face_centered = new_face - mean_face; % 中心化 new_face_pca = W' * new_face_centered; % 降维得到特征向量 % 计算所有样本与待识别图像的距离 distances = sum(bsxfun(@minus, X_pca, new_face_pca).^2, 1); [~, index] = min(distances); % 距离最小者为识别结果 matched_face = reshape(X(:, index), [64,64]); figure, imshow(matched_face); % 显示识别结果 注:上述代码中的faces.mat文件包含了一个400x4096的矩阵X,其中每一行对应一个64x64的人脸图像,读者可以自行准备类似格式的训练数据进行实验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值