目录
这里,人脸的识别主要依据如下的流程进行:

具体的算法流程是这么一个过程:
第一:首先初始化一个区域,这个区域的大小和训练图片的大小相似;
第二:将需要测试的区域送入到神经网络模型,然后开始训练;
第三:然后将测试得到的结果和设定的门限值进行比较;
第四:如果符合门限要求,那么定义该区域值为1,否则为-1;
第五:将符合要求的门限值的位置进行标志,然后更新区域位置,然后再次进行测试;
第五:最后得到符合要求的测试区域,从而获得对应的人脸位置;
以二维形式存在的人脸图像所包含的数据信息是非常多的,而且,这些数据中还包含了很多与人脸身份并没有多少关系的冗余信息,例如,表情、光线条件等。因此,不能将这些数据直接作为人脸的代表特征来进行识别,也就是必须首先进行特征提取。特征提取的定义为:当原始特征的数量很大,或者说样本是处于一个高维空间中的向量时,通过映射(或变换)的方法用低维空间来表示。如上所述,由于人脸的维数在通常情况下很高,特征提取的成败就对整个识别阶段的效果有决定性的影响。甚至可以这样认为:在某种意义上,人脸识别过程的成败就决定于特征提取的好坏,因此,如何有效的进行特征提取就成为人脸识别科研人员不得不面对的关键性问题。鉴于特征提取的重要性,也有人将它独立作为整个人脸识别过程中的一个阶段。这里,其主要操作时提取特征,并将特征结果向量化,使二维的特征矩阵变为一维的特征向量,从而方便操作。
第一步:读入图片;
将人脸库的大量图片读入到MATLAB中;
第二步:对读入的图片进行特征提取;
对标准的人脸库,提取相关的特征参数,具体的特征参数根据实际情况来确定;
第三步:对读入的图片的特征值进行训练,得到神经网络;
对大量的特征参数进行训练,从而获得一个神经网络;
第四步:使用得到的神经网络对不同的图片进行测试,从而实现人脸的识别;
根据标准库训练得到的神经网络进行测试,进行人脸的识别操作。
- %代码的清空
- clc;
- clear;
- close all;
- warning off;
- %代码的清空
- %*************************************************************************%
-
- %STEP01:
- %参数初始化
- %1:进行图片的读取和特征提取;
- %2:进行神经网络的训练;
- %3:进行单个图片的识别
- %4:对多个图片进行连续识别,并统计系统识别率
- select = 3;
- PICS = cell(3,[]); %定义图片数据库
- fd1 = dir(['Library_picture/TRAIN/Man_Faces/','*','.pgm']); %定义训练图片人脸数据库
- Num1 = size(fd1,1);
- fd2 = dir (['Library_picture/TRAIN/Not_Man_Faces/','*','.pgm']);%定义训练图片非人脸数据库
- Num2 = size (fd2,1);
- %参数初始化
- %*************************************************************************%
-
- %STEP02:
- %读取图片并提取每张图片的特征
- if select == 1
- for k=1:Num1
- k
- image = imread(['Library_picture/TRAIN/Man_Faces/',fd1(k,1).name]);
- [m n] = size(image);
- PIC_feature = func_feature_face(image);
- for i=1:10
- PICS{1,end+1}= ['Library_picture/TRAIN/Man_Faces/',fd1(k,1).name];
- PICS{2,end} = 0.9;
- PICS(3,end) = {PIC_feature{i}};
- end
- end
- for k=1:Num2
- k
- image = imread(['Library_picture/TRAIN/Not_Man_Faces/',fd2(k,1).name]);
- [m n] = size(image);
- PIC_feature = func_feature_noface(image);
- for i=1:4
- PICS{1,end+1}= ['Library_picture/TRAIN/Not_Man_Faces/',fd2(k,1).name];
- PICS{2,end} = -0.9;
- PICS(3,end) = {PIC_feature{i}};
- end
- end
- %save Pic_lib02 PICS;
- end
-
- %读取图片并提取每张图片的特征
- %*************************************************************************%
-
- %STEP03:
- %通过神经网络进行训练
- if select == 2
- load net2;
- load Pic_lib02;
- net.trainFcn = 'trainscg';
- net.trainParam.lr = 0.4;
- net.trainParam.epochs = 400;
- net.trainParam.show = 10;
- net.trainParam.goal = 1e-3;
- T{1,1} = cell2mat(Pic_lib02(2,:));
- P{1,1} = cell2mat(Pic_lib02(3,:));
- NET = train(net,P,T);
- end
- %通过神经网络进行训练
- %*************************************************************************%
-
- %STEP04:
- %通过单张图片进行测试识别
- if select == 3
- load net2;
- load Pic_lib02;
-
- im = imread('Library_picture\TEST\1\pics (2).jpg');
- im = rgb2gray(im);
- [r,c] = size(im);
-
- if r>800
- im = imresize(im,0.1);
- else
- im = imresize(im,0.2);
- end
-
- figure;
- im_out = imscan(net,im);
- imshow(im_out,'notruesize');
- end
打开文件夹,打开main.m函数。运行,会得到如下的效果:

具体的使用方法为:首先点击“读取图片特征“按钮,将需要进行训练的图片读取,然后提取他们的特征参数,然后点击“神经网络训练”,对训练图片提取的特征进行神经网络训练,会看到如下的训练过程:

训练结束后,就开始进行识别测试了。
点击“打开测试图片”按钮,选择对应的图片:

点击“开始识别”按钮:

使用其他图片进行识别:



最后使用ORL库的标准人脸进行识别率测试,其效果如下所示:

[1]岳也, 王川龙. 一种基于改进PCA和BP神经网络的人脸识别算法[J]. 太原师范学院学报:自然科学版, 2021.A09-17