OMP算法实现人脸识别_matlab完整代码

OMP_FACE——人脸识别系统

该软件包实现了基于稀疏表示的面部识别方法
程序相对便捷且易上手
主脚本中包含具体的一个例子
通常,通常遵循以下使用顺序即可实现人脸识别功能:

  1. 选择训练数据的数据库途径。
  2. 选择测试图像。
  3. 运行“training_data”功能以创建所有训练图像的二维矩阵。
  4. 运行“omp_fun ”功能以生成beta。
  5. 运行“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');

以下为某次的实验结果
在这里插入图片描述

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值