[深度概念]·简述人脸识别开发原理

article/2025/10/26 10:40:12

0、文章概述

 

我们知道人脸识别在这几年应用相当广泛,人脸考勤,人脸社交,人脸支付,哪里都有这黑科技的影响,特别这几年机器学习流行,使得人脸识别在应用和准确率更是达到了一个较高的水准。

下面将带着大家揭秘下这项黑科技的原理。

 

1、人脸识别流程

人脸识别是由一系列的几个相关问题组成的:

  1. 首先找到一张图片中的所有人脸。
  2. 对于每一张脸来说,无论光线明暗或面朝别处,它依旧能够识别出是同一个人的脸。
  3. 能够在每一张脸上找出可用于他人区分的独特之处,比如眼睛多大,脸有多长等等。
  4. 最后将这张脸的特点与已知所有人脸进行比较,以确定这个人是谁。

第一步:找出所有的面孔

很显然在我们在人脸识别的流程中得首先找到图片中的人脸。我们在使用手机或相机拍照时都会有人像模式,它能轻松的检测出人脸的位置,帮助相机快速对焦。

这里写图片描述

我们得感谢 保罗·比奥拉(Paul Viola)和迈克尔·琼斯(Michael Jones)在2000年发明了一种能够快速在廉价相机上运行的人脸检测方法,人脸检测在相机上的应用才成为主流。然而现在我们有更可靠的解决方案HOG(Histogram of Oriented Gradients)方向梯度直方图,一种能够检测物体轮廓的算法。

首先我们把图片灰度化,因为颜色信息对于人脸检测而言没什么用。

这里写图片描述

我们分析每个像素以及其周围的像素,根据明暗度画一个箭头,箭头的指向代表了像素逐渐变暗的方向,如果我们重复操作每一个像素,最终像素会被箭头取代。这些箭头被称为梯度(gradients),它们能显示出图像从明亮到黑暗流动的过程。

这里写图片描述

分析每个像素对我们来说有点不划算,因为它太过细节化了,我们可能会迷失在像素的海洋里,我们应该从更高的角度观察明暗的流动。

为此我们将图像分割成16x16像素的小方块。在每个小方块中,计算出每个主方向有多少个剃度(有多少指向上,指向右上,指向右等)。然后用指向性最强的那个方向箭头来代替原来那个小方块。

这里写图片描述

最终结果,我们把原始图像转换成一个非常简单的HOG表达形式,它可以很轻松的捕获面部的基本结构。

为了在HOG图像中找到脸部,我们需要做的是,与已知的一些HOG图案中,看起来最相似的部分。这些HOG图案都是重其他面部训练数据中提取出来的。

第二步:脸部的不同姿势

我们已经找出了图片中的人脸,那么如何鉴别面朝不同方向的人脸呢?

对于电脑来说朝向不同的人脸是不同的东西,为此我们得适当的调整扭曲图片中的人脸,使得眼睛和嘴总是与被检测者重叠。

为了达到目的我们将使用一种面部特征点估计(face landmark estimation)的算法。其实还有很多算法都可以做到,但我们这次使用的是由瓦希德·卡奇米(Vahid Kazemi)和约瑟菲娜·沙利文(Josephine Sullivan)在 2014 年发明的方法。

这一算法的基本思路是找到68个人脸上普遍存在的点(称为特征点, landmark)。

这里写图片描述

  • 下巴轮廓17个点 [0-16]
  • 左眉毛5个点 [17-21]
  • 右眉毛5个点 [22-26]
  • 鼻梁4个点 [27-30]
  • 鼻尖5个点 [31-35]
  • 左眼6个点 [36-41]
  • 右眼6个点 [42-47]
  • 外嘴唇12个点 [48-59]
  • 内嘴唇8个点 [60-67]

有了这68个点,我们就可以轻松的知道眼睛和嘴巴在哪儿了,后续我们将图片进行旋转,缩放和错切,使得眼睛和嘴巴尽可能的靠近中心。

现在人脸基本上对齐了,这使得下一步更加准确。

第三步:给脸部编码

我们还有个核心的问题没有解决, 那就是如何区分不同的人脸。

最简单的方法就是把我们第二步中发现的未知人脸与我们已知的人脸作对比。当我们发现未知的面孔与一个以前标注过的面孔看起来相似的时候,就可以认定他们是同一个人。

我们人类能通过眼睛大小,头发颜色等等信息轻松的分辨不同的两张人脸,可是电脑怎么分辨呢?没错,我们得量化它们,测量出他们的不同,那要怎么做呢?

实际上,对于人脸这些信息很容易分辨,可是对于计算机,这些值没什么价值。实际上最准确的方法是让计算机自己找出他要收集的测量值。深度学习比人类更懂得哪些面部测量值比较重要。

所以,解决方案是训练一个深度卷积神经网络,训练让它为脸部生成128个测量值。

每次训练要观察三个不同的脸部图像:

  1. 加载一张已知的人的面部训练图像
  2. 加载同一个人的另一张照片
  3. 加载另外一个人的照片

然后,算法查看它自己为这三个图片生成的测量值。再然后,稍微调整神经网络,以确保第一张和第二张生成的测量值接近,而第二张和第三张生成的测量值略有不同。

我们要不断的调整样本,重复以上步骤百万次,这确实是个巨大的挑战,但是一旦训练完成,它能攻轻松的找出人脸。

庆幸的是 OpenFace 上面的大神已经做完了这些,并且他们发布了几个训练过可以直接使用的网络,我们可以不用部署复杂的机器学习,开箱即用,感谢开源精神。

这里写图片描述

这128个测量值是什么鬼?

其实我们不用关心,这对我们也不重要。我们关心的是,当看到同一个人的两张不同照片时,我们的网络需要能得到几乎相同的数值。

第四步:从编码中找出人的名字

最后一步实际上是最简单的一步,我们需要做的是找到数据库中与我们的测试图像的测量值最接近的那个人。

如何做呢,我们利用一些现成的数学公式,计算两个128D数值的欧氏距离。

这里写图片描述

这样我们得到一个欧式距离值,系统将给它一个认为是同一个人欧氏距离的阀值,即超过这个阀值我们就认定他们是 同 (失) 一 (散) 个 (兄) 人 (弟)。

人脸识别就这样达成啦,来来我们再回顾下流程:

  1. 使用HOG找出图片中所有人脸的位置。
  2. 计算出人脸的68个特征点并适当的调整人脸位置,对齐人脸。
  3. 把上一步得到的面部图像放入神经网络,得到128个特征测量值,并保存它们。
  4. 与我们以前保存过的测量值一并计算欧氏距离,得到欧氏距离值,比较数值大小,即可得到是否同一个人。

2、人脸识别应用场景

人脸识别分两大步骤,人脸检测和人脸识别,它们应用场景也各不相同。

这里写图片描述

人脸检测目的是找出人脸,得到人脸的位置,我们可以在美颜,换肤,抠图,换脸 的一些场景中使用到它。

 

 


http://chatgpt.dhexx.cn/article/H9FtEn55.shtml

相关文章

基于深度学习的人脸面部表情识别系统【含Python源码+PyqtUI界面+原理详解】

功能演示 摘要:面部表情识别(Facial Expression Recognition)是一种通过技术手段识别人物图像中人脸面部表情的技术。本文详细介绍了其实现的技术原理,同时给出完整的Python实现代码、训练好的深度学习模型,并且通过Py…

2022年12月编程语言排行榜公布!

2022年迎来了最后一个月,我们可以看到,在这一年中编程语言起起伏伏,有的语言始终炙手可热,而有的语言却逐渐“没落”… 日前,全球知名TIOBE编程语言社区发布了12月编程语言排行榜,有哪些新变化&#xff1f…

html不是编程语言什么梗,html不是编程语言?

HTML究竟算不算是一门编程语言,这是争执已久的话题。其实,从本质来讲,HTML确实算不上是一门编程语言。 HTML全称,HyperText Markup Language。字面理解,HTML就是一种超文本语言,何谓超文本,就是…

2017年编程语言排名

https://spectrum.ieee.org发布了2017年编程语言排名,这个榜单是对数十种流行的编程语言进行排名。 请参考: https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2017 可以对排名规则进行选择 可选择的权重分别为&#xf…

【总结】编程语言的分类

一、计算机编程语言的分类 1、低级语言 机器语言(二进制代码)、汇编语言(面向机器的程序设计语言)和符号语言。汇编语言源程序必须经过汇编,生成目 标文件,然后执行。 机器语言优缺点如下…

编程语言排行榜 - 2020年度最热门编程语言盘点!

如今,广大用户更喜欢利用移动应用程序,来获取他们所关心的产品与信息。而移动应用程序也成为了企业在市场竞争中,保持领先地位的成功关键。据某项调查预测:到2020年,全英国移动应用的用户下载数量将增加到200亿次。当然…

IT培训分享:11种热门编程语言的主要用途

IT行业发展前景广阔,想进去IT领域的小伙伴也是与日俱增。但编程语言的种类那么多,具体学习哪个好呢?建议刚开始学习就要明白自己的目的来进行有针对性的学习。今天小千就以自己了解到的知识,来给大家简单介绍一下时下热门编程语言…

最受欢迎的八种编程语言

DevJobsScanner公司分析了2022年超过1200万份开发者工作需求,其中舍弃了对语言要求比较模糊的工作,有明确编程语言要求的工作有700万份,最终得出了目前行业需求量最高的 8 种编程语言。 让我们一起看看在目前的市场需求中,哪些语…

软件测试用例编写方法

软件测试学习导图如下: 软件测试的宗旨就是尽早地和不断地进行测试,更早、更快、更多的发现错误。 编写测试用例主要用到五种方法:等价类划分、边界值分析、因果图法、场景法(用户故事法)、错误推测 等价类划分&#…

编写测试用例方法之正交表分析法

今天我们再来介绍另外一个编写测试用例的方法:正交表分析法,这个方法是一种比较方便的方法。话不多说,开始整干货,老规矩,首先全图镇楼。 之前我们在对产品进行测试用例设计的时候,都是针对单个输入框。如果…

测试用例的编写方法

测试用例 买手机、买电脑,要试用一下:开机、屏幕、运行速度、内存大小;这就是生活中的测试用例! 测试用例(Test Case)是为特定的目的而设计的一组测试输入、执行条件和预期的结果,以便测试是否满足某个特定需求。通过大量的测试用例来检验软件的运行效果,它是指导测试工…

编写测试用例的方法,这个是真的很好用

大家测试过程中经常用的等价类划分、边界值分析、场景法等,并不能覆盖所有的需求,我们之前讲过很少用到的因果图法,下面就来讲另一种不经常用到但又非常重要的测试用例编写方法——测试大纲法。 测试大纲法适用于有多个窗口,每个…

亲测快捷高效的编写测试用例方法

目录 一、什么是测试用例? 二、设计用例是否有必要? 三、设计用例的益处? 四、一定要写测试用例吗? 五、测试用例怎么写? 六、用例必备4个方面? 七、用例设计理念? 八、没有需求文档&am…

测试用例的特性以及编写测试用例的方法

测试用例的特性以及编写测试用例的方法 测试用例的定义:什么是测试用例?测试用例的特征: 编写测试用例的好处:测试用例的作用: 测试用例的4个特性测试用例通常包括以下几个组成元素:编写测试用例的基本方法…

【软件测试】编写测试用例的方法,这个是真的很好用

大家测试过程中经常用的等价类划分、边界值分析、场景法等,并不能覆盖所有的需求,我们之前讲过很少用到的因果图法,下面就来讲另一种不经常用到但又非常重要的测试用例编写方法——测试大纲法。 测试大纲法适用于有多个窗口,每个…

编写测试用例常用的七大方法

测试用例格式包括十大特点 用例编号 测试项 测试标题 用例属性 重要级别:高中低 预置条件 测试输入 操作步骤 预期结果 实际结果 第一:等价类 1,等价类定义 2,等价类划分 3,等价类划分规则 4,进行…

【测试】编写测试用例的思路和方法

文章目录 1)什么是测试用例?1.1 测试用例的定义测试用例的内容: *为什么需要测试用例?测试用例的作用: 1.2 测试用例的元素测试目标(Why):测试对象(What)&…

编写测试用例常用方法

一、等价类划分法 1.概念:等价类划分法是将所有程序的输入域划分成若干个子集合(等价类),然后从每一个子集合中选取少数具有代表性的数据作为测试的输入数据。在该子集合中,所有的输入数据对于揭露软件中的错误都是等效的。等价类划分有效等…

Java-高级技术(二)

9、多线程 什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。 我们之前启动程序执行后&#xff0c;main方法的执行其实就是一条单独的执行路径。 public static void main(String[] args) {// 代码...for (int i 0; i < 10; i) {System.out.println(i);…

想面中高级java工程师,要怎么写简历?(附图)

大家好~ 小仙女又回来啦~ 经过了N天的面试&#xff0c;最终选择了一家最中意的~ 过几天就要入职啦~ 现在把经验分享给大家~ 想跳槽的小哥哥小姐姐们可以参考一下~ 写简历要遵循的原则&#xff1a;整齐、简洁、多从阅读者的角度考虑。 文档属性与命名 写完简历生成pdf版的这个…