基于人脸识别PCA算法matlab实现及详细步骤讲解

人脸识别

% FaceRec.m

% PCA 人脸识别修订版,识别率88%

% calc xmean,sigma and its eigen decomposition

allsamples=[];%所有训练图像

for i=1:40

for j=1:5

a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg'));

% imshow(a);

b=a(1:112*92); % b 是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上

到下,从左到右

b=double(b);

allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数

据代表一张图片,其中M=200

end

end

samplemean=mean(allsamples); % 平均图片,1 × N

for i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean 是一个M × N 矩阵,xmean

每一行保存的数据是"每个图片数据-平均图片"

end;

% 获取特征值及特征向量

sigma=xmean*xmean'; % M * M 阶矩阵

[v d]=eig(sigma);

d1=diag(d);

% 按特征值大小以降序排列

dsort = flipud(d1);

vsort = fliplr(v);

%以下选择90%的能量

dsum = sum(dsort);

dsum_extract = 0;

p = 0;

while( dsum_extract/dsum < 0.9)

p = p + 1;

dsum_extract = sum(dsort(1:p));

end

i=1;

% (训练阶段)计算特征脸形成的坐标系

base = xmean' * vsort(:,1:p) * diag(dsort(1:p).^(-1/2));

% base 是N×p 阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化(使其方差为1)

% 详见《基于PCA 的人脸识别算法研究》p31

% xmean' * vsort(:,i)是小矩阵的特征向量向大矩阵特征向量转换的过程

%while (i<=p && dsort(i)>0)

% base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); % base 是N×p 阶矩阵,除以dsort(i)^(1/2)

是对人脸图像的标准化(使其方差为1)

% 详见《基于PCA 的人脸识别算法研究》p31

% i = i + 1; % xmean' * vsort(:,i)是小矩阵的特征向量向大矩阵特

征向量转换的过程

%end

% 以下两行add by gongxun 将训练样本对坐标系上进行投影,得到一个 M*p 阶矩阵allcoor

allcoor = allsamples * base; % allcoor 里面是每张训练人脸图片在M*p 子空间中的一个点,

即在子空间中的组合系数,

accu = 0; % 下面的人脸识别过程中就是利用这些组合系数来进行识别

% 测试过程

for i=1:40

for j=6:10 %读入40 x 5 副测试图像

a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg'));

b=a(1:10304);

b=double(b);

tcoor= b * base; %计算坐标,是1×p 阶矩阵

for k=1:200

mdist(k)=norm(tcoor-allcoor(k,:));

end;

%三阶近邻

[dist,index2]=sort(mdist);

class1=floor( (index2(1)-1)/5 )+1;

class2=floor((index2(2)-1)/5)+1;

class3=floor((index2(3)-1)/5)+1;

if class1~=class2 && class2~=class3

class=class1;

elseif class1==class2

class=class1;

elseif class2==class3

class=class2;

end;

if class==i

accu=accu+1;

end;

end;

end;

accuracy=accu/200 %输出识别率

特征人脸

% eigface.m

function [] = eigface()

% calc xmean,sigma and its eigen decomposition

allsamples=[];%所有训练图像

for i=1:40

for j=1:5

a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg'));

% imshow(a);

b=a(1:112*92); % b 是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上

到下,从左到右

b=double(b);

allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数

据代表一张图片,其中M=200

end

end

samplemean=mean(allsamples); % 平均图片,1 × N

for i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean 是一个M × N 矩阵,xmean

每一行保存的数据是"每个图片数据-平均图片"

end;

% 获取特征值及特征向量

dsort = flipud(d1);

vsort = fliplr(v);

%以下选择90%的能量

dsum = sum(dsort);

dsum_extract = 0;

p = 0;

while( dsum_extract/dsum < 0.9)

p = p + 1;

dsum_extract = sum(dsort(1:p));

end

p = 199;

% (训练阶段)计算特征脸形成的坐标系

%while (i<=p && dsort(i)>0)

% base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); % base 是N×p 阶矩阵,除以

dsort(i)^(1/2)是对人脸图像的标准化,详见《基于PCA 的人脸识别算法研究》p31

% i = i + 1; % xmean' * vsort(:,i)是小矩阵的特征向量向大矩

阵特征向量转换的过程

%end

base = xmean' * vsort(:,1:p) * diag(dsort(1:p).^(-1/2));

% 生成特征脸

for (k=1:p),

temp = reshape(base(:,k), 112,92);

newpath = ['d:\test\' int2str(k) '.jpg'];

imwrite(mat2gray(temp), newpath);

end

avg = reshape(samplemean, 112,92);

imwrite(mat2gray(avg), 'd:\test\average.jpg');

% 将模型保存

save('e:\ORL\model.mat', 'base', 'samplemean');

人脸重建

% Reconstruct.m

function [] = reconstruct()

load e:\ORL\model.mat;

% 计算新图片在特征子空间中的系数

img = 'D:\test2\10.jpg'

a=imread(img);

b=a(1:112*92); % b 是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上到下,

从左到右

b=double(b);

b=b-samplemean;

c = b * base; % c 是图片a 在子空间中的系数, 是1*p 行矢量

% 根据特征系数及特征脸重建图

% 前15 个

t = 15;

temp = base(:,1:t) * c(1:t)';

temp = temp + samplemean';

imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t1.jpg');

% 前50 个

t = 50;

temp = base(:,1:t) * c(1:t)';

temp = temp + samplemean';

imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t2.jpg');

% 前100 个

t = 100;

temp = base(:,1:t) * c(1:t)';

temp = temp + samplemean';

imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t3.jpg');

% 前150 个

t = 150;

temp = base(:,1:t) * c(1:t)';

temp = temp + samplemean';

imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t4.jpg');

% 前199 个

t = 199;

temp = base(:,1:t) * c(1:t)';

temp = temp + samplemean';

imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t5.jpg');

相关推荐
小王子10242 分钟前
设计模式Python版 组合模式
python·设计模式·组合模式
kakaZhui6 分钟前
【llm对话系统】大模型源码分析之 LLaMA 位置编码 RoPE
人工智能·深度学习·chatgpt·aigc·llama
struggle20251 小时前
一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI
人工智能·深度学习·目标检测·语言模型·自然语言处理·数据挖掘·集成学习
佛州小李哥1 小时前
通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)
人工智能·科技·ai·语言模型·云计算·aws·亚马逊云科技
Mason Lin1 小时前
2025年1月22日(网络编程 udp)
网络·python·udp
清弦墨客2 小时前
【蓝桥杯】43697.机器人塔
python·蓝桥杯·程序算法
云空2 小时前
《DeepSeek 网页/API 性能异常(DeepSeek Web/API Degraded Performance):网络安全日志》
运维·人工智能·web安全·网络安全·开源·网络攻击模型·安全威胁分析
AIGC大时代2 小时前
对比DeepSeek、ChatGPT和Kimi的学术写作关键词提取能力
论文阅读·人工智能·chatgpt·数据分析·prompt
山晨啊83 小时前
2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文
人工智能·机器学习
RZer3 小时前
Hypium+python鸿蒙原生自动化安装配置
python·自动化·harmonyos