实验六 基于回归模型的增量人脸识别探索性实验
1. 实验目的
● 了解数字图像的基本概念,了解人脸识别的基本含义;
● 掌握基于回归模型的人脸识别算法的基本原理;
● 了解Matlab 中基本的文件和图像处理命令。
2. 实验任务
利用各种增量人脸识别算法:基于回归模型的增量人脸识别算法,最远子空间增量分类算法、最近最远子空间增量分类算法或其他快速算法,选择其中的一种或几种算法,对给定的人脸数据库进行识别测试,得出识别正确率和(或)运行时间。
并与第5节不采用增量学习的算法进行比较,分析实验结果。
在实验过程中,可以察看原始的人脸图片,哪些人脸识别错误?该算法有哪些优缺点?改进方向是什么?
2.1实验原理
在本次实验中选取基于回归模型的增量人脸识别算法;
增量学习可以利用原有训练样本已得到的计算结果和新增数据来计算新的参数,不再需要原来的样本数据,从而降低学习的开销,提高算法处理数据的运行效率。
即主要推导求逆矩阵的增量学习公式,以提高LRC 处理较大规模数据的效率。
2.1.1预处理:对训练数据和测试数据对应的图像的像素都映射到[0,1]区间;将一个数据集剖分为训练数据集和测试数据集。
2.1.2读入训练数据,利用LRC 算法和逆矩阵的增量学习公式,得到
令(1)(1)111111111T
N N N N N T
N N N N N T
N N N N T N N N R
R
R
c R ⨯+⨯++++⨯+++++=∈=∈=∈=∈A X X A X X X x x x α
11111
11111记 T N N N N N N N N N R t c --+⨯+-++++⎡⎤=-⎣=∈⎦A A αααγ
*2
ˆmin () i i i i d d ==-y y y 通过推导可得
111111111111101110T N N N N N T N N N N T N N T t t ---++++-+-++⎡⎤⎡⎤⎡⎤=+-⎢⎥⎢⎥⎣⎦-⎣⎦⎣⎦
⎡⎤⎡⎤⎡⎤=+-⎢⎥⎢⎥⎣⎦-⎣⎦⎣⎦A A A 0A A 000ααγγ
111通过就可以完成对的更新,而不需要直接计算矩阵的逆,从而大大节省了训练时,间和。
N N n N x -
-+A X A
计算y X N
T N 1N A βˆ=-
2.1.3对每一个N βˆ,计算预测向量c ,...,2,1i ,βˆX y
ˆN N == 2.1.4测试数据的类别:计算原始图像向量与预测图像向量的距离: 对测试数据集中的每一个数据y ,利用残差最小,决定y 的类别。
2.1.5识别正确率和运行时间统计:将所有测试数据的预测类别与其真实的类别进行比对,计算识别正确率,同时利用tic 、toc 命令统计运行时间。
2.2算法与编程
clc %清屏
clear all %清除所有变量
for datasetsnum = 1: 5 %分别运行相应的几个数据集
Datasetsnum
di=[];
error=[];
acc=0;
tic
datasets =
{'Yale_32x32','Yale_64x64','YaleB_32x32','ORL_32x32','ORL_64x64'};
DataSetName = datasets{ datasetsnum };
for k=1:10;%每个数据集,需要处理10份
%% 数据的导入
train=dlmread([DataSetName,'\StTrainFile',num2str(k),'.txt']); %打开训练文件放进矩阵A
a1=train(:,1:end-1); %去掉训练文件数据最后一列(最末列代表第几个人,即类别)
a2=train(:,end); %取出训练文件数据最后一列(类别)
test=dlmread([DataSetName,'\StTestFile',num2str(k),'.txt']); %打开测试文件
b1=test(:,1:end-1);
b2=test(:,end);
%% 将数据分割
for number=1:size(b1) %测试照片序号从文件第1行到最末行
y=b1(number,:)'; %取出第number行数据(用于测试)
for i=1:max(a2) %第i个人
xi=[];
for j=1:size(a2) %从第一张照片循环到最后一张照片
if (a2(j)==i) %将所有同一个人的面部数据合并成一个矩阵xi
xi=[xi,a1(j,:)']; %构造矩阵
end
end
%增量求逆
Xi=xi(:,1);
train=inv(Xi'*Xi);
%% 求矩阵的增量
for m=2:size(xi,2)
aerfa=Xi'*xi(:,m);
c=xi(:,m)'*xi(:,m);
t=1/(c-aerfa'*train*aerfa);
gama=train'*aerfa;
k1=[train,zeros(size(train,1),1);zeros(1,size(train,2)),0]; k2=[gama;-1];
k3=[gama',-1];
train=k1+t*k2*k3;
Xi=[Xi,xi(:,m)];
end
%% 计算回归系数和残差
betai=train*xi'*y; %LRC算法计算最佳线性表示
di=[di,norm(y-xi*betai)]; %计算最佳线性表示时的误差值,并入di数组end
%% 判断类别
if(di(b2(number))~=min(di)) %测试
error=[error,number]; %error数组储存识别错误照片的序号end
di=[];
end
rate{k}=(size(b2)-size(error'))/size(b2); %识别成功率
err{k}=error;
error=[];
end
time=toc;
%% 输出结果
for k=1:10
acc=acc+rate{k};
output1 = [k rate{k}];
outfile1 = ['实验结果\LRC_output\',DataSetName,'.txt'];
dlmwrite(outfile1, output1, '-append', 'delimiter', ' ','newline', 'pc' );
end
accuracy=acc/10;
output2 = [accuracy time];
outfile2 = ['实验结果\LRC_output\',DataSetName,'avg.txt'];
dlmwrite(outfile2, output2, '-append', 'delimiter', ' ','newline',
'pc' );
2.3试验结果
2.3.1 ORL_32x32测试结果如图1-1所示:
图1-1 每个文件的识别正确率及识别错误人脸图像序号
图1-2 平均识别正确率及所用时间
由实验结果得,平均识别正确率约97.214%,运行时间17.281s。
2.3.2 ORL_64x64测试结果如图2-1所示:
图2-1 每个文件的识别正确率及识别错误人脸图像序号
图2-2平均识别正确率及所用时间
由实验结果得,平均识别正确率约97.214%,运行时间40.845s。
2.3.3 Yale_32x32测试结果如图3-1所示:
图3-1 每个文件的识别正确率及识别错误人脸图像序号
图3-2平均识别正确率及所用时间
由实验结果得,平均识别正确率约75.357%,运行时间4.9512s。
2.3.4 Yale_64x64测试结果如图4-1所示:
图4-1每个文件的识别正确率及识别错误人脸图像序号
图4-2平均识别正确率及所用时间
2.3.5 YaleB_32x32测试结果如图5-1所示:
图5-1每个文件的识别正确率及识别错误人脸图像序号
图5-2平均识别正确率及所用时间
2.4结果分析
经多个数据集的处理,发现增量算法的人脸识别的识别成功率较高。
3. 实验总结和实验感悟
通过本次实验,我掌握了增量学习求逆矩阵方法的技巧,也学会了更多矩阵运算的算法和如何用matlab实现相应的算法。
在这次实验过程中,运行的时候出现了不少的bug,我学会了如何用断点来一步步运行程序检测修改bug,经过多次的试验,查错,纠正,最终才得到一个能实现算法要求的的程序。
最终得到的这个程序虽然做大部分文件的人脸识别的时候所需时间较少,但是由于用的for循环较多导致运行到YaleB_32x32这个文件时耗时较长,需要继续努力改进。