二、人脸识别技术简介

0 引言

人脸识别技术是计算机视觉和模式识别领域研究的热点问题,被广泛应用于医疗、安全访问控制、机场检查等领域。人脸识别技术易受人脸表情变化、姿态变化、光照变化、遮挡以及采集的高分辨率图像的影响,使得图像隹数增大,因此提高人脸识别算法的鲁棒性,成为了研究的重点方向之一。人脸识别的过程包括特征提取和识别两部分,目前, 人脸图像特征提取和线性降维的方法主要有主成分分析(principal component analysis, PCA) 和线性鉴别分析(linear discriminant analysis, LDA) 等方法 。PCA是一种基于变量协方差矩阵对样本信息进行处理、压缩和提取样本的常用代数特征提取方法,通过K-L变换为基础的无监督特征提取方法,其基本思想是将高维人脸图像投影到低维特征子空间, 使数据在一个低维的特征空间进行处理, 这样在减少数据冗余的同时保持了原始数据的有效性 。LDA算法是一种带有标签的有监督降维方法,其核心是使得投影后的样本类间离散度尽可能大,类内离散度尽可能小。

单一的特征提取方法对人脸的表征能力是有限的, PCA算法对光照和拍摄角度等敏感, 所获取的特征并不是最有效的;而LDA算法能从高维数据空间中提取出具有类别鉴别能力的低维特征, 改善光照不均时图像的识别率。因此本文结合PCA与LDA算法的优缺点, 提出先采用PCA算法对人脸图像进行全局特征提取, 再采用LDA算法进行人脸类别鉴别实现人脸数据的进一步压缩,最后采用最近邻分类器进行识别。

1 融合PCA与LDA的人脸识别算法

一个完整的人脸识别工作系统包括学习训练过程和测试识别过程。采用PCA与LDA算法进行人脸识别框架如图1所示。

【人脸识别】基于matlab PCA+LDA人脸识别【含Matlab源码 680期】_matlab

图1 PCA算法人脸识别流程

1.1人脸图像采集

采集人脸图像是通过摄像头采集人脸图像,并将其转换为计算机可以处理的数字信号。通过调取笔记本上的摄像头来实时进行每一帧图像的检测, 这里用的是MATLAB视觉工具箱中的webcam, 采集到的图像如图2所示。

1.2人脸检测

人脸检测的任务是判断画面中是否存在人脸,在存在人脸的情况下,提供图像内的坐标位置、面部区域的大小等信息。由肤色信息进行人的面部识别,进而实现对人面部的五官分割。基本步骤如下。

1)读入待检测人脸图像;

2)通过一低通滤波器,滤除高频噪声;

3) 将RGB空间转换为YCbCr空间像素值概率的计算, 再进行预处理;

4)开运算(先腐蚀再膨胀),消除杂散点;

5)根据填充率、面积比及肤色区域的长宽比去除非人脸部分;

6)框出人脸区域。

通过以上步骤进行相关运算处理可得如图3所示的图像。

【人脸识别】基于matlab PCA+LDA人脸识别【含Matlab源码 680期】_特征提取_02

图3 人脸检测图像

【人脸识别】基于matlab PCA+LDA人脸识别【含Matlab源码 680期】_特征提取_03

图3 人脸检测图像

1.3 基于PCA的识别算法

所得人脸图像是一个大小为MxN的二维图像, 可以看成长度为MN的人脸图像列向量。为了将二维人脸图像变为列向量,采取的措施为:首先计算出人脸图像的大小,然后将人脸图像经行转置,最后按列依次取出所有灰度值形成大小为MN的一维向量,其实整个阶段的效果相当于将图像的灰度值按行取出依次连接成一维图像向量组成的矩阵T。

1)对图像矩阵T进行规范化

首先计算出图像矩阵T中一维列向量的平均值m,然后对图像矩阵的每一列都减去平均值形成规范化的图像矩阵A,对人脸图像进行规范化后的图像如图4所示。

【人脸识别】基于matlab PCA+LDA人脸识别【含Matlab源码 680期】_matlab_04

图4 规范化人脸图像

2)五官分割

Viola-Jones算法是一种非常经典的算法因其高效而快速的检测效果至今仍被波广泛使用[13,14]。该算法包含以下几个重要的部分:

(1) 利用Haar特征描述人脸的共同属性;

(2)建立积分图像的特征,并且基于积分图像,可以快速获取若干不同的矩形特征正;

(3) 利用Adaboost算法进行训练;

(4)建立级联分类器。

调用MATLAB级联对象检测器使用Viola-Jones算法来检测人的面部, 如眼睛嘴巴,对测试图片进行人脸五官分割检测结果如图5所示。

【人脸识别】基于matlab PCA+LDA人脸识别【含Matlab源码 680期】_算法_05

图5 Viola-Jones算法人脸五官检测

3)计算特征脸

【人脸识别】基于matlab PCA+LDA人脸识别【含Matlab源码 680期】_特征提取_06

4 基于LDA的识别算法

LDA是一种具有监督学习的降维技术, 不同类的样本能尽量分开, 增大类间差异性 .

【人脸识别】基于matlab PCA+LDA人脸识别【含Matlab源码 680期】_计算机视觉_07

备注:简介部分仅作为理论参考,与本文程序和运行结果略有出入。

三、部分源代码

clear all
clc
close all
start=clock;
sample_class=1:40;%样本类别
sample_classnum=size(sample_class,2);%样本类别数
fprintf('程序运行开始....................\n\n');

for train_samplesize=3:8;
train=1:train_samplesize;%每类训练样本
test=train_samplesize+1:10;%每类测试样本

train_num=size(train,2);%每类训练样本数
test_num=size(test,2);%每类测试样本数

address=[pwd '\ORL\s'];
%读取训练样本
allsamples=readsample(address,sample_class,train);

%先使用PCA进行降维
[newsample base]=pca(allsamples,0.9);
%计算Sw,Sb
[sw sb]=computswb(newsample,sample_classnum,train_num);

%读取测试样本
testsample=readsample(address,sample_class,test);
best_acc=0;%最优识别率
%寻找最佳投影维数
for temp_dimension=1:1:length(sw)
vsort1=projectto(sw,sb,temp_dimension);

%训练样本和测试样本分别投影
tstsample=testsample*base*vsort1;
trainsample=newsample*vsort1;
%计算识别率
accuracy=computaccu(tstsample,test_num,trainsample,train_num);
if accuracy>best_acc
best_dimension=temp_dimension;%保存最佳投影维数
best_acc=accuracy;
end
end
%---------------------------------输出显示----------------------------------
fprintf('每类训练样本数为:%d\n',train_samplesize);
fprintf('最佳投影维数为:%d\n',best_dimension);
fprintf('FisherFace的识别率为:%.2f%%\n',best_acc*100);
fprintf('程序运行时间为:%3.2fs\n\n',etime(clock,start));
end
function [newsample basevector]=pca(patterns,num)
%主分量分析程序,patterns表示输入模式向量,num为控制变量,当num大于1的时候表示
%要求的特征数为num,当num大于0小于等于1的时候表示求取的特征数的能量为num
%输出:basevector表示求取的最大特征值对应的特征向量,newsample表示在basevector
%映射下获得的样本表示。
[u v]=size(patterns);
totalsamplemean=mean(patterns);
for i=1:u
gensample(i,:)=patterns(i,:)-totalsamplemean;
end
sigma=gensample*gensample';
[U V]=eig(sigma);
d=diag(V);
[d1 index]=dsort(d);
if num>1
for i=1:num
vector(:,i)=U(:,index(i));
base(:,i)=d(index(i))^(-1/2)* gensample' * vector(:,i);
end
else
sumv=sum(d1);
for i=1:u
if sum(d1(1:i))/sumv>=num
l=i;
break;
end
end
for i=1:l
vector(:,i)=U(:,index(i));
base(:,i)=d(index(i))^(-1/2)* gensample' * vector(:,i);
end
end
function sample=readsample(address,classnum,num)
%这个函数用来读取样本。
%输入:address就是要读取的样本的地址,classnum代表要读入样本的类别,num是每类的样本;
%输出为样本矩阵
allsamples=[];
image=imread([pwd '\ORL\s1_1.bmp']);%读入第一幅图像
[rows cols]=size(image);%获得图像的行数和列数
for i=classnum
for j=num
a=imread(strcat(address,num2str(i),'_',num2str(j),'.bmp'));
b=a(1:rows*cols);
b=double(b);
allsamples=[allsamples;b];
end
end

四、运行结果

【人脸识别】基于matlab PCA+LDA人脸识别【含Matlab源码 680期】_计算机视觉_08

五、matlab版本及参考文献

1 matlab版本

2014a

2 参考文献

[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.

[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.

[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.

[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

[5]孟逸凡,柳益君.基于PCA-SVM的人脸识别方法研究[J].科技视界. 2021,(07)

[6]张娜,刘坤,韩美林,陈晨.一种基于PCA和LDA融合的人脸识别算法研究[J].电子测量技术. 2020,43(13)

[7]陈艳.基于BP神经网络的人脸识别方法分析[J].信息与电脑(理论版). 2020,32(23)

[8]戴骊融,陈万米,郭盛.基于肤色模型和SURF算法的人脸识别研究[J].工业控制计算机. 2014,27(02)