毕业设计-基于深度学习的人脸识别方法

Posted HaiLang_IT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了毕业设计-基于深度学习的人脸识别方法相关的知识,希望对你有一定的参考价值。

目录

前言

课题背景和意义

实现技术思路

一、人脸识别介绍

二、基于深度学习的人脸识别方法

实现效果图样例

最后


前言


    📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

🚀对毕设有任何疑问都可以问学长哦!

选题指导: https://blog.csdn.net/qq_37340229/article/details/128243277

大家好,这里是海浪学长毕设专题,本次分享的课题是

🎯毕业设计-基于深度学习的人脸识别方法

课题背景和意义

人脸识别与虹膜识别、指纹识别、步态识别等其它生物特征识别技术相比,具有自然、便捷、用户体验友好等独特优势,因而受到了学术界和工业界的广泛关注.近年来,在深度学习技术的驱动下,人脸识别技术取得了突破性进展,在面对表情、姿态、光照、遮挡等外在干扰因素时,仍表现出较好的鲁棒性。特别地,基于深度学习的人脸识别技术已广泛应用于安防、金融、教育、交通、新零售等应用领域。人脸识别是一种依据人脸图像进行身份识别的生物特征识别技术。人脸识别 的研究始于 20 世纪 60 年代,与虹膜识别、指纹识别、步态识别等生物特征识别技术相比,人脸识别因其便捷、高效、易普及的优点成为最受关注的研究问题之一。通常,其难点在于人脸结构相似性导致不同个体之间差异不显著,而同一个体在不同表情、姿态、年龄、光照、遮挡、妆饰等干扰因素下变化显著。因而人脸识别技术需要在类内变化干扰的情况下尽可能增大类间差距以区分不同个体,其关键在于从人脸图像中提取有利于识别的特征。

实现技术思路

一、人脸识别介绍

早期基于人脸几何特征的识别方法[2–4] 使用眼睛、鼻子、嘴巴等关键部位之间的关系 (如角度、距离) 构建人脸描述子,此类方法忽略了人脸纹理、外观包含的有用信息,因此,识别效果一般.基于子空间学习的识别方法如 EigenfacesFisherfaces,将原始数据整体映射到低维人脸子空间,这类方法很大程度上推动了人脸识别技术的发展.

二、基于深度学习的人脸识别方法

基于深度学习的人脸识别流程主要包括人脸预处理 ( 检测、对齐、标准化、数据增强等) 、特征学习、特征比对等步骤,其中特征学习是人脸识别的关键,如何提取强判别性、强鲁棒性的特征是人脸识别的研究重点.

人脸预处理 基于深度学习的人脸识别方法预处理流程通常包括人脸检测、关键点定位、人脸姿态及灰度标准化、人脸数据裁剪及增强。 1) 人脸检测 人脸检测指检测出人脸图像中人脸的具体位置,通常用矩形框框出人脸.人脸检测方法主要分为 Fast R-CNN 系列、级联 CNN 系列 以及 SSD 系列。

2) 人脸对齐 检测出人脸在图像中的位置后需要进行人脸对齐操作,人脸对齐指检测人脸特征点 3) 人脸标准化 为了算法的稳定性,一般会对图像进行一些数值标准化的处理,对不同光强、不同光源方向下得到的人脸图像进行补偿,以减弱由于光照变化造成的图像信号变化 4) 人脸数据增强 数据增强是基于深度学习的人脸识别方法常用的预处理步骤,目的是为了增加数据量. 人脸图像深度特征学习 深度卷积神经网络的网络结构和损失函数是影响人脸深度特征学习及识别性能的两个关键因素。VGGNet,GoogLeNet]以 及 ResNet 这三类网络相继被提出并成功被应用于物体识别和人脸识别。 人脸识别网络结构 1)VGGNet 的突出 表现在于使用多个 3 × 3 的卷积核替代 AlexNet 7 × 7 的卷积核,小的卷积核一方面可以 减少参数,另一方面增加了非线性映射,有助于提升网络的拟合能力. 2) GoogLeNet 不同于 VGGNet AlexNet GoogLeNet 使用 Inception 模块构建模块化结构,在模块中使用不同大小的卷积核实现多尺度特征的融合.

3) ResNet 网络加深理应有利于提升网络的性能,但深度增加也给训练带来难度.ResNet 的核心策略是增加跨层连接,直接学习层与层之间的残差.ResNet 收敛速度快,目前最新的基于深度学习的二维人脸识别方法大部分都采用残差模块.

人脸识别损失函数

损失函数可以指导神经网络将人脸图像映射到不同的特征空间,选择合适的损失函数有利于在特征空间将不同类别的人脸图像区分开,提升人脸识别的精度. 1) Softmax loss Softmax loss 是一种常用于人脸图像多分类问题的损失函数. Softmax 激活函数的作用是将模型预测结果进行归一化操作,使输出结果为 [0 , 1] 区间内的概率值.

其中 x i 表示第 i 个人脸图像的特征向量, y i x i 真实的类别标签, L i 表示损失, b 为偏置,W T y i W T j 分别表示将 x i 判别为 y i 类和 j 类的权向量, C 表示总类别数。 2) Large Margin Softmax (L-Softmax) Softmax loss 分类的原理是当人脸图像特征 x i 来自类别 y i 时满足 W T y i x i > W T j= y i x i,  可写成

其中 W i 为权向量, C 表示总类别数, θ j,i W j x i 之间的夹角, m 用于控制类间距离,ψ ( · ) 是为便于梯度反向传播而设计的单调递减函数。

下图为两种不同损失函数对应的深度特征可视化:

特征比对

在损失函数的指导下利用海量有标记的人脸图像样本对网络参数进行有监督训练.测试阶段,将待测试的人脸图像输入训练好的神经网络提取人脸深度特征,使用最近邻分类器通过比较深度特征之间的距离进行身份识别或认证。假设人脸图像 xi xj 的特征分别为 f(xi) f(xj ),当特征之间的距离在预先设定的阈值 τ 范围内时,即

 则认为这两幅图像来自同一个人。

人脸数据集 基于深度学习的人脸识别方法需要大量训练数据,数据集的发展也反映了人脸识别技术的发展.与早期实验室环境下采集获得的人脸数据不同,2007 年公开的 LFW数据集开启了无约束场景下人脸识别研究的新阶段,有力地推动了无约束人脸识别的发展.随后不断有更大、更多样化的人脸数据集被发布。 评级标准 1)身份认证 一般使用 ROC 曲线作为人脸识别方法的评价指标, ROC 曲线由两项指标确定,分别是接受率 (Ture Alarm Rate, TAR) ,误识率 (False Alarm Rate, FAR) 2) 身份识别 一般使用身份识别精度作为识别方法的评价指标,计算方式简单明了,与认证准确度类似,计算识别正确的比例即可.比较特别的是,在大规模分类问题中常使用 K 次命中率作为评价的标准,即真实标签出现在预测结果前 K 名之内,则认为预测正确。 3) 基于深度学习人脸识别方法比较 随着深度卷积神经网络的发展,目前人脸识别方法一般只使用单个网络,并且采用的网络结构以 ResNet 为主,例如 DeepVisage SphereFace CosFace   等.研究热点也从网络结构设计转移至损失函数的设计,例如 L-Softmax NormFace 、 ArcFace 等方法将度量学习的思想引入 Softmax loss 并提升了人脸识别模型的性能。各种方法的精度比较:

实现效果图样例

基于深度学习的人脸识别:

人脸识别之身份认证:

我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。

毕设帮助,疑难解答,欢迎打扰!

最后

人脸识别---基于深度学习和稀疏表达的人脸识别算法

1 介绍

本文将介绍一种基于深度学习和稀疏表达的人脸识别算法。

首先。利用深度学习框架(VGGFace)提取人脸特征;其次,利用PCA对提取的特征进行降维;最后,利用稀疏表达分类实现特征匹配。我採用CMC曲线评价在AR数据库上的识别性能。最后我还提供了整个过程的code。


2 基于深度学习和稀疏表达的人脸识别算法

2.1 利用VGGFace提取人脸特征

以下介绍利用VGGFace对人脸特征进行提取。我们利用的数据库为AR数据库。数据库的图比例如以下:
技术分享
接下来我们利用VGGFace对人脸特征进行提取。

  • 我们利用Matconvent作为深度学习框架,Matconvent能够到http://www.vlfeat.org/matconvnet/上下载,我採用的1.0-beta19。也能够下载最新版本号。
  • VGGFace的deep model能够到http://www.robots.ox.ac.uk/~vgg/software/vgg_face/上进行下载,我採用的是Matconvnet的版本号。模型大概1.01G。
    如果VGGFace的模型为F,图片为x。那么提取的特征为y=F(x).

2.2 PCA对人脸特征进行降维

利用pca对数据降维,VGGFace提取出的特征为4096维。对提取的特征进行降维最后降到128维。

2.3 稀疏表达的人脸匹配

数据库一共同拥有C个人,每个人有k张图片,那么每个人的特征字典为Dc={fc1,fc2,,fck}, 那么C个人就组成一个Gallery特征字典D={D1,D2,?,DC}。给一定probe人脸x, 那么特征为y=F(x), 则稀疏表达能够有例如以下表达:

||x||1,Dx=y

当中x为稀疏编码。


最后我们能够利用稀疏表达分类器来识别这个probe人脸x:

mincrc(y)=||y?Dcδc(x)||22

3 Code

function cnn_vgg_faces()
%CNN_VGG_FACES  Demonstrates how to use VGG-Face
clear all
clc
addpath PCA
run(fullfile(fileparts(mfilename(‘fullpath‘)),...
    ‘..‘, ‘matlab‘, ‘vl_setupnn.m‘)) ;
net = load(‘data/models/vgg-face.mat‘) ;
list = dir(‘../data/AR‘);
C = 100;
img_list = list(3:end);
index = [1, 10];
%% 建立基于VGGFace的Gallery字典
dictionary = [];
for i = 1:C
    disp(i)
    numEachGalImg(i) = 0;
    for j = 1:2
        im = imread(strcat(‘../data/AR/‘,img_list((i-1)*26+index(j)).name));
        im_ = single(im) ; % note: 255 range
        im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
        for k = 1:3
            im1_(:,:,k) = im_;
        end
        im2_ = bsxfun(@minus,im1_,net.meta.normalization.averageImage) ;
        res = vl_simplenn(net, im2_) ;
        feature_p(:,j) = res(36).x(:);
    end
    numEachGalImg(i) = numEachGalImg(i) + size(feature_p,2);
    dictionary = [dictionary feature_p];
end
%% PCA对特征进行降维
FaceContainer = double(dictionary‘);
[pcaFaces W meanVec] = fastPCA(FaceContainer,128);
X = pcaFaces;
[X,A0,B0] = scaling(X);
LFWparameter.mean = meanVec;
LFWparameter.A = A0;
LFWparameter.B = B0;
LFWparameter.V = W;
imfo = LFWparameter;
train_fea = (double(FaceContainer)-repmat(imfo.mean, size(FaceContainer,1), 1))*imfo.V;
dictionary = scaling(train_fea,1,imfo.A,imfo.B);
for i = 1:size(dictionary, 1)
    dictionary(i,:) = dictionary(i,:)/norm(dictionary(i,:));
end
dictionary = double(dictionary);
totalGalKeys = sum(numEachGalImg);
cumNumEachGalImg = [0; cumsum(numEachGalImg‘)];

%% 利用稀疏编码进行特征匹配
% sparse coding parameters
if ~exist(‘opt_choice‘, ‘var‘)
    opt_choice = 1;
end
num_bases = 128;
beta = 0.4;
batch_size = size(dictionary, 1);
num_iters = 5;
if opt_choice==1
    sparsity_func= ‘L1‘;
    epsilon = [];
elseif opt_choice==2
    sparsity_func= ‘epsL1‘;
    epsilon = 0.01;
end

Binit = [];

fname_save = sprintf(‘../results/sc_%s_b%d_beta%g_%s‘, sparsity_func, num_bases, beta, datestr(now, 30));

AtA = dictionary*dictionary‘;
for i = 1:C
    fprintf(‘%s  \n‘,num2str(i));
    tic
    im = imread(strcat(‘../data/AR/‘,img_list((i-1)*26+26).name));
    im_ = single(im) ; % note: 255 range
    im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
    for k = 1:3
        im1_(:,:,k) = im_;
    end
    im2_ = bsxfun(@minus,im1_,net.meta.normalization.averageImage) ;
    res = vl_simplenn(net, im2_) ;
    feature_p = res(36).x(:);
    feature_p  = (double(feature_p)‘-imfo.mean)*imfo.V;
    feature_p = scaling(feature_p,1,imfo.A,imfo.B);
    feature_p = feature_p/norm(feature_p, 2);
    [B S stat] = sparse_coding(AtA,0, dictionary‘, double(feature_p‘), num_bases, beta, sparsity_func, epsilon, num_iters, batch_size, fname_save, Binit);
    for m = 1:length(numEachGalImg)
        AA = S(cumNumEachGalImg(m)+1:cumNumEachGalImg(m+1),:);
        X1 = dictionary(cumNumEachGalImg(m)+1:cumNumEachGalImg(m+1),:);
        recovery = X1‘*AA;
        YY(m) = mean(sum((recovery‘-double(feature_p)).^2));
    end
    score(:,i) = YY;
    toc
end
accuracy = calrank(score1,1:1,‘ascend‘);
fprintf(‘rank-1:%d/%%\n‘,accuracy*100);

文中以
calrank能够计算得到CMC曲线:參见http://blog.csdn.net/hlx371240/article/details/53482752
最后得到rank-1为82%。
整个代码见资源,因为vgg-face 太大,能够自己到vgg的官网下载,然后放到../matconvnet-1.0-beta19\examples\data\models中。

以上是关于毕业设计-基于深度学习的人脸识别方法的主要内容,如果未能解决你的问题,请参考以下文章

深度学习基于卷积神经网络(tensorflow)的人脸识别项目

深度学习基于卷积神经网络(tensorflow)的人脸识别项目

数字图像处理课程设计基于非深度学习方法实现身份证定位与正反面识别

人脸识别技术全面总结:从传统方法到深度学习

毕业设计 深度学习 机器视觉 人脸识别系统 - opencv python

Android课程设计 人脸识别签到