人脸识别实践(1) - 基本原理与设计思路

article/2025/10/25 15:04:52

写在前面

  随着时代的高速发展,视频监控等基础设施越来越完备,计算机视觉也在各行各业开始发挥出更大的效用,而这一领域中大家最熟知的就是刷脸支付,现在大家享受着科技带来的便利。还有我们乘坐高铁,进站前刷身份证然后脸对着摄像头,是本人才能够通过检票口,也用到了人脸识别技术。可见该技术存在着太多的应用场景。前段时间出现小区出现蜂巢的快递柜,它提供了人脸识别取快递的功能。最近在乘坐地铁的时候,发现现在过闸机也可以不用刷地铁卡直接人脸识别就通过了,我家这边地铁站的人脸识别设备是依图公司做的,这家公司在图像领域还是蛮有知名度的,还知道的一家比较出门的就是旷视,当然BAT也做,这里就不细说了。

  由于现在市面上人脸识别的应用越来越多,作为一名热衷于技术的IT男,我觉得有必要对人脸识别进行一个系统的了解学习和研究,深入的了解人脸识别的机制,是很有必要的。

  整个人脸识别的实现,我会用2-3个章节进行介绍,这个章节介绍思路和原理,后面的章节进行核心代码的讲解,后续会将代码放到github上归档,当然,这也是给自己一个代码整理的机会。

1. 整体设计思路

  首先对人脸识别的原理进行了解,通过代码来实现人脸识别相关算法的基本功能,在确认核心模块代码功能正常后,再考虑整个人脸识别管理平台如何设计。

  在人脸识别管理平台的设计上,梳理了需要完成的功能,一共包含人脸注册、人脸更新、人脸删除、人脸识别、人脸库查询这5个大功能的管理平台,同时考虑到每次程序运行后,在对人脸库进行修改后,需要保存这些录入的数据,所以还有个功能就是人脸数据的保存和读取。

1.1 人脸识别

  当用户在平台上传照片后,对照片上的人脸进行判断,如果人脸存在,那么使用人脸与程序中保存的人脸数据进行一对一的比较,每次比较的结果都保存起来,全部比较完成后,输出相似度最高的人脸库中的数据,同时将相似度也展示出来。

1.2 人脸注册

  当用户在平台上上传照片后,先对照片进行人脸检测,对于没有人脸和多于1个的,进行错误提示,因为人脸注册需要保证每次输入的user id能够对应到人脸库中具体的人的信息,只有当有且只有一个人脸的时候,才进行数据录入。

1.3 人脸更新

  用户输入存在的user_id后,上传照片,同样需要照片中的人脸只有一个,否则会提示人脸过多,更新失败,当满足条件后,对人脸特征进行获取后,保存在程序的人脸库中。

1.4 人脸删除

  ,当用户输入的user_id在我们库中存在的话,那么就删除这个人脸的信息的数据和照片,否则提示删除失败,数据信息不存在。

1.5 人脸库查询

  人脸库查询,提供一个输入框,可以输入需要查询的最大人脸个数,如果输入的数字大于人脸库中的个数,那么展示人脸库中的全部数据,包括user_id和照片,如果输入的数字大于人脸库中的个数,那就展示输入数字的个数的人脸的信息。

1.6 人脸数据的保存和读取

  考虑到这个系统不是每次打开都需要重新录入数据的,应该在程序关闭重新启动后,还要能读取原来保存的数据,否则每次都新增数据,不符合这个平台的功能。

  所以,在人脸注册、更新的时候,会讲照片保存在pic文件下,名字以user_id.jpg进行命名,在人脸删除的时候,除了删除内存中的数据之外,还要删除pic下的照片,这样相当于对数据进行了实时保存。

  程序启动的时候需要将人脸库的数据都读取到内存中,所以在程序启动的时候,需要去保存人脸照片的pic文件中,读取所有的user id.jpg图片,保存到人脸库中,这样,在程序启动的时候就能够保持和程序关闭前同样的状态了。

2. 人脸识别的基本原理

  人脸识别管理平台的开发,最为核心的技术就是人脸识别技术,所以这个章节重点进行理论基础的介绍。
要完成人脸识别功能,需要先读取图片进行人脸检测,通过检测到图片中的人脸后,获取人脸的68个特征点,再通过深度学习训练的模型,计算出人脸128个纬度的特征点,每个人脸都有自己的128维特征,当我们进行两个人脸的比对时,就可以通过对2个向量进行距离计算,根据计算的结果来判断人脸是否相似。

2.1 人脸检测器

  人脸检测基于成熟的图像处理技术dlib,首先我们需要对输入的图像进行人脸检测,dlib的人脸检测器是用经典直方图梯度特征和线性分类器、图像金字塔相结合,它使用了机器学习的方式创建了面部探测器。

2.2 人脸68个特征点

  通过人脸检测器完成人脸检测后,针对检测出来的每一张人脸,基于dlib使用英国伦敦帝国理工大学标注的300万人脸数据集结合计算机视觉技术训练的模型,通过模型shape_predictor_68_face_landmarks.dat推理出人脸的68个特征点,这些特征点包括了眉毛、眼睛、鼻子、嘴和面部轮廓,检测出来的结果如下图。

image

2.3 人脸128维向量

  根据68个人脸的特征点,使用dlib_face_recognition_resnet_model_v1.dat这个内置的深度学习模型,该模型在人脸识别标准测试集LFW上获得了99.38%的准确率,我在人脸识别中使用了该模型,输入68个人脸的特征点就能够推理出每个人脸的128维向量。

2.4 人脸相似度计算

  我们知道两个点之间的距离,可以使用以下公式进行计算:

ρ = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 \rho = \sqrt{({x_2-x_1})^2+(y_2-y_1)^2} ρ=(x2x1)2+(y2y1)2

  ρ 为点(x2,y2)与点(x1,y1)之间的欧式距离。

  同理,三维空间的公式:

ρ = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 + ( z 2 − z 1 ) 2 \rho = \sqrt{({x_2-x_1})^2+(y_2-y_1)^2+(z_2-z_1)^2} ρ=(x2x1)2+(y2y1)2+(z2z1)2

  n维空间的公式:

d ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + . . . + ( x n − y n ) 2 d(x,y) = \sqrt{({x_1-y_1})^2+(x_2-y_2)^2+...+(x_n-y_n)^2} d(x,y)=(x1y1)2+(x2y2)2+...+(xnyn)2

  欧式距离就是n维空间中两个点之间的真实距离,这个可以判断向量之间的距离。对于128维的向量,属于更加大的一个空间,也可以使用欧式距离公式进行计算。

  但是我们需要对2个向量之间的距离有一个更加明显的认识,所以人脸识别中,一般会对欧式距离进行归一化,所以归一化后特征的余弦距离就是余弦相似度,我们就能使用相似度配置,在2个向量比较的时候,得到感受深刻的值,如果完全一样,那么值为1,如果很相似,余弦相似度为0.99等接近1的值,所以两个人脸越相似,那么他们的余弦相似度就越接近1。

3. 人脸管理平模块规划

  管理平台是B/S架构,程序启动后,通过网页访问人脸识别管理平台,通过浏览器中的操作,实现图片读取、图片编码、服务调用功能,在服务端来实现配置文件读取、http服务、图片保存功能。

3.1 前端设计

  由于平台除了提供给自己使用,还会提供给其他开发人员使用,参考了百度开放者平台上面的人脸识别管理平台,能看出他们使用了接口封装了人脸识别相关功能,所以参照他们的设计,我自己也仿照这种模式进行开发,使用了流行的前端框架VUE来进行前端开发工作。

3.2 图片读取

  前端的图片读取,直接使用了VUE封装的功能,能够打开本地图片文件。

3.3 图片编码

  读取图片后,将图片转码为base64编码,这样转化也是参考了百度接口的设计,将base64编码的图片文本数据为了发送到服务端进行处理。

3.4 图片保存

  服务端获取到base64编码的数据后,使用大家广泛运用的机器视觉库OpenCV将该编码的数据转为cv::Mat类型,提供给dlib进行人脸处理后,再通过大家熟知的base64编码转成图片文件,进行了文件的保存,统一保存成user id.jpg文件。

3.5 配置文件读取

  由于http服务需要提供端口进行访问,所以将端口配置到配置文件中,这样在程序启动的时候,就能够初始化端口,提供给大家访问。

  人脸识别也有一个相似度设置,所以也通过配置文件读取,这样如果要修改这个相似度,超过相似度才认为是同一个人,这样就不用改代码,只改文件,重启程序就可以实现了,更加的方便。

3.6 http服务

  为了提供公共的,大家熟知的接口,选取了和百度做的人脸识别一样的http接口,所以需要进行http服务端的开发,提供给web客户端进行调用。

3.7 写日志模块

  这个模块主要是为了方便调试,也方便真正使用过程中,如果出现了错误,还能够通过日志文件,查找定位问题,同时也能看到人脸识别的应用被访问的人调用了多少次,这样才能够为以后做大这个平台提供准备。


http://chatgpt.dhexx.cn/article/7IfLKwGn.shtml

相关文章

计算机识别人脸原理,人脸识别:原理、方法与技术

人脸识别:原理、方法与技术 语音 编辑 锁定 讨论 上传视频 《人脸识别:原理、方法与技术》是2010年2月1日科学出版社出版的图书。 《人脸识别:原理、方法与技术》主要介绍人脸识别技术的基本原理、研究内容、研究方法,以及已有的研…

OpenCV人脸识别(1)原理介绍

前言 本系列博客学习如何使用OpenCV来执行面部识别。 为了构建人脸识别系统,我们首先进行人脸检测,使用深度学习从每个人脸提取人脸特征,在提取到特征上训练人脸识别模型,然后用OpenCV识别图像和视频流中的人脸。 这里提取人脸特…

基于Python的面部表情识别分析系统

资源下载地址:https://download.csdn.net/download/sheziqiong/85660758 面部表情识别 练习技能: 爬虫数据清洗计算机视觉(图片基本处理,信息提取)深度学习 图像识别技术文档 一、项目概述 项目名称:面部…

基于人脸面部检测的口罩识别系统

基于人脸面部检测的口罩识别系统 摘 要 作为数字图像处理和计算机视觉领域的一个重要组成部分,利用摄像机对图像进行采集,从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情,人们生活秩…

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

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

基于深度学习的人脸面部表情识别系统【含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个特性测试用例通常包括以下几个组成元素:编写测试用例的基本方法…

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

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