基于回归模型的人脸识别(matlab实现)

版权声明:不推荐直接照抄代码,至少要在理解后的前提下;欢迎评论 https://blog.csdn.net/weixin_40457801/article/details/88932083

基于回归模型的人脸识别(matlab实现)

1、原理

识别系统不外乎以下几个方面,通常前两种在我们实际操作时不予考虑,我们都能在网上找到人脸的图片素材,他们通常都是预处理过的。例如,在1993 年,美国国防部高级研究项目署(Advanced Research Projects Agency)和 美国陆军研究实验室(Army Research Laboratory)成立了 Feret(Face RecognitionTechnology) 项目组,建立了 Feret 人脸数据库,用于评价人脸识别算法的性能。我们这里采用Yale University的数据库。在这里插入图片描述

用于识别人脸的算法在近几年来是研究热点,许多的研究者也提出了许多的算法模型
  1. 基于几何特征的方法,通过人脸拓扑结构几何关系,提取面部器官特征来进行识别。
  2. 基于模板的方法可以分为基于相关匹配的方法、特征脸方法、线性判别分析方法、奇异值分解方法、神经网络方法、动态连接匹配方法等。
  3. 基于模型的方法则有基于隐马尔柯夫模型,主动形状模型和主动外观模型的方法等。

2、算法

下面算法使用初学入门的简单的基于回归模型的方法进行人脸识别

Naseem等人提出的线性回归分类器(Linear Regression Classification,LRC)本质上是一个最近子空间分类器(Nearest Space, NS)。LRC 假定人脸图像位于一个线性空间之中,并认为待检测图像应当与训练集中同一类图像张成的子空间距离最小,即待检测图像应当能被训练集中同一类图像以最小误差线性重构。于是 LRC 计算待测图像y 到训练集中每类图像所张成的子空间距离,将其分类到距离最近的类中。

正规方程法

最小二乘法可以将误差方程转化为有确定解的代数方程组(其方程式数目正好等于未知数的个数),从而可求解出这些未知参数。这个有确定解的代数方程组称为最小二乘法估计的正规方程(或称为法方程)。
本文用正规方程法(Normal Equation)来求解其最优参数,具体数学推导可以略过,这一步就是想得到参数b的表达式,具体如下:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190331170727386.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDQ1NzgwMQ==,size_16,color_FFFFFF,t_70在这里插入图片描述
即其中,
在这里插入图片描述

LRC算法

根据待检测人脸图像应当与训练集中同一类图像张成的子空间距离最小的原则进行识别
在这里插入图片描述

3、代码

matlab代码就是按以上流程编写的,本代码由在借鉴的情况下自己码的,请勿照搬,如有疑问欢迎留言。

%%%基于回归模型的人脸识别算法LRC对txt文件进行训练及识别
tic
error=[];
right={};
error_num={};
for m=1:10 %%处理10份
test = dlmread([ 'StTestFile',num2str(m),'.txt']);
                   %最后一列是类别
c1=test(:,end); %%类别
t1=test(:,1:end-1);%%图片矩阵数值
train_data = dlmread(['StTrainFile',num2str(m),'.txt']);
                   
c2=train_data(:,end);
t2=train_data(:,1:end-1);

for num=1:size(c1,1) %%测试照片数量,num为测试的第某张照片
    y= reshape(test(num,1:end-1),size(t1',1),1);%%y存放测试图片

x={};
for n=1:max(c1)     %%即类别数,15
x{n}=[];                   
for k=((size(t2,1)/max(c1))*(n-1)+1):size(t2,1)*n/max(c1)
    %第k类人所有训练图片
    A=train_data(k,1:end-1);
    x{n}=[x{n},reshape(A,size(t1',1),1)];%x存放第k人训练图片
end
end

for n=1:max(c1)
b{n}=inv((x{n}')*x{n})*(x{n}')*y;%%计算b
yy{n}=x{n}*b{n};%%计算估算的y
end

d=[];
for n=1:max(c1)
d=[d,norm(yy{n}-y)];
end
[dd,i]=min(d);%%其中i为距离最小时的类别

if c1(num)~=i %%换成if d(c1(num))~=min(d)也行
    error=[error,num];
end
error_num{m}=error;%%将每一个测试文件中的识别错误图片序号储存
end%%每个测试文件中所有测试图片结束
right{m}=(size(c1,1)-size(error',1))/size(c1,1);
error=[];
end%%10个测试文件结束
s=0;
for k=1:10
    s=s+right{k};
end
ave_right=s/10  %%显示准确率平均值
time=toc        %%显示运行时间
right           %%显示10个测试文件准确率
error_num       %%显示识别错误图片序号,其中每个元胞下标即为第几个文件

4、运行结果

将图片素材Yale_32x32导入matlab中,再执行上面代码,可得运行结果:(ave_right:准确率平均值,time:运行时间,right:10个测试文件准确率,error_num:识别错误图片序号,其中每个元胞下标即为第几个文件)

在这里插入图片描述
平均准确率为0.7567,运行时间为1.7563s

猜你喜欢

转载自blog.csdn.net/weixin_40457801/article/details/88932083