基于matlab人脸识别的课堂考勤打卡系统


源码不作任何修改,运行项目matlab版本2021及以上,注意:训练样本和识别率按钮不能使用
项目演示地址:链接: link
在这里插入图片描述


前言

在互联网飞速发展的时代,对于人的身份辨别已经越来越重要,人脸识别技术应运而生。在智慧城市建设的进程中,人脸识别系统能够识别出重要场所的往来人员的身份信息,能够向全社会提供智慧服务。动态人脸识别不需要当事人在人脸识别设备前面停留。因此,基于人脸识别进行考勤打卡具有操作简单、数据可控和应用广泛的特点,具有良好的用户体验。目前人脸识别算法分类主要有一下三种:

  • 特征脸方法(Eigenface),特征脸方法的主要思想是将输入的人脸图像看作是一个个的矩阵,然后通过人脸空间的一组正交向量,选择最主要的正交向量作为“主成分”来描述人脸空间。该方法优点是很大程度上压缩数据、有效的消除噪音。缺点是在降维之后会其中,使得特征信息丢失,图像变得模糊。
  • 费舍尔脸法(FisherFace),该算法使用 LDA3 算法来实现降维,与 PCA 算法"类似可以实现降维效果该方法优点是高维数据信息可以提升人脸识别算法的精确度。缺点是高维的数据计算量过大,导致速度降低。
  • PCA(Principal Component Analysis,主成分分析)是一种常用于数据降维和特征提取的统计技术。它通过线性变换将原始高维数据映射到一个较低维度的空间,同时尽可能保留数据的主要信息。对于一些高维度、特征之间相关性较高的数据,PCA降维可以有效减少特征的多重共线性,改善模型的泛化能力。因此本项目使用PCA进行人脸特征提取。


一、人脸检测

使用haar级联分类器进行人脸检测,先定位人脸用于后于分类,Haar级联算法实现了在四个主要阶段进行图像训练:确定 Haar-like 特征、获得积分图像、AdaBoost 训练和使用级联分类器进行分类。Haar-like 进行特征值的计算时,为避免浪费计算资源,使用积分加速的计算方法。积分加速的计算方法如下公式:
在这里插入图片描述
式中,i(x,y) 表示图像中在(x,y)位置的像素值。特征提取完成后,再使用 Adaboost 分类器选择可以将类别分开来的最好特征。分类器定义如下:
在这里插入图片描述
公式中 p 是为了使得不等式的方向不变而设置的参数,而 0 表示是否为人脸的阈值,f(x) 表示输入大小为 w 和 h 的滑动窗口图像x经过上述算法提取到的特征值。在获取一个分类器之后,需要将若干分类器进行级联,以此来去除较多窗口。

人脸检测代码如下:

function [rect,face_im] = get_face_rect(im,face_detector)
 % 检查是否提供了人脸检测器,如果没有则使用默认的人脸检测器
if nargin < 2
     % 使用 Haar 特征级联分类器作为默认人脸检测器
    face_detector = vision.CascadeObjectDetector('haarcascade_frontalface_default.xml');
end
% 检测人脸区域,返回矩形框信息
rect = step(face_detector, im);
% 如果检测到人脸,裁剪并调整人脸图像大小
face_im = imresize(imcrop(im, rect(1,:)), [100 80], 'bilinear');

代码逻辑:

  • 人脸检测器的初始化:代码首先检查是否传入了人脸检测器对象。如果没有提供,它使用默认的 Haar 特征检测器。

  • 人脸检测:step 函数从输入图像中检测人脸,返回一个或多个矩形框。如果检测到多个脸部,代码只处理第一个。

  • 裁剪和调整大小:将检测到的矩形区域裁剪出来,并将其缩放至固定大小(100x80像素),以便于后续的处理,如特征提取或分类。

二、人脸识别

人脸识别的关键在于如何有效提取人脸特征以及与人脸库进行匹配,本质上是一个分类识别的过程。为了便于进行不同算法的组合,首先构建人脸库,然后选择基础的PCA方法进行特征提取,最后通过SVM进行分类识别,并将特征提取模型、分类识别模型进行存储,便于集成调用。具体可以参考代码。

  1. 构建人脸库:
    在进行人脸识别之前,首先需要建立一个包含不同个体人脸图像的数据库。该数据库通常包含多个类别(对应不同个体)的多张人脸图像,通常还会进行预处理工作,如灰度化、对齐、归一化等,以确保图像的尺寸和亮度一致。这一操作不仅可以提高特征提取的效果,还能提升模型的识别准确性。
  2. PCA特征提取:
    PCA(主成分分析)是一种常用的降维技术,能够通过线性变换从高维数据中提取出最具代表性的主成分。在人脸识别中,PCA可以用于从人脸图像中提取重要的特征。具体来说,PCA会将每一张人脸图像展平成一个向量,计算出其协方差矩阵,然后通过特征值分解找到数据变化最大的方向(主成分),再将数据投影到低维空间中,保留最重要的特征。
  3. 分类器选择 - SVM:
    在特征提取完成之后,需要使用分类器对提取到的特征进行分类。在人脸识别任务中,SVM(支持向量机)是一种常用的分类器。SVM通过构建一个超平面来区分不同类别的人脸图像,它在处理高维特征空间的分类问题时表现非常优秀,尤其适合处理小样本的分类问题。
  4. 在完成特征提取和分类模型的训练后,可以将这些模型进行存储,便于后续的集成调用。具体而言,可以存储PCA的投影矩阵和SVM分类模型。这样,当新的图像输入时,系统可以直接加载模型,将图像进行特征提取并分类,减少了重复训练的时间,提升了系统的效率。

在整个流程中,构建人脸库、使用PCA进行特征提取、选择SVM分类器进行分类是人脸识别中的核心步骤。PCA通过降维减少了数据的维度,SVM则通过构建超平面完成分类任务。存储并集成这些模型后,系统可以快速、高效地进行人脸识别,适用于考勤、安防监控等多种场景。
人脸识别核心代码如下:

clc; 
rand('seed', 0)
%% 数据读取
% 数据集
db = fullfile(pwd, 'db');
sub_dbs = dir(db);
% 拆分比例
train_rate = 0.7;
% 初始化训练集、测试集
class_names = [];
train_files = []; train_labels = [];
test_files = []; test_labels = [];
% 遍历读取
for i = 1 : length(sub_dbs)
    if ~(sub_dbs(i).isdir && ~isequal(sub_dbs(i).name, '.') && ~isequal(sub_dbs(i).name, '..'))
        % 如果不是有效目录
        continue;
    end
    % 当前类别信息
    class_names{end+1} = sub_dbs(i).name;
    % 图像文件列表
    files_i = ls(fullfile(sub_dbs(i).folder, sub_dbs(i).name, '*.jpg'));
    % 随机排序
    files_i = files_i(randperm(size(files_i,1)),:);
    % 获取训练集和测试集
    for j = 1 : size(files_i, 1)
        if j < size(files_i, 1)*train_rate
            % 训练集
            train_files{end+1} = fullfile(sub_dbs(i).folder, sub_dbs(i).name, strtrim(files_i(j,:)));
            train_labels(end+1) = length(class_names);
        else
            % 测试集
            test_files{end+1} = fullfile(sub_dbs(i).folder, sub_dbs(i).name, strtrim(files_i(j,:)));
            test_labels(end+1) = length(class_names);
        end
    end
end

% 存储模型
save model.mat class_names mean_vec V svm_model
save accuracy.mat svm_acc

三、GUI界面实现

在这里插入图片描述
界面流程:

  • 图像加载与显示:用户可以通过文件选择器加载图像,系统显示原始图像。

  • 人脸检测与裁剪:通过 Haar 级联分类器,系统检测人脸并裁剪图像,显示处理后的人脸图像。

  • 人脸识别与打卡:通过 SVM 分类器,利用 PCA 降维特征识别人脸,并记录打卡时间。

代码如下:

function varargout = MainForm(varargin)
% MAINFORM MATLAB code for MainForm.fig
%      MAINFORM, by itself, creates a new MAINFORM or raises the existing
%      singleton*.
%
%      H = MAINFORM returns the handle to a new MAINFORM or the handle to
%      the existing singleton*.
%
%      MAINFORM('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in MAINFORM.M with the given input arguments.
%
%      MAINFORM('Property','Value',...) creates a new MAINFORM or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before MainForm_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to MainForm_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help MainForm

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
    'gui_Singleton',  gui_Singleton, ...
    'gui_OpeningFcn', @MainForm_OpeningFcn, ...
    'gui_OutputFcn',  @MainForm_OutputFcn, ...
    'gui_LayoutFcn',  [] , ...
    'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

function InitAxes(handles)
clc;
axes(handles.axes1); cla reset; axis on; box on;
set(gca, 'XTickLabel', '', 'YTickLabel', '');
axes(handles.axes2); cla reset; axis on; box on;
set(gca, 'XTickLabel', '', 'YTickLabel', '');

% --- Executes just before MainForm is made visible.
function MainForm_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to MainForm (see VARARGIN)
addpath(genpath('./libsvm-3.21'));
% Choose default command line output for MainForm
handles.output = hObject;
InitAxes(handles)
handles.vid = 0;
handles.frame2 = 0;
handles.Io = 0;
% Update handles structure
guidata(hObject, handles);

% UIWAIT makes MainForm wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = MainForm_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

function fileStr = SnapImage()
foldername = fullfile(pwd, 'images_result');
fileStr = 0;
if ~exist(foldername, 'dir')
    mkdir(foldername);
end
[FileName,PathName,~] = uiputfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';...
    '*.*','All Files' },'保存',...
    fullfile(foldername, 'im.jpg'));
if isequal(FileName, 0) || isequal(PathName, 0)
    return;
end
fileStr = fullfile(PathName, FileName);

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if isequal(handles.frame2, 0)
    return;
end
fileStr = SnapImage();
if isequal(fileStr, 0)
    return;
end
imwrite(handles.frame2, fileStr);
questdlg('完毕!', ...
    '提示', ...
    '确定','确定');

代码实现了一个较为完整的 GUI 人脸识别系统,能够在智慧城市或办公场景中进行考勤打卡,具有友好的界面和较高的自动化程度。


总结

在课堂考勤打卡场景中,人脸识别技术通过PCA特征提取与SVM分类算法的结合,形成了一个高效且稳定的集成系统。首先,通过构建人脸库与预处理图像,确保了系统的基础数据质量。接着,使用PCA技术提取人脸的主要特征,压缩了数据的维度,保留了有效信息,并有效减少了噪声的影响。随后,SVM分类器基于提取的特征进行准确的分类,判断出每位学生的身份。通过将特征提取和分类模型存储为集成模块,系统可以在考勤打卡的实际应用中高效运行。当学生进入教室时,系统能够在动态环境下迅速完成身份识别,不需要人工操作,极大提高了课堂管理的便捷性。考勤打卡过程不仅简单、快速,且具有较高的准确性和良好的用户体验,适合于大规模、多场景的智慧校园建设。这一集成人脸识别系统在考勤打卡场景中的成功应用,为未来更多基于人脸识别技术的智能服务提供了广阔的应用前景,也为智慧城市的发展提供了有效的技术支持。

源码下载

在本专栏置顶的试读文章哪下载,直达:试读源码在这里下载

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挂科边缘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值