第一步 首先完成格式的转化。ORL人脸库中图片格式为pgm,将图片转换成bmp格式。
%{
将ORL人脸数据库的pgm格式批量转换为bmp格式
%}
clc;
% clear all;
for i=1:40
for j=1:10
image=imread(strcat('F:\mriimage\att_faces\orl_faces\s',int2str(i),'\',int2str(j),'.pgm'));
imwrite(image,strcat('F:\mriimage\att_faces\orl_faces\s',int2str(i),'\',int2str(j),'.bmp'));
end
disp(strcat('s',int2str(i),'转换结束.'));
end
disp('批量转换结束.');
第二步,需要对数据进行特征提取,采用最大奇异值作为特征。
1.需要找到每张图片的路径,依次的对图像进行分割,提取特征
num=1;%用最大的奇异值作特征值
dir = ['\1.bmp '
'\2.bmp '
'\3.bmp '
'\4.bmp '
'\5.bmp '
'\6.bmp '
'\7.bmp '
'\8.bmp '
'\9.bmp '
'\10.bmp'];
for x=1:40
%将数字转换成字符,便于把两个字符连接,组成图片的完整路径
a = int2str(x);
b = ['s'];
d = [b a];
for i=1:10
%得到每张图片的文件名
e = [d dir(i,1:7)];
% 将图片转化成为灰度矩阵
M = double(imread(e));
%把数据处理得到32维的特征向量
for j=1:8
for k=1:4
%将图片的灰度矩阵划分成32块小矩阵
temp=M((j-1)*14+1:j*14,(k-1)*23+1:k*23);
%对每个小矩阵进行SVD变换
[u,temp1,v]=svd(temp);
%提取最大的SVD系数作为特征值
temp2=temp1(num,num);
%得到所有图片的特征矩阵
feature((x-1)*10+i,(j-1)*4+k)=temp2;
end
end
end
end
第三步,构建训练集和测试集
feature=feature'; %进行矩阵倒置,因为该算法要求矩阵的行数比列数少
num_train=5;%表示用来训练的样本
num_test=10-num_train;%用来测试的样本
for y=1:40 %一共有40个人,每人10张图片
for n=1:num_train
%构造训练集
train_data(:,(y-1)*num_train + n) = feature(:,(y-1)*10 + n);%train_data 为训练集向量空间
end
for z=1:num_test
%构造测试集
test_data(:,(y-1)*num_test+z)= feature(:,(y-1)*10 +num_train+z);%test_data 为测试集向量空间
end
end
第四步,对数据进行归一化处理
pn = mat2gray(train_data);
pnewn = mat2gray(test_data);
第五步,创建神经网络 构造训练目标集
pn1=minmax(pn);
for y=1:40
for m=1:num_train
%构造训练集目标集
t(y,(y-1)*num_train+m)=1;
end
end
第六步,调用MATLAB神经网络工具箱并构建BP神经网络和训练BP神经网络
net1 = newff(pn1,[110,40],{'logsig','logsig'},'trainlm'); %调用MATLAB神经网络工具箱,构建BP神经网络
net1.trainParam.goal=1e-5; %设置训练目标
net1.trainParam.epochs=1000; %训练迭代数
net1.trainParam.lr = 0.005; %设置学习速率
%训练BP神经网络
[net1,tr] = train(net1,pn,t);
result_test=sim(net, pnewn);
result_train=sim(net, pn);
%C是得出的result_test中的每一列的最大值,I是最大值所在的行数
[C,I]=max(result_test);
%A是得出的result_train中的每一列的最大值,B是最大值所在的行数
[A,B]=max(result_train);
count_test=0;
count_train=0;
for f=1:40
for g=1:num_test
%计算在得出的结果中,被正确识别出来的测试集图片数目
if(I(1,(f-1)*num_test+g)==f)
count_test=count_test+1;
end
end
for h=1:num_train
%计算在得出的结果中,被正确识别出来的训练集图片数目
if(B(1,(f-1)*num_train+h)==f)
count_train=count_train+1;
end
end
end
fprintf('统计结束:\n正确识别的测试集数目为: %d\n\n',count_test);
fprintf('正确识别的训练集数目为: %d\n\n',count_train);
%计算出总识别率
Total_reg=(count_test+count_train)/400
第八步,选择图片识别
select_img=imread('t1.bmp');
figure
subplot(121); imshow(select_img);title('你选择的图片')
M=double(select_img);
num=1;%用最大的奇异值作特征值
x=1
i=1
for j=1:8
for k=1:4
%将图片的灰度矩阵划分成32块小矩阵
temp=M((j-1)*14+1:j*14,(k-1)*23+1:k*23);
%对每个小矩阵进行SVD变换
[u,temp1,v]=svd(temp);
%提取最大的SVD系数作为特征值
temp2=temp1(num,num);
%得到所有图片的特征矩阵
feature1((x-1)*10+i,(j-1)*4+k)=temp2;
end
end
feature1=feature1';
pnewn1 = mat2gray(feature1);
result_test=sim(net, pnewn1);
[C,I]=max(result_test);
disp([ '该图像属于第',num2str(I),'个人的人脸图像']);
subplot(122); imshow(strcat('F:\mriimage\att_faces\orl_faces\s',num2str(I),'\','1.bmp'));title('判断的图像')