【计算机视觉】人脸识别

一、简介

人脸识别是将图像或者视频帧中的人脸与数据库中的人脸进行对比,判断输入人脸是否与数据库中的某一张人脸匹配,即判断输入人脸是谁或者判断输入人脸是否是数据库中的某个人。
人脸识别属于1:N的比对,输入人脸身份是1,数据库人脸身份数量为N,一般应用在办公室门禁,疑犯追踪;人脸验证属于1:1的比对,输入人脸身份为1,数据库中为同一人的数据,在安全领域应用比较多。
一个完整的人脸识别流程主要包括人脸检测、人脸对齐、特征提取、人脸对比几个部分。

二、人脸检测

人脸检测是寻找并定位人脸在输入图像中的位置。

传统人脸检测算法

Viola-Jones人脸检测活Haar特征级联分类器

import cv2# 加载预训练模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')# 读取输入图像
image_path = "path_to_image.jpg"  # 替换为你的图片路径
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 转为灰度图# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 绘制人脸矩形框
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)roi_gray = gray[y:y+h, x:x+w]roi_color = image[y:y+h, x:x+w]# 在每张人脸区域内检测眼睛eyes = eye_cascade.detectMultiScale(roi_gray)for (ex, ey, ew, eh) in eyes:cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)# 显示结果
cv2.imshow("Detected Faces and Eyes", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
1. 加载预训练模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
  • 功能:加载 OpenCV 提供的预训练 Haar 级联分类器模型,用于检测人脸和眼睛。
  • 参数
    • cv2.CascadeClassifier:加载 XML 模型文件。
    • cv2.data.haarcascades:OpenCV 提供的 Haar 分类器模型的默认路径。
    • 'haarcascade_frontalface_default.xml':用于检测正面人脸。
    • 'haarcascade_eye.xml':用于检测眼睛。
2. 读取并预处理图像
image_path = "path_to_image.jpg"  # 替换为你的图片路径
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 转为灰度图
  • 功能
    1. 使用 cv2.imread 读取图像。
    2. 转换为灰度图(灰度图检测效率更高,级联分类器对彩色图像没有直接支持)。
  • 原因:级联分类器的训练和使用都基于灰度图像。
3. 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
  • 功能:检测图像中的所有人脸。
  • 参数
    • gray:输入的灰度图。
    • scaleFactor=1.1:每次图像缩小时的比例因子,较大的值降低检测时间但可能错过较小的人脸。
    • minNeighbors=5:每个候选矩形需满足的邻近矩形数量。值越大,检测结果越严格。
    • minSize=(30, 30):目标检测框的最小尺寸,用于过滤过小的区域。
  • 输出:返回一个列表,每个元素是一个 (x, y, w, h) 元组,表示检测到的人脸的矩形框。
4. 绘制人脸矩形框并检测眼睛
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)roi_gray = gray[y:y+h, x:x+w]roi_color = image[y:y+h, x:x+w]
  • 功能
    • 遍历 faces 中的每个人脸检测框 (x, y, w, h)
    • 使用 cv2.rectangle 在原图上绘制蓝色框((255, 0, 0))表示人脸区域。
    • 提取每个人脸的灰度子图 roi_gray 和原图的子图 roi_color,用于后续的眼睛检测。
  • 原因:减少检测区域,提高眼睛检测的精度和速度。
5. 在每张人脸区域内检测眼睛
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
  • 功能:使用 eye_cascade.detectMultiScale 在人脸区域内检测眼睛。
  • 参数:同人脸检测,输入的灰度子图为 roi_gray
  • 绘制结果:用绿色框((0, 255, 0))表示检测到的眼睛。
6. 显示结果
cv2.imshow("Detected Faces and Eyes", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 功能
    1. 使用 cv2.imshow 显示图像。
    2. cv2.waitKey(0):等待用户按键关闭窗口。
    3. cv2.destroyAllWindows:销毁所有窗口,释放资源。
总结
  1. 输入:一张图片(RGB 格式)。
  2. 处理
    • 转为灰度图。
    • 使用预训练的 Haar 级联模型检测人脸和眼睛。
    • 在检测到的区域绘制矩形框。
  3. 输出:在窗口中显示标注了人脸和眼睛的图片。

基于深度学习的人脸检测算法

基于深度学习的人脸检测算法经历了从传统方法到现代深度学习方法的演变,其发展历程可以划分为几个重要阶段。以下是基于深度学习的人脸检测算法的主要发展历史:

1. 传统方法阶段(2000年以前)
  • 特点
    • 依赖于手工设计特征和传统机器学习方法(如 Haar 特征、HOG 特征)。
    • 算法代表:Haar 级联分类器(Viola-Jones,人脸检测的重要突破)。
  • 局限
    • 对光照、姿态、遮挡等情况敏感。
    • 检测速度快但精度有限。

这一阶段虽然不基于深度学习,但奠定了人脸检测的基础。

2. 深度学习的初步应用(2012年左右)
  • 背景:2012年 AlexNet 在 ImageNet 比赛中获胜,深度学习开始广泛应用于计算机视觉。
  • 特点
    • 使用卷积神经网络(CNN)作为特征提取器。
    • 算法代表:DeepFace(Facebook, 2014)
      • 使用深度神经网络(DNN)对人脸检测和识别进行处理。
      • 首次将深度学习应用于人脸检测和识别任务,性能显著提升。
  • 局限
    • 网络规模较小,无法应对复杂场景(如多角度、遮挡)
3. 基于回归的方法(2015年左右)
  • 背景:深度学习框架和硬件性能的进步,使得更复杂的网络架构成为可能。
  • 特点
    • 使用 CNN 直接回归人脸框的坐标。
    • 算法代表:
      • Cascade CNN(2015):使用多个 CNN 逐步回归人脸位置,提高检测精度。
      • MTCNN(Multi-task Cascaded CNN, 2016):结合多任务学习,联合进行人脸检测和关键点定位。
        • 特点:多阶段检测框架,利用级联网络逐步细化结果。
        • 优点:检测速度和精度兼顾,成为经典方法。
4. 单阶段和双阶段目标检测器的引入(2016年-2018年)
  • 背景:通用目标检测器如 Faster R-CNN、SSD、YOLO 等在物体检测任务中的成功,推动了它们在人脸检测领域的应用。
  • 特点
    • 单阶段方法:如 SSD 和 YOLO,将人脸检测视为通用物体检测任务。
    • 双阶段方法:如 Faster R-CNN,将区域建议网络(RPN)与分类器结合。
  • 算法代表
    • Face R-CNN:使用 Faster R-CNN 对人脸进行检测。
    • S3FD(Single Shot Scale-invariant Face Detector, 2017):基于 SSD 的改进,解决了人脸大小变化的问题。
    • RetinaFace(2019):结合关键点检测,性能优异。
5. 基于关键点检测和自监督学习(2018年后)
  • 特点
    • 强调对复杂场景(如遮挡、多角度、低光照)的鲁棒性。
    • 将人脸关键点检测和人脸检测结合,进一步提升精度。
  • 算法代表
    • DSFD(Dual Shot Face Detector, 2019):多分辨率特征融合,更适合检测小人脸。
    • CenterFace(2020):轻量级人脸检测器,结合人脸框和关键点检测,适合实时应用。
    • SCRFD(2021):针对边缘设备优化的高效人脸检测器。
6. 大模型和自监督学习的影响(2021年后)
  • 背景:大规模预训练模型(如 Vision Transformer, CLIP)的兴起,为人脸检测带来了新的可能性。
  • 特点
    • 使用自监督学习方法,通过大规模无标签数据学习强大的特征表征。
    • 将 Transformer 等新架构引入人脸检测任务。
  • 算法代表
    • DEtection TRansformer (DETR):结合 Transformer 架构的人脸检测方法。
    • YOLO 系列最新版本:如 YOLOv5、YOLOv8,在人脸检测任务中的应用。

三、人脸对齐

人脸对齐是将检测得到的人脸图像变换到标准正脸姿态,在实际图片中,由于头部姿态各异、人脸尺度不一,所呈现的形式也各不相同。

  1. 人脸检测
    • 检测人脸框,提取人脸区域。
    • 使用 OpenCV 提供的 Haar 或 DNN 检测器。
  2. 关键点检测
    • 使用关键点检测模型提取人脸的关键点(如眼睛、鼻尖等)。
    • 关键点可以用 Dlib 或深度学习模型(如 MTCNN)提取。
  3. 仿射变换
    • 根据检测到的关键点,定义源点(人脸关键点)和目标点(标准模板关键点)。
    • 计算仿射变换矩阵并应用变换,将人脸对齐。

四、特征提取

特征提取是将输入的人脸图像用一个高维特征向量来表示;如果同一个人,则两个高维特征向量的距离近;如果不同,则距离远。人脸特征提取的方法也可以分为传统方法和深度学习两大类。
人脸特征提取算法经历了从早期的几何特征分析到现代深度学习的转变,其发展历史可以分为以下几个阶段:

1. 几何特征阶段(20世纪70-90年代)
代表方法
  • 几何特征分析
    • 利用人脸的几何属性(如眼睛间距、鼻梁长度、脸型轮廓)作为特征。
    • 通过手工定义的特征点计算欧氏距离等度量方式。
  • 模板匹配
    • 使用平均脸模板,匹配输入人脸与模板的相似度。
优缺点
  • 优点:简单直观,计算量小。
  • 缺点:对光照、姿态和遮挡不鲁棒,特征维度较低。
代表研究
  • 1973年,Bledsoe 提出的人脸几何模型匹配方法
  • 1987年,Sirovich 和 Kirby 提出的脸空间方法,为 PCA 奠定了基础。
2. 统计学习阶段(1990-2010年)
代表方法
  • 主成分分析(PCA)
    • 把人脸图像作为高维向量,降维成低维特征表示(如特征脸)。
    • 1991年,Turk 和 Pentland 提出了Eigenfaces 方法
  • 线性判别分析(LDA)
    • 增强类间区分能力,用于人脸识别。
    • 解决了 PCA 的类间可分性不足问题。
  • 独立成分分析(ICA)
    • 分离人脸的非高斯成分,适合表情和姿态变化分析。
  • 局部二值模式(LBP)
    • 基于纹理模式的人脸描述,提取局部区域的纹理特征。
  • Fisherfaces
    • 综合 PCA 和 LDA 方法,提升对光照变化的鲁棒性。
优缺点
  • 优点:提出了许多经典算法,对光照、姿态变化有一定鲁棒性。
  • 缺点:对非线性特征无法很好建模,提取的特征不够高维,难以处理复杂场景。
代表研究
  • 1991年,Eigenfaces。
  • 1997年,Belhumeur 提出的 Fisherfaces。
  • 2002年,LBP 被引入人脸识别领域。
3. 局部特征阶段(2000-2015年)
代表方法
  • SIFT (Scale-Invariant Feature Transform)
    • 提取图像中的局部关键点和特征描述。
    • 对光照、尺度、旋转变化鲁棒。
  • HOG (Histogram of Oriented Gradients)
    • 提取梯度方向分布,用于描述人脸的全局形状。
  • Gabor 特征
    • 模拟人类视觉皮层特性,用 Gabor 滤波器提取人脸纹理。
优缺点
  • 优点:提升了对光照和局部细节的鲁棒性。
  • 缺点:局部特征无法很好表达全局信息,算法复杂度较高。
代表研究
  • 2004年,Lowe 提出的 SIFT。
  • 2005年,Dalal 和 Triggs 提出的 HOG。
  • 2006年,Gabor 特征被广泛应用于人脸识别。
4. 深度学习阶段(2014年至今)
关键技术
  • 卷积神经网络(CNN)
    • 自适应提取多层次特征,捕捉人脸的纹理、形状、表情等信息。
    • 提取的特征更具辨别性。
  • 预训练模型
    • 使用大规模人脸数据集进行训练,如 LFW、CASIA-WebFace 等。
    • 模型具备迁移学习能力。
代表算法
  • DeepFace (2014, Facebook)
    • 首个端到端人脸识别深度学习模型。
    • 采用卷积神经网络,实现接近人类的识别精度。
  • DeepID (2014-2015, 中国科学院)
    • 提出多层 CNN 架构,特征更加鲁棒。
    • 引入多个子网络对不同区域进行特征提取。
  • FaceNet (2015, Google)
    • 基于深度学习的人脸特征提取算法。
    • 使用 Triplet Loss 学习特征嵌入,支持高效人脸验证和聚类。
  • ArcFace (2018, InsightFace)
    • 提出了 Additive Angular Margin Loss,进一步优化特征的判别性。
    • 被广泛用于工业人脸识别系统。
  • CosFace、SphereFace
    • 聚焦于特征分布的角度约束,提升类间分离度。
优缺点
  • 优点:特征表示能力强,适用于大规模人脸识别。
  • 缺点:需要大量数据和计算资源,可能存在隐私问题。
代表研究
  • 2014年,Facebook 提出 DeepFace。
  • 2015年,Google 提出 FaceNet。
  • 2018年,ArcFace 成为人脸识别领域的主流算法。

五、人脸比对

获取了人脸特征后,对于不同人脸图像,通过比对其人脸特征之间的距离远近,就可以判断人脸身份。
在 Python 中,OpenCV 提供的 cv2.FaceRecognizerSF 模块可以用于人脸识别任务,match 是其方法之一,用于比较两个特征向量之间的相似度。以下是 facerecognizer.match 方法的详细介绍:

函数原型
cv2.FaceRecognizerSF.match(face1: numpy.ndarray, face2: numpy.ndarray, disType: int = 0) -> float
参数说明
  1. face1

    • 类型: numpy.ndarray
    • 描述: 第一个人脸的特征向量。
      • 特征向量通常由 cv2.FaceRecognizerSF.feature() 方法生成,表示人脸的深度特征。
  2. face2

    • 类型: numpy.ndarray
    • 描述: 第二个人脸的特征向量。
      • 同样通过 feature() 方法提取,用于与 face1 比较。
  3. disType

    • 类型: int
    • 描述: 指定距离度量的类型,用于衡量两个特征向量之间的相似性。
    • 可选值:
      • 0 (cv2.FaceRecognizerSF.FR_COSINE): 使用余弦相似度。
      • 1 (cv2.FaceRecognizerSF.FR_NORM_L2): 使用 L2 范数(欧几里得距离)。
返回值
  • 类型: float
  • 描述: 返回两个特征向量的相似度分数。
    • 对于余弦相似度,值越大表示越相似(最大值为1)。
    • 对于 L2 范数,值越小表示越相似。

六、开源项目盘点

  • CompreFace
  • Deepface
  • InsightFace
  • Face Recognition
  • FaceNet
  • OpenFace

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/4900.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 HTML 开发 Portal 页全解析

前言 在当今数字化时代,网站作为企业和个人展示信息、提供服务的重要窗口,其重要性不言而喻。而 Portal 页,作为网站的核心页面之一,承担着引导用户、整合信息等关键任务。那么,如何使用 HTML 开发一个功能齐全、界面…

Spring Boot 项目启动报错 “找不到或无法加载主类” 解决笔记

一、问题描述 在使用 IntelliJ IDEA 开发基于 Spring Boot 框架的 Java 程序时,原本项目能够正常启动。但在后续编写代码并重建项目后,再次尝试运行却出现了 “错误:找不到或无法加载主类 com.example.springboot.SpringbootApplication” 的…

上位机工作感想-2024年工作总结和来年计划

随着工作年限的增增长,发现自己越来越不喜欢在博客里面写一些掺杂自己感想的东西了,或许是逐渐被工作逼得“成熟”了吧。2024年,学到了很多东西,做了很多项目,也帮别人解决了很多问题,唯独没有涨工资。来这…

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认

OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务(DDoS)攻击,而OpenAI尚未承认这一漏洞。 本月,德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章,解释了如何通过向ChatGPT API发送单个HTTP请求…

《keras 3 内卷神经网络》

keras 3 内卷神经网络 作者:Aritra Roy Gosthipaty 创建日期:2021/07/25 最后修改时间:2021/07/25 描述:深入研究特定于位置和通道无关的“内卷”内核。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub …

GIFT ICA 下载记录

1.帮助文档 Group ICA/IVA Of fMRI Toolbox;【GIFT介绍】 Group ICA of fMRI Toolbox (GIFT) Walk Through;【流程介绍】 GIFT v1.3c Functions Srinivas Rachakonda, Eric Egolf and Vince Calhoun【流程解释】 2.下载记录 从官网下载程序包&#xff0…

LLMs(大型语言模型)的多智能体:Auto-GPT

LLMs(大型语言模型)的多智能体:Auto-GPT 是指在一个系统中集成多个具有不同能力、角色和任务的智能体,这些智能体能够相互协作、沟通和交互,以共同完成复杂的任务或解决复杂的问题。每个智能体都可以被视为一个独立的实体,具有自己的策略、目标和知识库,通过相互之间的…

【C++】C++11

目录 1. 整体学习思维导图 2. {}列表初始化 2.1 单个对象情况 2.2 多对象情况 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延迟生命周期 3.4 左值和右值的参数匹配 4. 左值引用和右值引用 4.1 左值引用 4.2 右值引用 5. 移动构造和移动…

无人机飞手考证难度增加,实操、地面站教学技术详解

随着无人机技术的快速发展和广泛应用,无人机飞手考证的难度确实在不断增加。这主要体现在对飞手的实操技能和地面站操作技术的要求上。以下是对无人机飞手考证中实操和地面站教学技术的详细解析: 一、实操教学技术详解 1. 无人机基础知识学习&#xff1…

解决npm install安装出现packages are looking for funding run `npm fund` for details问题

当我们运行npm install时,可能会收到类似以下的提示信息:“x packages are looking for funding.” 这并不是错误提示,也不会影响项目的正常运行。其实实在提醒有一些软件包正在寻求资金支持。 根据提示输入npm fund可以查看详细的信息&#…

程序员不可能不知道的常见锁策略

前面我们学习过线程不安全问题,我们通过给代码加锁来解决线程不安全问题,在生活中我们也知道有很多种类型的锁,同时在代码的世界当中,也对应着很多类型的锁,今天我们对锁一探究竟! 1. 常见的锁策略 注意: …

当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线

问题:当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线; 原因:el-table有一个before的伪元素作为表格的下边框下,初始的时候已设置,在滚动的时候并没有重新设置…

模型部署工具01:Docker || 用Docker打包模型 Build Once Run Anywhere

Docker 是一个开源的容器化平台,可以让开发者和运维人员轻松构建、发布和运行应用程序。Docker 的核心概念是通过容器技术隔离应用及其依赖项,使得软件在不同的环境中运行时具有一致性。无论是开发环境、测试环境,还是生产环境,Do…

2025 最新flutter面试总结

目录 1.Dart是值传递还是引用传递? 2.Flutter 是单引擎还是双引擎 3. StatelessWidget 和 StatefulWidget 在 Flutter 中有什么区别? 4.简述Dart语音特性 5. Navigator 是什么?在 Flutter 中 Routes 是什么? 6、Dart 是不是…

Flask简介与安装以及实现一个糕点店的简单流程

目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…

记一次常规的网络安全渗透测试

视频教程在我主页简介和专栏里 目录: 前言 互联网突破 第一层内网 第二层内网 总结 前言 上个月根据领导安排,需要到本市一家电视台进行网络安全评估测试。通过对内外网进行渗透测试,网络和安全设备的使用和部署情况,以及网络…

Dockerfile另一种使用普通用户启动的方式

基础镜像的Dockerfile # 使用 Debian 11.9 的最小化版本作为基础镜像 FROM debian:11.11# 维护者信息 LABEL maintainer"caibingsen" # 复制自定义的 sources.list 文件(如果有的话) COPY sources.list /etc/apt/sources.list # 创建…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证6)

重新创建WebApi项目,安装Microsoft.AspNetCore.Authentication.JwtBearer包,将之前JwtBearer测试项目中的初始化函数,jwt配置类、token生成类全部挪到项目中。   重新编写login函数,之前测试Cookie和Session认证时用的函数适合m…

opencv在图片上添加中文汉字(c++以及python)

opencv在图片上添加中文汉字(c以及python)_c opencv绘制中文 知乎-CSDN博客 环境: ubuntu18.04 desktopopencv 3.4.15 opencv是不支持中文的。 这里C代码是采用替换原图的像素点来实现的,实现之前我们先了解一下汉字点阵字库。…

Python_CUDA入门教程学习记录

这是本人21年读书时学习CUDA基础知识保留的一些笔记,学习时的内容出处和图片来源不记得了,仅作为个人记录! CUDA编程关键术语: host : cpudevice : GPUhost memory : cpu 内存device memory : gpu onboard显存kernels : 调用CPU上…