OMP_FACE——人脸识别系统
该软件包实现了基于稀疏表示的面部识别方法
程序相对便捷且易上手
主脚本中包含具体的一个例子
通常,通常遵循以下使用顺序即可实现人脸识别功能:
- 选择训练数据的数据库途径。
- 选择测试图像。
- 运行“training_data”功能以创建所有训练图像的二维矩阵。
- 运行“omp_fun ”功能以生成beta。
- 运行“recorgnize”功能以获取训练数据库中识别图像的名称。
为了方便起见,我准备了样本培训和测试数据库,这些都是组成部分 。
只需将培训和测试数据库放入指定的路径
然后跟随对话框,该对话框将在运行
“ main.m”时出现。
_作者: M宝可梦
_E_mail: 1195653686@qq.com
参考文献:
1.《Robust Face Recognition via Sparse Representation》John Wright
2.《改进SRC算法在人脸识别中的应用》_雷明军
以下为完整的代码块,获得人脸数据以及整个工程或交流算法可以联系作者QQ1195653686
function A = training_data(TrainingSetPath)
% 此部分函数实现对训练人脸数据库的输入和重新塑性
% TrainingSetPath: 训练数据库的存储路径
TrainFiles = dir(TrainingSetPath);
% 查询 训练类别的数目
Train_Class_Number = 0;
for i = 1:size(TrainFiles,1)
if not(strcmp(TrainFiles(i).name,'.')|strcmp(TrainFiles(i).name,'..')|strcmp(TrainFiles(i).name,'Thumbs.db'))
Train_Class_Number = Train_Class_Number + 1;
end
end
A = [];
Each_Class_Train_Num = 5; % 令每一类下前五张图像作为训练图像
for i = 1 : Train_Class_Number
str='';
if i <= 9
str = strcat(TrainingSetPath,'\00',int2str(i),'\');
else
str = strcat(TrainingSetPath,'\0',int2str(i),'\');
end
for j=1:Each_Class_Train_Num
tmpstr='';
tmpstr=strcat(str,'0',int2str(j),'.png');
img=imread(tmpstr);
if length(size(img))>2
img=rgb2gray(img);
end
vecimg=double(reshape(img,1,size(img,1)*size(img,2)));
A=cat(1,A,vecimg);
end
end
A = A';
end
% 参考文献
% 1.https://blog.csdn.net/jzwong/article/details/78446161
% 2.https://download.csdn.net/download/weixin_46257458/12185316
% OMP的函数
% s-测量;
% T-观测矩阵;
% N-向量大小
function hat_y=omp_fun(s,T,K)
N = size(T,2);
Size=size(T); % 观测矩阵大小
M=Size(1); % 测量
hat_y=zeros(1,N); % 待重构的谱域(变换域)向量
Aug_t=[]; % 增量矩阵(初始值为空矩阵)
r_n=s; % 残差值
for times=1:K % 迭代次数(稀疏度是测量的1/4)
for col=1: N % 恢复矩阵的所有列向量
product(col)=abs(T(:,col)'*r_n); % 恢复矩阵的列向量和残差的投影系数(内积值)
end
[~, pos]=max(product); % 最大投影系数对应的位置
Aug_t=[Aug_t,T(:,pos)]; % 矩阵扩充
T(:,pos)=zeros(M,1); % 选中的列置零(实质上应该去掉,为了简单我把它置零)
aug_y=(Aug_t'*Aug_t)^(-1)*Aug_t'*s; % 最小二乘,使残差最小
r_n=s-Aug_t*aug_y; % 残差
pos_array(times)=pos; % 纪录最大投影系数的位置
if sum(r_n.^2) < 1e-6 % 残差足够小
break;
end
end
hat_y(pos_array)=aug_y; % 重构的向量
end
% 参考文献:
% 1.https://zhuanlan.zhihu.com/p/52276805
% 2.https://blog.csdn.net/xiaoxiao133/article/details/90228898
function [Equivalent_Image] = recorgnize(beta,TrainingSetPath)
%
% 识别: 根据beta所查询出的与测试图像相关性最强的训练图像的位置
% 找出匹配类别下的类别名和图像名
% 由此确定匹配图像的名称,便于下一步的显示
%
[m, ith] = max(beta);
temp = ith;
ith = rem( ith,5 );
if ith == 0
temp = ((temp-ith)/5);
else
temp = ((temp-ith)/5)+1;
end
if temp <=9
if ith == 0
Equivalent_Image = strcat(TrainingSetPath,'\00',int2str(temp),'\0',int2str(5),'.png');
else
Equivalent_Image = strcat(TrainingSetPath,'\00',int2str(temp),'\0',int2str(ith),'.png');
end
else
if ith == 0
Equivalent_Image = strcat(TrainingSetPath,'\0',int2str(temp),'\0',int2str(5),'.png');
else
Equivalent_Image = strcat(TrainingSetPath,'\0',int2str(temp),'\0',int2str(ith),'.png');
end
end
%
% 主函数控制实现各函数调用
% 说明: _只需修改本脚本中第19行测试图像的名称即可,修改原则见18行
% _选定人脸数据库为ORL,共计40个人,每个人下10张图像,共计400张图片
% _该测试选取了每个人下的五张图片作为训练数据集
%
clear;
clc;
% 选择训练人脸数据库所在的文件
TrainingSetPath = uigetdir();
A = training_data(TrainingSetPath);
% 输入需要测试的人脸图像,修改文件路径后,只需修改类别路径和图像名称
Test_Image = 'C:\Users\yuson\Desktop\OMP_FACE\FaceDB_orl\011\09.png';
% 对测试图像进行重塑
y = imread(Test_Image);
y = double(reshape(y,size(y,1)*size(y,2),1));
% OMP 算法寻找于测试人脸图像相关性最强的训练图像
beta = omp_fun(y,A,200);
Equivalent_Image = recorgnize(beta,TrainingSetPath);
% 对测试图像和训练图像进行显示
imshow(Test_Image);
title('Test Image');
figure;
imshow(Equivalent_Image);
title('Equivalent Image');
以下为某次的实验结果