基于人工智能的人脸识别技术论文(【人工智能】人脸识别系统【实验报告与全部代码】(QDU))
写在前面 ,防止有傻乎乎的同学直接全文复制出现问题 。
调用了 dlib 库的函数实现的人脸检测和人脸识别;
唯一的难点 ,也确实比较难,就是实现双线程控制 ,详见报告;
ResNet部分讲解copy的网上资料 ,当时并没有认真阅读ResNet论文 ,所以下面的知识点难免出现错误 ,不要作为论文阅读的参考;
同学人脸涉及隐私所以马赛克掉了 ,我不要脸所以留下自己的了 ,别被吓着;本来证件照那张照片是别的照片 ,非常吓人 ,所以就换了证件照 。《人工智能技术》课程设计
基于ResNet 、dlib+opencv人脸识别系统
指导老师: 王伟
摘要
自建小型数据集 ,采用Opencv中的级联分类器进行人脸检测,基于ResNet18残差神经网络进行人脸识别;后续采用dlib库中的人脸检测器 、特征点检测器和人脸识别模型进行训练和识别 ,效果相较于前者更佳
关键词:人脸识别、残差神经网络 、ResNet18 、Opencv 、dlib
目录
1 问题描述
2 相关技术介绍
2.1 ResNet18残差神经网络
2.1.1 退化现象
2.1.2 残差块
2.1.3 为什么叫残差网络
2.1.4 残差网络的背后原理
2.1.5 残差网络结构
2.2 dlib库
2.2.1 dlib库简介
2.2.2 两个核心文件和三个核心函数
2.2.3 人脸识别流程
2.2.4 人脸识别算法原理
3 系统整体框架
3.1 整体流程图
3.2 更新人脸信息库部分
3.3 人脸识别部分
3.4 进程切换部分
4 详细设计与实现
4.1 环境配置
4.2 dlib实现人脸识别
4.2.1 系统功能
4.2.2 设计思路
4.2.3 结果截图
4.3 ResNet实现人脸识别
4.3.1 设计思路
4.3.2 结果截图
5 总结与展望
5.1 难点分析
5.2 局限分析
5.3 总结
6 代码1 问题描述
人脸识别技术 ,是基于人的脸部特征信息进行身份识别的一种生物识别技术 。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸 ,进而对检测到的人脸进行脸部的一系列相关技术 ,通常也叫做人像识别 、面部识别 。
人脸识别技术是一种生物识别技术,可以用来确认用户身份 。人脸识别技术相比于传统的身份识别技术有很大的优势 ,主要体现在方便性上 。传统的身份认证方式诸如:密码 、PIN码 、射频卡片 、口令 、指纹等 ,需要用户记住复杂密码或者携带身份认证钥匙 。而密码 、卡片均存在丢失泄露的风险 ,相比于人脸识别 ,交互性于安全性都不够高 。人脸识别可以使用摄像头远距离非接触识别 ,相比于指纹免去了将手指按在识别区域的操作 ,可由摄像头自动识别 。
目前人脸识别技术已经广泛应用于安全、监控 、一般身份识别 、考勤、走失儿童搜救等领域 ,对于提升身份认证的效率起到了重要的作用。而且目前还有更深入的人脸识别的研究正在进行 ,包括性别识别 、年龄估计 、心情估计等 ,更高水平和更高准确率的人脸识别技术对于城市安全和非接触式身份认证有巨大的作用 。
一个简单的人脸识别系统,包括以下4个方面的内容 :
(1)人脸检测(Detection):即从各种不同的场景中检测出人脸的存在并确定其位置 。
(2)人脸规范化(Normalization):校正人脸在尺度、光照和旋转等方面的变化。
(3)人脸校验(Face verification ):采取某种方式表示检测出人脸和数据库中的已知人脸 ,确认两张脸是否是同一个人 。
(4)人脸识别(Recognition):将待识别的人脸与数据库中的已知人脸比较并进行匹配 。虽然人脸识别有很多其他识别无法比拟的优点 ,但是它本身也会受到多种因素影响,主要分为基础因素 、内在因素和外在因素。基础因素是人脸本身就相似 ,人的五官 、轮廓大致相同;内在因素是人的内部属性 ,如年龄变化 、精神状态 、化妆等;外部因素是成像质量的问题,比如相片的清晰程度 、有无眼镜 、口罩等遮挡 。对于人类来说 ,认出一个人是很容易的事情 ,对于计算机而言 ,图片是由多维数字矩阵表示的 ,识别任务难度大 。
2 相关技术介绍
2.1 ResNet18残差神经网络
2.1.1 退化现象在深度学习领域 ,一直以来从直觉上认为:网络层数越深提取到的特征就应该越高级 ,从而最终的效果就应该更好 。比如从LeNet5的5层网络发展到了VGG的19层网络 。于是为了达到更好的网络效果 ,研究人员又开始加深网络的层数 ,可这次迎来的确却是网络性能的降低 。随着网络加深 ,训练集的错误率反而更高,这种现象被称作为“网络退化 ” 。
当网络退化时 ,浅层网络能够达到比深层网络更好的训练效果 ,这时如果我们把低层的特征传到高层,那么效果应该至少不比浅层的网络效果差 ,或者说如果一个VGG-100网络在第98层使用的是和VGG-16第14层一模一样的特征 ,那么VGG-100的效果应该会和VGG-16的效果相同 。所以,可以在98层和14层之间添加一条直接映射来达到此效果 。
2.1.2 残差块残差网络是由一系列残差块组成的(图1) 。一个残差块可以用表示为:
x
l
+
1
=
x
l
+
F
(
x
l
,
W
l
)
(1)
x_{l+1}=x_l+F(x_l, W_l)\tag{1}
xl+1=xl+F(xl,Wl)(1) 残差块分成两部分直接映射部分和残差部分。x
l
x_l
xl是直接映射 ,反应在图1中是左边的曲线;F
(
x
l
,
W
l
)
F\left(x_l,W_l\right)
F(xl,Wl)是残差部分 ,一般由两个或者三个卷积操作构成 ,即图1中右侧包含卷积的部分 。图 1 残差块
图1中的Weight在卷积网络中是指卷积操作 ,addition是指单位加操作 。
在卷积网络中 ,
x
l
x_l
xl可能和x
l
+
1
x_{l+1}
xl+1的Feature Map的数量不一样 ,这时候就需要使用1×1卷积进行升维或者降维(图2)。这时 ,残差块表示为:
x
l
+
1
=
h
(
x
l
)
+
F
(
x
l
,
W
l
)
(2)
x_{l+1}=h(x_l)+F(x_l, W_l)\tag{2}
xl+1=h(xl)+F(xl,Wl)(2) 其中h
(
x
l
)
=
W
l
′
x
h\left(x_l\right)=W_l^\prime x
h(xl)=Wl′x 。其中W
′
W^\prime
W′是1×1卷积操作 ,但是实验结果1×1卷积对模型性能提升有限 ,所以一般是在升维或者降维时才会使用 。图 1 1×1残差块
2.1.3 为什么叫残差网络在统计学中,残差和误差是非常容易混淆的两个概念。误差是衡量观测值和真实值之间的差距 ,残差是指预测值和观测值之间的差距 。对于残差网络的命名原因 ,作者给出的解释是,网络的一层通常可以看做
y
=
H
(
x
)
y=H\left(x\right)
y=H(x) ,而残差网络的一个残差块可以表示为H
(
x
)
=
F
(
x
)
+
x
H\left(x\right)=F\left(x\right)+x
H(x)=F(x)+x ,也就是F
(
x
)
=
H
(
x
)
−
x
F\left(x\right)=H\left(x\right)-x
F(x)=H(x)−x,在单位映射中 ,y
=
x
y=x
y=x便是观测值 ,而H
(
x
)
H\left(x\right)
H(x)是预测值 ,所以F
(
x
)
F\left(x\right)
F(x)便对应着残差 ,因此叫做残差网络 。 2.1.4 残差网络的背后原理残差块一个更通用的表示方式是
y
l
=
h
(
x
l
)
+
F
(
x
l
,
W
l
)
x
l
+
1
=
f
(
y
l
)
\begin{align} y_l=h(x_l)+F(x_l,W_l)\tag{3}\\ x_{l+1}=f(y_l)\tag{4}\\ \end{align}
yl=h(xl)+F(xl,Wl)xl+1=f(yl)(3)(4) 现在我们先不考虑升维或者降维的情况 ,那么h
(
⋅
)
h\left(·\right)
h(⋅)是直接映射 ,f
(
⋅
)
f\left(·\right)
f(⋅)是激活函数 ,一般使用ReLU 。首先给出两个假设: 假设1:h
(
⋅
)
h\left(·\right)
h(⋅)是直接映射; 假设2:f
(
⋅
)
f\left(·\right)
f(⋅)是直接映射 。那么这时候残差块可以表示为:
x
l
+
1
=
x
l
+
F
(
x
l
,
W
l
)
(5)
x_{l+1}=x_l+F\left(x_l,W_l\right) \tag{5}
xl+1=xl+F(xl,Wl)(5)对于一个更深的层L ,其与l层的关系可以表示为:
x
L
=
x
l
+
∑
i
=
l
L
−
1
F
(
x
i
,
W
i
)
(6)
x_L=x_l+\sum_{i=l}^{L-1}F\left(x_i,W_i\right)\tag{6}
xL=xl+i=l∑L−1F(xi,Wi)(6) 这个公式反应了残差网络的两个属性: L层可以表示为任意一个比它浅的l层和他们之间的残差部分之和;x
L
=
x
+
∑
i
=
L
−
1
F
(
x
i
,
W
i
)
x_L=x_0+\sum_{i=0}^{L-1}F\left(x_i,W_i\right)
xL=x0+∑i=0L−1F(xi,Wi) ,L
L
L是各个残差块特征的单位累和,而MLP是特征矩阵的累积 。根据BP中使用的导数的链式法则 ,损失函数
ε
\varepsilon
ε关于x
l
x_l
xl的梯度可以表示为
∂
ε
∂
x
l
=
∂
ε
∂
x
L
∂
x
L
∂
x
l
=
∂
ε
∂
x
L
(
1
+
∂
∂
x
l
∑
i
=
l
L
−
1
F
(
x
i
,
W
i
)
)
=
∂
ε
∂
x
L
+
∂
ε
∂
x
L
∂
∂
x
l
∑
i
=
l
L
−
1
F
(
x
i
,
W
i
)
(7)
\frac{\partial\varepsilon}{\partial x_l}=\frac{\partial\varepsilon}{\partial x_L}\frac{\partial x_L}{\partial x_l}=\frac{\partial\varepsilon}{\partial x_L}\left(1+\frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F\left(x_i,W_i\right)\right)=\frac{\partial\varepsilon}{\partial x_L}+\frac{\partial\varepsilon}{\partial x_L}\frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F\left(x_i,W_i\right)\tag{7}
∂xl∂ε=∂xL∂ε∂xl∂xL=∂xL∂ε(1+∂xl∂i=l∑L−1F(xi,Wi))=∂xL∂ε+∂xL∂ε∂xl∂i=l∑L−1F(xi,Wi)(7) 上面公式反映了残差网络的两个属性: 在整个训练过程中 ,∂
∂
x
l
∑
i
=
l
L
−
1
F
(
x
i
,
W
i
)
\frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F\left(x_i,W_i\right)
∂xl∂∑i=lL−1F(xi,Wi)不可能一直为-1,也就是说在残差网络中不会出现梯度消失的问题 。∂
ε
∂
x
L
\frac{\partial\varepsilon}{\partial x_L}
∂xL∂ε 表示L
L
L层的梯度可以直接传递到任何一个比它浅的l
l
l层 。通过分析残差网络的正向和反向两个过程发现 ,当残差块满足上面两个假设时 ,信息可以非常畅通的在高层和低层之间相互传导,说明这两个假设是让残差网络可以训练深度模型的充分条件 。
下面说明直接映射是最好的选择 。
对于假设1 ,采用反证法 ,假设h
(
x
l
)
=
λ
l
x
l
h\left(x_l\right)=\lambda_lx_l
h(xl)=λlxl,那么这时候 ,残差块(图3.b)表示为
x
l
+
1
=
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!