基于Pyhton的人脸识别(Python 3.12+face_recognition库)
使用Python进行人脸编码和比较
简介
在这个教程中,我们将学习如何使用Python和face_recognition
库来加载图像、提取人脸编码,并比较两个人脸是否相似。face_recognition
库是一个强大的工具,它基于dlib的深度学习模型,可以轻松实现人脸检测和识别功能。本教程适合初学者,我们将通过一个简单的项目来了解这个库的基本用法和环境配置。
代码示例
import face_recognition
import cv2
import matplotlib.pyplot as pltdef load_and_encode_face(image_path):"""加载图片并获取人脸编码"""# 加载图像image = face_recognition.load_image_file(image_path)# 检查图像是否为8位灰度或RGBif image.dtype == 'uint8' and (len(image.shape) == 2 or image.shape[2] == 3):# 图像已经是8位灰度或RGBpasselse:# 转换为8位RGB图像image = cv2.convertScaleAbs(image)if len(image.shape) == 2:# 如果是灰度图像,转换为RGBimage = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)elif image.shape[2] == 4:# 如果是RGBA,转换为RGBimage = cv2.cvtColor(image, cv2.COLOR_RGBA2RGB)face_encodings = face_recognition.face_encodings(image)if face_encodings:return face_encodings[0], imageelse:raise ValueError("No faces found in the image.")def compare_faces(known_face_encoding, unknown_face_encoding, tolerance=0.5):"""比较两个人脸编码是否相似"""results = face_recognition.compare_faces([known_face_encoding], unknown_face_encoding, tolerance=tolerance)return results[0]def plot_faces(known_image, unknown_image, match):"""绘制并显示两张人脸图像"""fig, axes = plt.subplots(1, 2, figsize=(12, 6))axes[0].imshow(cv2.cvtColor(known_image, cv2.COLOR_BGR2RGB))axes[0].set_title("Known Face")axes[1].imshow(cv2.cvtColor(unknown_image, cv2.COLOR_BGR2RGB))axes[1].set_title("Unknown Face")# 显示匹配结果if match:plt.suptitle("Faces Match")else:plt.suptitle("Faces Do Not Match")plt.show()def main():try:# 图像路径known_image_path = "你的图像路径"unknown_image_path = "你的图像路径"print(f"Known image path: {known_image_path}")print(f"Unknown image path: {unknown_image_path}")# 加载并编码已知人脸known_face_encoding, known_image = load_and_encode_face(known_image_path)# 加载并编码未知人脸unknown_face_encoding, unknown_image = load_and_encode_face(unknown_image_path)# 比较人脸match = compare_faces(known_face_encoding, unknown_face_encoding)print(f"Do the faces match? {match}")# 绘制并显示两张人脸图像plot_faces(known_image, unknown_image, match)except ValueError as e:print(e)except Exception as e:print(f"An error occurred: {e}")if __name__ == "__main__":main()
环境准备
在开始之前,请确保您的Python环境已经安装了以下库:
face_recognition
:用于人脸检测和识别。opencv-python
(cv2
):用于图像处理。matplotlib
:用于显示图像。
您可以使用pip命令安装这些库:
pip install cmake
pip install boost
pip install face_recognition opencv-python matplotlib
在安装Python库的过程中,我们可能会遇到各种问题。以下是针对Python 3.12环境中一些常见问题的解决方案。请注意,不同版本的解决方案可能会有所不同,以下内容仅供参考。
问题1:安装依赖时出错
如果您在安装过程中遇到错误,且无法根据错误信息下载对应的依赖包,可以尝试以下步骤:
-
安装或更新setuptools:
setuptools是Python包的构建和分发工具,它是可以帮助解决一些依赖问题。pip install setuptools
如果问题得到解决,您可能不需要进行下一步。
-
安装distribute:
在某些情况下,安装或更新distribute可以解决安装问题。pip3 install distribute
问题2:图像处理错误
如果您在处理图像时遇到错误,即使将图像转换为RGB颜色后问题仍然存在,可以尝试以下步骤:
- 修改NumPy版本:
有时候,错误可能是由于NumPy版本不兼容引起的。尝试安装一个特定版本的NumPy可能会解决问题。
选择一个与您的环境兼容的NumPy版本。pip install numpy==1.26.4
当您遇到dlib库自动下载失败或者下载后无法正常使用的情况时,您可以选择手动下载特定版本的dlib库以确保兼容性和稳定性。对于使用Python 3.12的环境,您需要下载与您的Python版本和操作系统架构相匹配的dlib库文件。
手动下载dlib库
针对Python 3.12,您可以手动下载名为 dlib-19.24.99-cp312-cp312-win_amd64.whl
的文件。这是一个预编译的wheel文件,专为Python 3.12和64位Windows系统设计,可以避免编译过程中可能出现的问题。
下载步骤
-
访问dlib的PyPI页面:https://pypi.org/simple/dlib/
请注意,如果您在访问此链接时遇到问题,可能是由于网络问题或链接本身的问题。请检查链接的合法性,并在网络稳定的情况下重试。
-
在页面上找到与您的Python版本和操作系统相匹配的wheel文件。对于Python 3.12和64位Windows系统,您需要寻找类似
dlib-19.24.99-cp312-cp312-win_amd64.whl
的文件。 -
下载相应的wheel文件到您的本地计算机。
安装步骤
下载完成后,您可以使用pip命令来安装下载的wheel文件:
pip install /path/to/dlib-19.24.99-cp312-cp312-win_amd64.whl
请将 /path/to/
替换为您保存wheel文件的实际路径。
注意事项
- 确保您的Python版本和操作系统架构与下载的wheel文件相匹配。
- 如果您在安装过程中遇到任何问题,可以尝试清理pip缓存(使用
pip cache purge
)或者重新安装pip。 - 如果手动下载和安装仍然遇到问题,建议检查Python环境是否正确设置,或者寻求社区的帮助。
以下是一个百度链接的分享
链接: https://pan.baidu.com/s/13AARGnZs8Lv46txN623SYg?pwd=upjc 提取码: upjc
- 百度网盘下载- :dlib-19.24.99-cp312-cp312-win_amd64.whl
代码解析
下面是一个完整的Python脚本,它包含了加载图像、提取人脸编码、比较人脸以及显示结果的全过程。
1. 导入库
首先,我们需要导入所需的库:
import face_recognition
import cv2
import matplotlib.pyplot as plt
其中 我们在导入时 导入cv2假设我们直接下载这个名称的库,可能会显示 不存在根据教程中之前的内容
pip install opencv-python
2. 加载和编码人脸
我们定义了一个函数load_and_encode_face
,它接受一个图像路径作为参数,加载图像,并提取其中的人脸编码。
def load_and_encode_face(image_path):# 加载图像image = face_recognition.load_image_file(image_path)# 检查图像是否为8位灰度或RGBif image.dtype == 'uint8' and (len(image.shape) == 2 or image.shape[2] == 3):# 图像已经是8位灰度或RGBpasselse:# 转换为8位RGB图像image = cv2.convertScaleAbs(image)if len(image.shape) == 2:# 如果是灰度图像,转换为RGBimage = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)elif image.shape[2] == 4:# 如果是RGBA,转换为RGBimage = cv2.cvtColor(image, cv2.COLOR_RGBA2RGB)face_encodings = face_recognition.face_encodings(image)if face_encodings:return face_encodings[0], imageelse:raise ValueError("No faces found in the image.")
3. 比较人脸
接下来,我们定义了compare_faces
函数,它接受两个人脸编码和一个容差值作为参数,并返回比较结果。
def compare_faces(known_face_encoding, unknown_face_encoding, tolerance=0.5):# 比较两个人脸编码是否相似results = face_recognition.compare_faces([known_face_encoding], unknown_face_encoding, tolerance=tolerance)return results[0]
在人脸比较函数 compare_faces
中使用的容差值(tolerance)是一个重要的参数,它决定了两个人脸编码需要多么相似才能被认为是匹配的。这个值的范围通常在0到1之间,其中0表示完全相同的编码(这在实际中几乎不可能,因为即使是同一个人的两张不同照片也会有所不同),而1表示完全不同的编码。
容差值的大小对比较结果有以下影响:
-
较小的容差值:
- 当容差值设置得较小(例如0.2或0.3)时,只有当两个人脸编码非常相似时,函数才会返回匹配的结果。
- 这会减少误匹配(false positives)的几率,即错误地将不同的人脸识别为同一个人。
- 但同时,这也可能会增加漏匹配(false negatives)的几率,即错误地将同一个人的人脸识别为不同的人。
-
较大的容差值:
- 当容差值设置得较大(例如0.6或0.7)时,两个人脸编码之间的差异可以更大,函数仍然可能返回匹配的结果。
- 这会增加误匹配的几率,但会减少漏匹配的几率,使得系统更加倾向于将相似的人脸识别为同一个人。
-
最佳容差值:
- 最佳的容差值取决于具体的应用场景和需求。在一些对安全性要求较高的场景中,可能需要设置一个较小的容差值,以减少误匹配的风险。
- 在其他一些场景中,如果用户体验更为重要,可能需要设置一个较大的容差值,以避免漏匹配,提高识别的便利性。
-
实验和调整:
- 在实际应用中,可能需要通过实验来确定最佳的容差值。这通常涉及到在一组已知的人脸数据上测试不同的容差值,并观察误匹配和漏匹配的发生率。
- 可以通过调整容差值并观察识别准确率的变化来找到最佳的平衡点。
总之,容差值是一个调整识别系统敏感度的工具,它需要根据具体的应用需求和场景来设定。在实际应用中,可能需要多次实验和调整来找到最佳的容差值。
4. 显示结果
plot_faces
函数用于显示两张人脸图像,并根据比较结果设置标题。
def plot_faces(known_image, unknown_image, match):fig, axes = plt.subplots(1, 2, figsize=(12, 6))axes[0].imshow(cv2.cvtColor(known_image, cv2.COLOR_BGR2RGB))axes[0].set_title("Known Face")axes[1].imshow(cv2.cvtColor(unknown_image, cv2.COLOR_BGR2RGB))axes[1].set_title("Unknown Face")# 显示匹配结果if match:plt.suptitle("Faces Match")else:plt.suptitle("Faces Do Not Match")plt.show()
5. 主函数
最后,main
函数将上述步骤整合在一起,加载两张人脸图像,提取编码,并比较它们是否匹配。
def main():try:known_image_path = "D:\\DATAX\\pythonProject9\\known.jpg"unknown_image_path = "D:\\DATAX\\pythonProject9\\unknown2.jpg"known_face_encoding, known_image = load_and_encode_face(known_image_path)unknown_face_encoding, unknown_image = load_and_encode_face(unknown_image_path)match = compare_faces(known_face_encoding, unknown_face_encoding)print(f"Do the faces match? {match}")plot_faces(known_image, unknown_image, match)except ValueError as e:print(e)except Exception as e:print(f"An error occurred: {e}")if __name__ == "__main__":main()
结论
通过这个简单的项目,我们学习了如何使用face_recognition
库来加载图像、提取人脸编码,并比较两个人脸是否相似。这个库的功能非常强大,可以应用于多种场景,包括但不限于安全监控、人脸验证和社交媒体应用。
进一步阅读
- face_recognition库文档
- dlib库文档
- InsightFace:一个开源的深度人脸分析库
相关文章:

基于Pyhton的人脸识别(Python 3.12+face_recognition库)
使用Python进行人脸编码和比较 简介 在这个教程中,我们将学习如何使用Python和face_recognition库来加载图像、提取人脸编码,并比较两个人脸是否相似。face_recognition库是一个强大的工具,它基于dlib的深度学习模型,可以轻松实…...

Spring Boot+Netty
因工作中需要给第三方屏幕厂家下发广告,音频,图片等内容,对方提供TCP接口于是我使用Netty长链接进行数据传输 1.添加依赖 <!-- netty依赖--><dependency><groupId>io.netty</groupId><artifactId>netty-all&…...

LCR 023. 相交链表
一.题目: LCR 023. 相交链表 - 力扣(LeetCode) 二.我的原始解法-无: 三.其他人的正确及好的解法,力扣解法参考: 哈希表法及双指针法:LCR 023. 相交链表 - 力扣(LeetCode࿰…...

Linux命令行下载工具
1. curl 1.1. 介绍 curl是一个功能强大的命令行工具,用于在各种网络协议下传输数据。它支持多种协议,包括但不限于 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、SMTP、POP3、IMAP 等,这使得它在网络数据交互场景中有广泛的应用。curl可以模拟浏览器…...

期末复习-Hadoop名词解释+简答题纯享版
目录 一、名称解释(8选5) 1.什么是大数据 2.大数据的5V特征 3.什么是SSH 4.HDFS(p32) 5.名称节点 6.数据节点 7.元数据 8.倒排索引 9.单点故障 10.高可用 11.数据仓库 二、简答题 1.简述Hadoop的优点及其含义 2.简述…...

嵌入式Linux无窗口系统下搭建 Qt 开发环境
嵌入式Linux无窗口系统下搭建 Qt 开发环境 本文将介绍如何在树莓派的嵌入式 Linux 环境下,搭建 Qt 开发环境,实现无窗口系统模式(framebuffer)下的图形程序开发。 1. 安装 Qt 环境 接下来,安装核心 Qt 开发库以及与 …...

C#基础教程
1. C# 基础语法和操作符 C# 中的运算符优先级 namespace OperatorsAppl {class Program7{static void Main(string[] args){int a 20; // 定义变量aint b 10; // 定义变量bint c 15; // 定义变量cint d 5; // 定义变量dint e; // 定义变量e// 演示运算符优先级&…...

Alibaba EasyExcel 导入导出全家桶
一、阿里巴巴EasyExcel的优势 首先说下EasyExcel相对 Apache poi的优势: EasyExcel也是阿里研发在poi基础上做了封装,改进产物。它替开发者做了注解列表解析,表格填充等一系列代码编写工作,并将此抽象成通用和可扩展的框架。相对p…...

Spring Cloud + MyBatis Plus + GraphQL 完整示例
Spring Cloud MyBatis Plus GraphQL 完整示例 1、创建Spring Boot子项目1.1 配置POM,添加必要的依赖1.2 配置MyBatis-Plus 2、集成GraphQL2.1 定义schema.graphqls2.2 添加GraphQL解析器2.3 配置schame文件配置 3、访问测试3.1 查询测试(演示ÿ…...

uni-app简洁的移动端登录注册界面
非常简洁的登录、注册界面模板,使用uni-app编写,直接复制粘贴即可,无任何引用,全部公开。 废话不多说,代码如下: login.vue文件 <template><view class"content"><view class&quo…...

LongVU:用于长视频语言理解的空间时间自适应压缩
晚上闲暇时间看到一种用于长视频语言理解的空间时间自适应压缩机制的研究工作LongVU,主要内容包括: 背景与挑战:多模态大语言模型(MLLMs)在视频理解和分析方面取得了进展,但处理长视频仍受限于LLM的上下文长…...

Elasticsearch数据迁移(快照)
1. 数据条件 一台原始es服务器(192.168.xx.xx),数据迁移后的目标服务器(10.2.xx.xx)。 2台服务器所处环境: centos7操作系统, elasticsearch-7.3.0。 2. 为原始es服务器数据创建快照 修改elas…...

Linux Cgroup学习笔记
文章目录 Cgroup(Control Group)引言简介Cgroup v1通用接口文件blkio子系统cpu子系统cpuacct子系统cpuset子系统devices子系统freezer子系统hugetlb子系统memory子系统net_cls子系统net_prio子系统perf_event子系统pids子系统misc子系统 Cgroup V2基础操作组织进程和线程popula…...

百问FB显示开发图像处理 - PNG图像处理
2.3 PNG图像处理 2.3.1 PNG文件格式和libpng编译 跟JPEG文件格式一样,PNG也是一种使用了算法压缩后的图像格式,与JPEG不同,PNG使用从LZ77派生的无损数据压缩算法。对于PNG文件格式,也有相应的开源工具libpng。 libpng库可从…...

【JavaWeb后端学习笔记】MySQL多表查询(内连接、外连接、子查询)
MySQL 多表查询 1、连接查询1.1 内连接1.2 外连接 2、子查询2.1 标量子查询2.2 列子查询2.3 行子查询2.4 表子查询 3、多表查询案例 多表查询有两大类:连接查询和子查询。 连接查询又分为隐式/显式内连接和左/右外连接。 子查询又分为标量子查询、列子查询、行子查询…...

RocketMQ 过滤消息 基于tag过滤和SQL过滤
RocketMQ 过滤消息分为两种,一种tag过滤,另外一种是复杂的sql过滤。 tag过滤 首先创建producer然后启动,在这里创建了字符串的数组tags。字符串数组里面放置了多个字符串,然后去发送15条消息。 15条消息随着i的增长,…...

element-ui 基本样式的一些更改【持续更新】
1、 去除el-tabs的底部灰色横线 ::v-deep .el-tabs__nav-wrap::after {height: 0px;}2、el-table设置表头颜色 <el-table:data"tableData":header-cell-style"{background:#F7F8FA,color:#4E5869}"><el-table-columnlabel"序号"type&qu…...

element-ui radio和checkbox禁用时不置灰还是原来不禁用时的样式
把要紧用的内容加上一个class"notEdit-page" z注意要在style里面写不能加上scoped /*//checkBox自定义禁用样式*//*//checkBox自定义禁用样式*/ .notEdit-page.el-checkbox__input.is-disabled.is-checked.el-checkbox__inner::after {border-color: #fff; } .notEdi…...

第一部分:基础知识 6. 函数 --[MySQL轻松入门教程]
MySQL 提供了丰富的内置函数,涵盖了字符串处理、数值计算、日期时间操作、聚合分析以及控制流等多个方面。这些函数可以帮助用户更高效地进行数据查询和处理。 1.字符串函数 MySQL 提供了丰富的字符串函数来帮助用户处理和操作字符串数据。下面是一些常用的 MySQL…...

【蓝桥杯每日一题】扫雷
扫雷 知识点 2024-12-3 蓝桥杯每日一题 扫雷 dfs (bfs也是可行的) 题目大意 在一个二维平面上放置这N个炸雷,每个炸雷的信息有$(x_i,y_i,r_i) $,前两个是坐标信息,第三个是爆炸半径。然后会输入M个排雷火箭࿰…...

【算法】棋盘覆盖问题源代码及精简版
目录 一、题目 二、样例 三、示例代码 四、精简代码 五、总结 对于棋盘覆盖问题的解答和优化。 一、题目 输入格式: 第一行,一个整数n(棋盘n*n,n确保是2的幂次,n<64) 第二行,两个整数…...

Django的介绍
Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。Django遵循MVC设计模式,即模型(Model)、视图(View)和控制器(Controller),并提供了一个即时可用的…...

【Spring工具插件】lombok使用和EditStarter插件
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 引入 一:lombok介绍 1:引入依赖 2:使用 3:原理 4&…...

掌控时间,成就更好的自己
在个人成长的道路上,时间管理是至关重要的一环。有效的时间管理能够让我们更加高效地完成任务,实现自己的目标,不断提升自我。 时间对每个人都是公平的,一天只有 24 小时。然而,为什么有些人能够在有限的时间里做出卓…...

Ruby On Rails 笔记2——表的基本知识
Active Record Basics — Ruby on Rails Guides Active Record Migrations — Ruby on Rails Guides 原文链接自取 1.Active Record是什么? Active Record是MVC模式中M的一部分,是负责展示数据和业务逻辑的一层,可以帮助你创建和使用Ruby…...

【AI系统】EfficientNet 系列
EfficientNet 系列 本文主要介绍 EffiicientNet 系列,在之前的文章中,一般都是单独增加图像分辨率或增加网络深度或单独增加网络的宽度,来提高网络的准确率。而在 EfficientNet 系列论文中,会介绍使用网络搜索技术(NAS)去同时探索…...

【Python小白|Python内置函数学习2】Python有哪些内置函数?不需要导入任何模块就可以直接使用的!现在用Python写代码的人还多吗?
【Python小白|Python内置函数学习2】Python有哪些内置函数?不需要导入任何模块就可以直接使用的!现在用Python写代码的人还多吗? 【Python小白|Python内置函数学习2】Python有哪些内置函数?不需要导入任何模块就可以直接使用的&a…...

蓝桥杯分治
P1226 【模板】快速幂 题目描述 给你三个整数 𝑎,𝑏,𝑝a,b,p,求 𝑎𝑏 mod 𝑝abmodp。 输入格式 输入只有一行三个整数,分别代表 𝑎,𝑏,𝑝a,b,p。…...

YOLOv8实战无人机视角目标检测
本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对无人机目标数据集进行训练和优化,该数据集包含丰富的无人机目标图像…...

三、【docker】docker和docker-compose的常用命令
文章目录 一、docker常用命令1、镜像管理2、容器管理3、容器监控和调试4、网络管理5、数据卷管理6、系统维护7、实用组合命令8、常用技巧二、docker-compose常用命令1、基本命令2、构建相关3、运行维护4、常用组合命令5、实用参数 一、docker常用命令 1、镜像管理 # 查看本地…...