基于 Python 的人脸识别:使用 face_recognition 库实现
人脸识别技术已经广泛应用于各种场景,如安全监控、智能家居、社交网络、金融支付等。Python 是开发人脸识别系统的流行语言之一,得益于丰富的机器学习库和工具。在这篇教程中,我们将使用 Python 3.12 和 face_recognition 库来实现一个简单的人脸识别系统。
1. 安装依赖
首先,确保你已经安装了 Python 3.12 及其相关依赖。然后我们需要安装 face_recognition 和其他必需的库。
1.1 安装依赖
pip install face_recognition opencv-python numpy
- face_recognition:用于人脸识别的主要库。
- opencv-python:用于加载、显示和处理图片。
- numpy:用于处理矩阵运算和图像数组。
安装完这些依赖后,我们可以开始编写代码。
2. 人脸识别基础概念
face_recognition 库封装了许多人脸识别的复杂操作,使得我们可以非常方便地识别人脸、提取面部特征和进行人脸比对。下面是一些关键概念:
- 人脸检测:从图像中识别出所有的人脸。
- 人脸编码:将人脸图像转换为一个数值向量(特征编码),这个向量可以用于比较人脸的相似度。
- 人脸匹配:比较两个人脸编码是否相似,从而判断两张脸是否属于同一个人。
3. 基本使用:检测人脸并标记
3.1 加载和显示图像
首先,我们来实现一个简单的功能:加载图像并标记其中的人脸。
import cv2
import face_recognition
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 转换为RGB格式(OpenCV默认读取BGR格式)
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 查找所有的人脸位置
face_locations = face_recognition.face_locations(rgb_image)
# 在图像中标记人脸位置
for (top, right, bottom, left) in face_locations:
# 绘制矩形框标记人脸
cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 3)
# 显示图像
cv2.imshow('Face Recognition', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.2 代码解析
cv2.imread():读取图像文件。face_recognition.face_locations():检测图像中的人脸,并返回一个包含人脸位置的列表。每个位置是一个元组(top, right, bottom, left),表示矩形框的四个角坐标。cv2.rectangle():在图像中绘制矩形框,标记出人脸区域。cv2.imshow():显示图像窗口。
运行这段代码后,你会看到一个带有矩形框标记人脸的图像。
4. 人脸编码:提取人脸特征
接下来,我们将提取图像中人脸的特征编码。特征编码是一个128维的向量,可以唯一标识一个人脸。通过比较人脸编码,我们可以进行人脸匹配。
import face_recognition
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 转换为RGB格式
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 查找人脸编码
face_encodings = face_recognition.face_encodings(rgb_image)
if len(face_encodings) > 0:
# 取第一个人脸的编码
face_encoding = face_encodings[0]
print(f"Face encoding: {face_encoding}")
else:
print("No face found in the image")
4.1 代码解析
face_recognition.face_encodings():提取图像中所有人脸的特征编码。返回的是一个包含每个人脸编码的列表。如果没有检测到人脸,则返回空列表。- 每个人脸编码是一个128维的向量,能够唯一表示人脸的特征。
运行代码后,你将会看到输出的人脸编码向量。
5. 人脸匹配:比对两张人脸是否相同
我们可以使用人脸编码来比较两张图像中的人脸是否相似。通过计算两个编码之间的欧几里得距离,若距离小于某个阈值,则认为两张人脸属于同一个人。
import face_recognition
# 加载两张图片
image1 = face_recognition.load_image_file('image1.jpg')
image2 = face_recognition.load_image_file('image2.jpg')
# 获取两张图片的人脸编码
encoding1 = face_recognition.face_encodings(image1)[0]
encoding2 = face_recognition.face_encodings(image2)[0]
# 比较两张人脸编码
results = face_recognition.compare_faces([encoding1], encoding2)
if results[0]:
print("The two faces are the same person!")
else:
print("The two faces are different people.")
5.1 代码解析
face_recognition.load_image_file():加载图片文件并将其转换为可以处理的人脸数据格式。face_recognition.compare_faces():比较两个人脸的特征编码,返回一个布尔值,表示两张人脸是否相同。
通过运行此代码,你可以轻松地比较两张人脸是否属于同一个人。
6. 高级功能:识别多张人脸并标记名字
我们可以扩展功能,让程序同时识别多张人脸,并标记每个人的名字。我们将利用预先录入的人脸图像来为检测到的人脸进行匹配。
import face_recognition
import cv2
# 加载已知人物图像和编码
known_image = face_recognition.load_image_file('known_person.jpg')
known_encoding = face_recognition.face_encodings(known_image)[0]
# 加载待识别图像
unknown_image = cv2.imread('unknown.jpg')
# 转换为RGB格式
rgb_image = cv2.cvtColor(unknown_image, cv2.COLOR_BGR2RGB)
# 查找图像中的人脸
face_locations = face_recognition.face_locations(rgb_image)
face_encodings = face_recognition.face_encodings(rgb_image, face_locations)
# 将已知人脸编码添加到一个列表中
known_encodings = [known_encoding]
# 对每个识别出的人脸进行比对
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
matches = face_recognition.compare_faces(known_encodings, face_encoding)
name = "Unknown Person"
if True in matches:
first_match_index = matches.index(True)
name = "Known Person"
# 绘制矩形框并标记姓名
cv2.rectangle(unknown_image, (left, top), (right, bottom), (0, 255, 0), 2)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(unknown_image, name, (left + 6, bottom - 6), font, 0.5, (255, 255, 255), 1)
# 显示图像
cv2.imshow('Face Recognition', unknown_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
6.1 代码解析
- 我们首先加载一个已知的图像,并提取其中的编码。
- 然后我们加载一个待识别的图像,对图像中的每一张人脸进行编码。
- 使用
compare_faces()来检查每张待识别的人脸与已知人脸编码是否匹配。 - 最后,在图像中绘制矩形框,并标注人名。
7. 总结
本文介绍了如何使用 Python 和 face_recognition 库进行人脸识别。我们从最基础的人脸检测、编码提取到人脸匹配,再到如何识别和标记多张人脸。你可以利用这些功能来构建强大的智能人脸识别应用。
关键点回顾:
- 使用 face_recognition 提供的简单接口进行人脸检测和识别。
- 提取人脸编码,并使用这些编码进行人脸匹配。
- 结合 OpenCV 来展示结果和进行图像处理。
这些功能可以广泛应用于安全监控、自动化考勤、身份验证等领域。希望你能够基于本文的示例,进一步探索更多的人脸识别应用场景!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)