ORL 人脸库 BP神经网络人脸识别

第一步 首先完成格式的转化。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('判断的图像')


————————————————
版权声明:本文为CSDN博主「GaotYuan」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gaotyuan/article/details/79823170

 

你可能感兴趣的:(新技术)