用Python实现最简单的人脸识别:调用现成库快速上手
用Python实现最简单的人脸识别:调用现成库快速上手
引言/概述
人脸识别是计算机视觉领域中一个热门且实用的技术,广泛应用于安防、身份验证、智能相册、社交娱乐等多个场景。虽然从零开始实现一套完整的人脸识别系统需要深厚的数学、图像处理和深度学习知识,但得益于开源社区的蓬勃发展,如今我们只需几行 Python 代码,就能借助成熟的第三方库快速实现基础的人脸识别功能。
本文将带你使用 Python 和现成的开源库(如 face_recognition)构建一个最简单的人脸识别程序。我们将涵盖环境准备、人脸检测、人脸编码、人脸识别对比等核心步骤,并通过清晰的代码示例帮助你快速上手。即使你是编程新手,也能在10分钟内运行出自己的第一个人脸识别程序。
注意:本文聚焦于“可用性”而非“原理深度”,目标是让你快速体验人脸识别的效果。如需深入理解底层算法(如 HOG、CNN、FaceNet 等),建议后续学习相关论文或课程。
核心内容
一、选择合适的库:为什么推荐 face_recognition
在 Python 生态中,有多个可用于人脸识别的库,例如:
- OpenCV:功能强大,但人脸识别模块(如 LBPH、EigenFaces)准确率较低,且需自行训练模型。
- dlib:提供了基于 HOG 和 CNN 的人脸检测与特征提取,但安装复杂,依赖较多。
- face_recognition:由 Adam Geitgey 开发,基于 dlib 构建,封装了人脸检测、特征编码和比对功能,API 极其简洁,适合初学者。
因此,我们选择 face_recognition 作为本次教程的核心库。它最大的优势是:一行代码识别人脸,三行代码完成比对。
⚠️ 注意:
face_recognition仅支持 Python 3.6+,且在 Windows 上安装可能较慢(因需编译 dlib)。
二、环境准备与安装
首先,确保你的系统已安装 Python 3.6 或更高版本。然后通过 pip 安装所需库:
pip install face_recognition pillow
face_recognition:主库,提供人脸识别功能。pillow:用于图像处理(加载、显示图片)。
💡 提示:在 macOS 或 Linux 上安装通常较顺利;Windows 用户若遇到 dlib 编译问题,可尝试使用 Anaconda 或预先编译的 wheel 文件。
安装完成后,可通过以下代码验证是否安装成功:
import face_recognition
print("face_recognition 库加载成功!")
若无报错,说明环境已就绪。
三、人脸检测:找出图像中的人脸位置
人脸识别的第一步是人脸检测——即在图像中定位人脸的位置(通常以矩形框表示)。
使用 face_recognition,只需调用 face_locations() 函数:
from PIL import Image
import face_recognition
# 加载图像
image = face_recognition.load_image_file("your_photo.jpg")
# 检测人脸位置(返回 (top, right, bottom, left) 坐标)
face_locations = face_recognition.face_locations(image)
print(f"检测到 {len(face_locations)} 张人脸")
for i, (top, right, bottom, left) in enumerate(face_locations):
print(f"人脸 {i+1}: 位置 ({left}, {top}) 到 ({right}, {bottom})")
这段代码会输出图像中所有人脸的边界框坐标。你可以用 PIL.Image 将其可视化:
from PIL import Image, ImageDraw
# 将 numpy 数组转为 PIL 图像
pil_image = Image.fromarray(image)
draw = ImageDraw.Draw(pil_image)
# 绘制人脸框
for (top, right, bottom, left) in face_locations:
draw.rectangle(((left, top), (right, bottom)), outline="red", width=3)
# 显示或保存结果
pil_image.show() # 或 pil_image.save("output.jpg")
四、人脸编码:将人脸转化为128维特征向量
仅仅检测到人脸还不够,我们需要一种方式来“描述”这张脸,以便进行比对。face_recognition 使用 128维特征向量(face encoding) 来表示每个人脸。这个向量由深度卷积神经网络(基于 FaceNet 架构)生成,相似的人脸在向量空间中距离更近。
获取人脸编码非常简单:
# 假设 image 中只有一张人脸
face_encodings = face_recognition.face_encodings(image)
if face_encodings:
my_face_encoding = face_encodings[0] # 获取第一张人脸的编码
print("人脸编码已生成,维度:", len(my_face_encoding)) # 输出 128
else:
print("未检测到人脸!")
✅ 关键点:同一人的不同照片(不同角度、光照)会产生相近但不完全相同的编码。系统通过计算欧氏距离判断是否为同一人。
五、人脸识别:比对两张人脸是否属于同一人
现在,我们可以实现最核心的功能——判断两张照片中的人是否为同一人。
假设你有两张照片:me.jpg(你自己的照片)和 unknown.jpg(待识别的照片)。
# 加载已知人脸
known_image = face_recognition.load_image_file("me.jpg")
known_encoding = face_recognition.face_encodings(known_image)[0]
# 加载未知人脸
unknown_image = face_recognition.load_image_file("unknown.jpg")
unknown_encodings = face_recognition.face_encodings(unknown_image)
if unknown_encodings:
unknown_encoding = unknown_encodings[0]
# 比对人脸(返回 True/False 列表)
results = face_recognition.compare_faces([known_encoding], unknown_encoding)
if results[0]:
print("✅ 是同一个人!")
else:
print("❌ 不是同一个人。")
else:
print("未知图像中未检测到人脸。")
compare_faces() 默认使用 0.6 作为阈值(欧氏距离)。你也可以手动调整:
distance = face_recognition.face_distance([known_encoding], unknown_encoding)
if distance[0] < 0.5: # 更严格的阈值
print("高度匹配!")
六、进阶:识别多个人并打标签
实际应用中,我们常需要从一群人中识别出特定个体。下面是一个简单示例:
# 已知人物及其照片
known_faces = {
"Alice": face_recognition.load_image_file("alice.jpg"),
"Bob": face_recognition.load_image_file("bob.jpg"),
}
# 生成编码字典
known_encodings = {}
for name, img in known_faces.items():
encodings = face_recognition.face_encodings(img)
if encodings:
known_encodings[name] = encodings[0]
# 待识别图像
group_photo = face_recognition.load_image_file("group.jpg")
group_encodings = face_recognition.face_encodings(group_photo)
face_locations = face_recognition.face_locations(group_photo)
# 逐个比对
pil_image = Image.fromarray(group_photo)
draw = ImageDraw.Draw(pil_image)
for (top, right, bottom, left), face_encoding in zip(face_locations, group_encodings):
name = "Unknown"
for known_name, known_encoding in known_encodings.items():
match = face_recognition.compare_faces([known_encoding], face_encoding, tolerance=0.6)
if match[0]:
name = known_name
break
# 绘制标签
draw.rectangle(((left, top), (right, bottom)), outline="blue", width=2)
draw.text((left, bottom + 10), name, fill="green")
pil_image.show()
此代码可在合照中标注出已知人物的名字,其余标记为 “Unknown”。
总结
通过本文,我们使用 Python 和 face_recognition 库实现了最简单的人脸识别流程:
- 安装库:
pip install face_recognition pillow - 人脸检测:
face_locations()定位人脸 - 特征编码:
face_encodings()生成128维向量 - 人脸比对:
compare_faces()判断是否为同一人 - 多脸识别:结合循环与字典实现批量识别
这套方案虽然简单,但背后依托的是强大的深度学习模型(dlib 的 ResNet),在普通场景下准确率相当高。当然,它也有局限性:对侧脸、遮挡、低光照等情况表现不佳;且无法处理大规模人脸数据库(如百万级)。
但对于学习、原型开发或小型项目(如家庭相册自动分类、门禁系统 demo),它已经足够强大且易于使用。
🌟 下一步建议:
- 尝试用摄像头实时识别人脸(结合 OpenCV 的
cv2.VideoCapture)- 将人脸编码保存到文件或数据库,避免重复计算
- 学习
dlib或OpenCV的更高级用法,提升性能与鲁棒性
人脸识别的世界才刚刚开启,希望这篇入门指南能为你打开大门!

评论 0