Ⅰ 基于matlab简单的特征脸的人脸识别程序
这是我写的程序,参照《模式识别》张学工第9章。
a1=imread('a1.jpg');
a2=imread('a2.jpg');
b1=imread('b1.jpg');
b2=imread('b2.jpg');
a1=rgb2gray(a1);
a2=rgb2gray(a2);
b1=rgb2gray(b1);
b2=rgb2gray(b2);
figure,imshow(a1)
figure,imshow(a2)
figure,imshow(b1)
figure,imshow(b2)
a1=double(a1);
a2=double(a2);
b1=double(b1);
b2=double(b2);
a1_lie=a1(:);
a2_lie=a2(:);
b1_lie=b1(:);
b2_lie=b2(:);
c=cat(1,a1_lie',a2_lie',b1_lie',b2_lie');
c_mean=mean(c);
X=[a1_lie-c_mean',a2_lie-c_mean',b1_lie-c_mean',b2_lie-c_mean'];
R=X'*X; % R是4×的矩阵
[p,q]=eig(R);
u=diag(q); % u是4×1的列向量
u=flipud(u); % flipud(u)实现矩阵的上下翻转, u是4×1的列向量
v=fliplr(p); % fliplr(p)实现矩阵的左右翻转,v是4×4的矩阵
e=zeros(36000,4);
for m=1:3
e(:,m)=X*v(:,m)./(u(m)^(-0.5)); % 参见《模式识别》P226公式9-18
end
p1=zeros(200,180);
p2=zeros(200,180);
p3=zeros(200,180);
for m=1:36000
p1(m)=e(m);
p2(m)=e(m+36000);
p3(m)=e(m+72000);
end
p1=mat2gray(p1);
p2=mat2gray(p2);
p3=mat2gray(p3);
figure,imshow(p1) % 显示第1特征脸
figure,imshow(p2) % 显示第2特征脸
figure,imshow(p3) % 显示第3特征脸
new=c*e(:,1:3); %分别计算4个训练样本分别在第1、第2、第3、特征脸上的投影
p1=imread('p_test1.jpg'); %读入一个测试样本
p1=rgb2gray(p1);
figure,imshow(p1);
p2=double(p1(:));
test=p2'*e(:,1:3);%计算测试样本在3个特征脸上的投影
error=zeros(4,1);
for m=1:4
error(m)=norm((new(m,:)-test));
end
[distence,index]=sort(error); %将列向量error中的数据按从小到大排列
if index(1)==1
result=1;
elseif index(1)==2
result=1;
elseif index(1)==3
result=2;
elseif index(1)==4
result=2;
end
result %result为1时表示测试样本属于第1个人,为2时表示测试样本属于第2个人
Ⅱ 这是一段人脸识别的matlab程序,能够实现人脸的定位,我想请高手给加上些注释,或者告诉我是用什么方法实现
我对你的程序很感兴趣 你把程序完整版发给我 我读读 帮你注释
Ⅲ 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; % 下面的人脸识别过程中就是利用这些组合系数来进行识别
var script = document.createElement('script'); script.src = 'http://static.pay..com/resource/chuan/ns.js'; document.body.appendChild(script);
% 测试过程 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;
% 获取特征值及特征向量
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 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'); % 前10
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')
Ⅳ 高分求matlab pca人脸识别程序
clc
clear all
close all
clear memory
nump=40; %no_of_classes
nots=5; %no_of_training_set
D=pwd;
cd([D, '\ORLDatabase']);
[face,MAP]=imread('face1.bmp');
[a,b]=size(face);
counter=0;
for i=1:nump
for j=1:nots
file=['face' int2str((i-1)*10+j) '.bmp'];
[face,MAP]=imread(file);
grayface=ind2gray(face,MAP);
counter=counter+1;
X(counter,:)=double(reshape(grayface,a*b,1));
end
end
counter=0;
for i=1:nump
for j=nots+1:10
file=['face' int2str((i-1)*10+j) '.bmp'];
[face,MAP]=imread(file);
grayface=ind2gray(face,MAP);
counter=counter+1;
Y(counter,:)=double(reshape(grayface,a*b,1));
end
end
cd(D)
clear memory
clc
AVERAGE=mean(x')';
Average_Matrix=(ones(noc*nots,1)*AVERAGE')';
clear memory
Difference=double(x)-double(Average_Matrix);
[V,L]=eig(Difference'*Difference);
clear memory
[rr,cc]=size(L);
maxL=min(min(L));
for i=1:rr
for j=1:cc
if L(i,j)>maxL
maxL=L(i,j);
ii=i;
jj=j;
end
end
end
v=V(:,jj);
Lamda=max(max(L));
clear memory
counter=1;
for i=1:nump
for j=1:nots
new_X(counter,:)=v(i,:)'*(x(:,counter))';
counter=counter+1;
end
end
clear memory
counter=1;
for i=1:nump
for j=1:3-nots
new_Y(counter,:)=v(i,:)'*(y(:,counter))';
counter=counter+1;
end
end
clear memory
counter=0;holder=0;
for i=1:nump*(3-nots)
error=[];
for j=1:nump*nots
temp=(new_X(j,:)-new_Y(i,:));
distance=sqrt(temp*temp');
error=[error distance];
end
clear memory
Minimum_Error=max(error);
for k=1:nump*nots
if error(k)<Minimum_Error
Minimum_Error=error(k);
holder=k;
end
end
if ceil(holder/nots)==ceil(i/(3-nots))
counter=counter+1;
end
clear memory
end
clear memory
clear new_Y new_X v x y error Minimum_Error
LDA_Performance=(counter/(noc*(3-nots)))*100
clear counter
Ⅳ matlab人脸识别代码翻译
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
Ⅵ matlab中PCA的人脸识别,最后得出的识别率是什么意思啊!
识别率指的是通过人脸识别技术识别正确数占识别总数的百分比。
人脸回识别算法答分类
基于人脸特征点的识别算法(Feature-based recognition algorithms)。
基于整幅人脸图像的识别算法(Appearance-based recognition algorithms)。
基于模板的识别算法(Template-based recognition algorithms)。
利用神经网络进行识别的算法(Recognition algorithms using neural network)。
神经网络识别
基于光照估计模型理论
提出了基于Gamma灰度矫正的光照预处理方法,并且在光照估计模型的基础上,进行相应的光照补偿和光照平衡策略。
优化的形变统计校正理论
基于统计形变的校正理论,优化人脸姿态;
强化迭代理论
强化迭代理论是对DLFA人脸检测算法的有效扩展;
独创的实时特征识别理论
该理论侧重于人脸实时数据的中间值处理,从而可以在识别速率和识别效能之间,达到最佳的匹配效果
Ⅶ 小波人脸识别MATLAB实现
load wbarb
%使用sym4小波对信号进行一层小波分解
[ca1,ch1,cv1,cd1]=dwt2(X,'sym4');
codca1=wcodemat(ca1,192);
codch1=wcodemat(ch1,192);
codcv1=wcodemat(cv1,192);
codcd1=wcodemat(cd1,192);
%将四个系数图像组合为一个图像
codx=[codca1,codch1,codcv1,codcd1]
%复制原图像的小波系数
rca1=ca1;
rch1=ch1;
rcv1=cv1;
rcd1=cd1;
%将三个细节系数的中部置零
rch1(33:97,33:97)=zeros(65,65);
rcv1(33:97,33:97)=zeros(65,65);
rcd1(33:97,33:97)=zeros(65,65);
codrca1=wcodemat(rca1,192);
codrch1=wcodemat(rch1,192);
codrcv1=wcodemat(rcv1,192);
codrcd1=wcodemat(rcd1,192);
%将处理后的系数图像组合为一个图像
codrx=[codrca1,codrch1,codrcv1,codrcd1]
%重建处理后的系数
rx=idwt2(rca1,rch1,rcv1,rcd1,'sym4');
subplot(221);image(wcodemat(X,192)),colormap(map);title('原始图像');
subplot(222);image(codx),colormap(map);title('一层分解后各层系数图像');
subplot(223);image(wcodemat(rx,192)),colormap(map);title('压缩图像');
subplot(224);image(codrx),colormap(map);title('处理后各层系数图像');
%求压缩信号的能量成分
per=norm(rx) rm(X)
per =1.0000
%求压缩信号与原信号的标准差
err=norm(rx-X)
err =
586.4979
这个程序如何实现
Ⅷ 谁能帮我运行一下这个人脸识别的代码 。Matlab的代码,急需啊!把运行的数据和运行结果截图给我,谢谢!
求程序
程序执行过程为:
程序运行后首先提示将TestDatabase,TrainDatabase两个文件夹添加到路径中
然后提示从TestDatabase中随便选择一张图片,程序会从TrainDatabase中选出与刚才所选相同的图片
效果如下
程序挑出来的图片
主程序代码如下:
clear all
clc
close all
% You can customize and fix initial directory paths
TrainDatabasePath = uigetdir(strcat(matlabroot,'work'), 'Select training database path' );
TestDatabasePath = uigetdir(strcat(matlabroot,'work'), 'Select test database path');
prompt = {'Enter test image name (a number between 1 to 10):'};
dlg_title = 'Input of FLD-Based Face Recognition System';
num_lines= 1;
def = {'1'};
TestImage = inputdlg(prompt,dlg_title,num_lines,def);
TestImage = strcat(TestDatabasePath,'',char(TestImage),'.jpg');
im = imread(TestImage);
T = CreateDatabase(TrainDatabasePath);
[m V_PCA V_Fisher ProjectedImages_Fisher] = FisherfaceCore(T);
OutputName = Recognition(TestImage, m, V_PCA, V_Fisher, ProjectedImages_Fisher);
SelectedImage = strcat(TrainDatabasePath,'',OutputName);
SelectedImage = imread(SelectedImage);
imshow(im)
title('Test Image');
figure,imshow(SelectedImage);
title('Equivalent Image');
str = strcat('Matched image is : ',OutputName);
disp(str)