【计算机视觉】人脸识别

一、简介

人脸识别是将图像或者视频帧中的人脸与数据库中的人脸进行对比,判断输入人脸是否与数据库中的某一张人脸匹配,即判断输入人脸是谁或者判断输入人脸是否是数据库中的某个人。
人脸识别属于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.mzph.cn/news/893407.shtml

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

相关文章

光谱相机在智能冰箱的应用原理与优势

食品新鲜度检测 详细可点击查看汇能感知团队实验报告:高光谱成像技术检测食物新鲜度 检测原理:不同新鲜程度的食品,其化学成分和结构会有所不同,在光谱下的反射、吸收等特性也存在差异。例如新鲜肉类和蔬菜中的水分、蛋白质、叶…

Dangerzone:免费的危险的文件转换安全程序

我们知道很多杀毒软件会将很多文件视作恶意程序,尤其是带宏病毒的DOC文件,直接删除难免会带来不必要的麻烦,那么推荐一款免费的危险的文件转换安全程序:Dangerzone 。它可以检查各种可能有危险的文件并将其转换为安全版本&#xf…

销售线索管理的价值以及主要方法

销售线索管理的价值体现在:提高销售效率、优化客户体验、提升转化率、支持数据驱动决策。其中,提高销售效率尤为关键。通过系统化的线索管理,销售团队能够更快地识别和跟进潜在客户,从而缩短销售周期。自动化的线索评分和分配减少…

手写SOCKET进行HTTP通信

网络基础 我们电脑主板上都内置了多种网卡,一般主要有以下几类: 虚拟网卡(loopback) 注意,它是虚拟的,并不是物理网卡,也被称为是本地环回地址(或接口),一般将127.0.0.1作为本地环回…

在 C++ 中实现调试日志输出

在 C 编程中,调试日志对于定位问题和优化代码至关重要。有效的调试日志不仅能帮助我们快速定位错误,还能提供有关程序运行状态的有价值的信息。本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳。 1. 使用 #ifdef _DEBUG…

MFC程序设计(二)基于对话框编程

从现在开始,我们将以基于对话框的MFC应用程序来讲解MFC应用 向导生成基于对话框MFC应用程序 对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。在Visual C中,对话框既可以单独组成一个简单的应用程序&#xff0…

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

目录 设计思路 1.为什么不直接用FlinkCDC要重写Flink Gauss CDC 2.存量同步的逻辑是什么 2.1、单主键的切片策略是什么 2.2、​​​​​复合主键作切片,怎么保证扫描到所有的数据 3、增量同步的逻辑是什么 4、存量同步结束之后如何无缝衔接增量同步 5、下游…

idea新增java快捷键代码片段

最近在写一些算法题&#xff0c;有很多的List<List这种编写&#xff0c;想着能否自定义一下快捷键 直接在写代码输入&#xff1a;lli&#xff0c;即可看见提示

修改docker共享内存shm-size

法1&#xff1a;在创建容器时增加共享内存大小 nvidia-docker run -it -p 10000:22 --name"zm" -v /home/zm:/data ufoym/deepo:all-cu101 /bin/bash --shm-size20G法2&#xff1a;修改正在运行的容器的共享内存设置 查看容器、共享内存 docker ps -a df -lh | gr…

深度学习-91-大语言模型LLM之基于langchain的模型IO的提示模板

文章目录 1 Model的输入输出2 提示模板2.1 提示模板的特点2.2 提示模板的类型3 使用提示模板3.1 设置环境变量3.2 PromptTemplate提示模板3.2.1 通过from_template方法3.2.2 直接生成提示模板3.2.3 使用提示模板3.2.4 复用提示模板3.3 ChatPromptTemplate聊天提示模板3.3.1 通过…

stm8s单片机(二)外部中断实验

中断优先级 stm8的中断优先级不是固定不变的&#xff0c;stm8的中断分为硬件优先级与软件优先级&#xff1b;当多个中断发生时&#xff0c;cpu会先响应软件优先级高的中断&#xff0c;若软件优先级相同会先响应硬件优先级高的&#xff1b; 其中软件优先级有四个 /*** brief …

【ubuntu 连接显示器无法显示】可以通过 ssh 连接 ubuntu 服务器正常使用,但服务器连接显示器没有输出

背景 ubuntu 服务器通过显示器进行关机&#xff0c;断开电源重新接上电源再重启时&#xff0c;服务器连接显示器不再有输出。CPU 为 AMD Ryzen 7 5800X 8-Core Processor&#xff0c;并没有显示&#xff0c;只能通过 NVDIA GPU 来显示。但是通过 nvidia-smi, nvitop 的输出, 以…

FineReport案列分析(一)

父格sql的解析 SELECT XCPX,XCPDL ,XCPZL FROM (SELECT DISTINCT XCPX,XCPDL,XCPZL FROM XPCXP_YS WHERE BM IN(经销商业务部,兴客坊) UNION(SELECTDISTINCT A.CPX AS XCPX,A.CPDL AS XCPDL,A.CPZL AS XCPZLFROM SYS.ORDER_SALEZJK BJOIN KHFL_LS L1ON L1.KSBMB.CUSTCODELEFT…

社区版Dify实现文生视频 LLM+ComfyUI+混元视频

社区版Dify实现文生视频 LLMComfyUI混元视频 一、 社区版Dify实现私有化混元视频效果二、为什么社区版Dify可以在对话框实现文生视频&#xff1f;LLMComfyUI混元视频 实现流程图&#xff08;重点&#xff09;1. 文生视频模型支持ComfyUI2. ComfyUI可以轻松导出API实现封装3. Di…

Vue3 30天精进之旅:Day01 - 初识Vue.js的奇妙世界

引言 在前端开发领域&#xff0c;Vue.js是一款极具人气的JavaScript框架。它以其简单易用、灵活高效的特性&#xff0c;吸引了大量开发者。本文是“Vue 3之30天系列学习”的第一篇博客&#xff0c;旨在帮助大家快速了解Vue.js的基本概念和核心特性&#xff0c;为后续的深入学习…

helm推送到harbor私有库--http: server gave HTTP response to HTTPS client

harbor私有库访问的是http模式 harbor 2.8版本以上可以存储helm镜像 docker镜像推送的时候需要docker端配置insecure-registries 发现helm推送只能在harbor部署的本机使用localhost才能推送成功&#xff0c;即 helm push xxx.tgz oci://localhost:80/library 使用helm pus…

AI对齐与开源发展:多学科融合创新之路

标题&#xff1a;AI对齐与开源发展&#xff1a;多学科融合创新之路 文章信息摘要&#xff1a; 本文分析了AI对齐研究中多学科融合的重要性及开源AI领域的最新发展。文章指出&#xff0c;AI对齐问题需要计算机科学与社会选择理论等学科深度结合&#xff0c;特别是在RLHF领域的应…

transformers使用过程问题

transfomers新旧版本冲突&#xff0c;和accelerate、datasets、evaluate这些库直接也经常会发生冲突 我使用了下面的版本&#xff0c;暂时没有冲突&#xff0c;如果有冲突再更新 transformers4.41.2 datasets2.20.0 accelerate0.31.0 evaluate0.4.2pip install transformers安…

svn tag

一般发布版本前&#xff0c;需要在svn上打个tag。步骤如下&#xff1a; 1、空白处右击&#xff0c;选择TortoiseSVN->Branch/tag; 2、填写To path&#xff0c;即tag的路基以及tag命名&#xff08;一般用版本号来命名&#xff09;&#xff1b;填写tag信息&#xff1b;勾选cr…

python 基础类json和csv

一、json 1.将字典转换为json字符串 2.将json字符串转化为字典 3.将字典保存为json文件 4.将json文件读取出字典格式的数据 import json # 1.将字典转化成json字符串 dict1{"张三":"zhangsan","B":"b","C":"c&quo…