face_recognition :一个 “开箱即用” 的人脸识别工具
face_recognition 是一个基于 Python 的开源人脸识别库,它封装了底层的计算机视觉算法(依赖 dlib 库),提供了简单易用的 API,让开发者可以快速实现人脸检测、识别、特征提取等功能。其核心优势是准确率高(基于深度学习模型)、接口简洁(几行代码即可实现核心功能),非常适合初学者和快速开发场景。
一、核心功能
face_recognition 主要提供四大核心功能:
- 人脸检测:定位图片中人脸的位置(返回边界框坐标)。
- 人脸特征提取:将人脸转换为 128 维的特征向量(“人脸编码”),用于后续比较。
- 人脸识别:通过比较两个人脸的特征向量,判断是否为同一个人。
- 人脸关键点检测:定位人脸的关键部位(如眼睛、鼻子、嘴巴等)的坐标。
二、安装步骤
face_recognition 依赖 dlib 库(一个强大的机器学习库),因此安装时需要先确保 dlib 能正常安装。
1. 安装依赖
-
Windows 系统:
- 先安装 CMake(用于编译 dlib),并添加到系统环境变量。
- 安装 Visual Studio(需勾选 “C++ 桌面开发” 组件,提供编译工具)。
-
macOS 系统:
- 通过 Homebrew 安装依赖:
brew install cmake dlib
。
- 通过 Homebrew 安装依赖:
-
Linux 系统:
- 通过 apt 安装依赖:
sudo apt-get install cmake libboost-all-dev
。
- 通过 apt 安装依赖:
2. 安装 face_recognition
依赖安装完成后,通过 pip 安装:
bash
pip install face_recognition
三、核心 API 详解
下面通过代码示例讲解核心功能的使用。
1. 人脸检测(定位人脸位置)
使用 face_locations()
函数,返回图片中所有人脸的边界框坐标(top, right, bottom, left
,即上、右、下、左的像素坐标)。
示例代码:
python
运行
import face_recognition
from PIL import Image, ImageDraw# 加载图片(支持 jpg、png 等格式)
image = face_recognition.load_image_file("people.jpg")# 检测人脸位置(默认使用 HOG 模型,适合 CPU;可选 "cnn" 模型,更准确但速度慢)
face_locations = face_recognition.face_locations(image, model="hog")print(f"检测到 {len(face_locations)} 张人脸")# 用 PIL 绘制边界框
pil_image = Image.fromarray(image)
draw = ImageDraw.Draw(pil_image)for (top, right, bottom, left) in face_locations:# 绘制矩形框(红色,线宽 2)draw.rectangle(((left, top), (right, bottom)), outline=(255, 0, 0), width=2)# 保存结果
pil_image.save("detected_people.jpg")
说明:
model="hog"
:基于方向梯度直方图的模型,速度快,适合 CPU。model="cnn"
:基于卷积神经网络的模型,准确率更高,适合 GPU 加速(需 dlib 支持 CUDA)。
2. 人脸特征提取(生成 “人脸编码”)
使用 face_encodings()
函数,将人脸转换为 128 维的特征向量(“编码”)。同一个人的不同照片,编码会非常相似;不同人的编码差异较大。
示例代码:
python
运行
import face_recognition# 加载已知人脸图片(如“张三”的照片)
known_image = face_recognition.load_image_file("zhangsan.jpg")
# 提取特征编码(返回列表,取第一个元素)
zhangsan_encoding = face_recognition.face_encodings(known_image)[0]print("张三的人脸编码(前 10 维):", zhangsan_encoding[:10])
说明:
- 128 维向量的每个维度代表人脸的一个特征(如眼睛距离、鼻梁角度等),通过向量距离(如欧氏距离)可衡量人脸相似度。
3. 人脸识别(比较人脸是否为同一人)
通过 compare_faces()
或 face_distance()
比较编码:
compare_faces(known_encodings, unknown_encoding, tolerance=0.6)
:返回布尔值列表,True
表示匹配(默认阈值 0.6,值越小越严格)。face_distance(known_encodings, unknown_encoding)
:返回未知编码与每个已知编码的欧氏距离,距离越小越相似。
示例代码:
python
运行
import face_recognition# 1. 准备已知人脸编码
zhangsan_image = face_recognition.load_image_file("zhangsan.jpg")
zhangsan_encoding = face_recognition.face_encodings(zhangsan_image)[0]lisi_image = face_recognition.load_image_file("lisi.jpg")
lisi_encoding = face_recognition.face_encodings(lisi_image)[0]known_encodings = [zhangsan_encoding, lisi_encoding]
known_names = ["张三", "李四"]# 2. 加载待识别图片
unknown_image = face_recognition.load_image_file("unknown.jpg")
unknown_encodings = face_recognition.face_encodings(unknown_image)# 3. 逐个比对
for unknown_encoding in unknown_encodings:# 比较与已知编码的匹配度matches = face_recognition.compare_faces(known_encodings, unknown_encoding)# 计算距离(越小越相似)distances = face_recognition.face_distance(known_encodings, unknown_encoding)# 找到最匹配的人脸best_match_index = distances.argmin()if matches[best_match_index]:name = known_names[best_match_index]print(f"识别结果:{name}(距离:{distances[best_match_index]:.2f})")else:print("未匹配到已知人脸")
4. 人脸关键点检测
使用 face_landmarks()
函数,返回人脸关键部位(如眼睛、眉毛、鼻子等)的坐标列表。
示例代码:
python
运行
import face_recognition
from PIL import Image, ImageDrawimage = face_recognition.load_image_file("person.jpg")
# 获取关键点(眼睛、鼻子、嘴巴等)
face_landmarks_list = face_recognition.face_landmarks(image)pil_image = Image.fromarray(image)
draw = ImageDraw.Draw(pil_image)for face_landmarks in face_landmarks_list:# 绘制所有关键点(如眼睛、眉毛)for feature_name, points in face_landmarks.items():# 每个特征用不同颜色绘制color = (0, 255, 0) if feature_name in ["left_eye", "right_eye"] else (0, 0, 255)draw.point(points, fill=color)pil_image.save("landmarks.jpg")
说明:返回的关键点包含 12 个部分:chin
(下巴)、left_eyebrow
(左眉)、right_eyebrow
(右眉)、nose_bridge
(鼻梁)、nose_tip
(鼻尖)、left_eye
(左眼)、right_eye
(右眼)、top_lip
(上唇)、bottom_lip
(下唇)等。
四、性能优化与注意事项
-
速度优化:
- 优先使用
model="hog"
进行快速检测,cnn
模型适合高精度场景(需 GPU 支持)。 - 处理视频或批量图片时,可缩小图片尺寸(如缩放到 1/4 大小)再检测,减少计算量。
- 优先使用
-
准确率影响因素:
- 图片质量:模糊、光照过强 / 过暗、侧脸等可能降低准确率。
- 阈值调整:
tolerance=0.6
是默认值,严格场景可降低(如 0.5),宽松场景可提高(如 0.7)。
-
依赖问题:
- 若 dlib 安装失败,可尝试安装预编译版本(如 Windows 下
pip install dlib-19.22.99-cp39-cp39-win_amd64.whl
,需匹配 Python 版本)。
- 若 dlib 安装失败,可尝试安装预编译版本(如 Windows 下
五、应用场景
- 身份验证(如人脸解锁、打卡系统)。
- 照片分类(自动按人脸整理相册)。
- 监控系统(实时识别可疑人员)。
- 社交应用(自动标记好友)。
总结
face_recognition 是一个 “开箱即用” 的人脸识别工具,通过简单的 API 封装了复杂的深度学习逻辑,非常适合快速开发。但需注意其依赖安装和性能限制,在实时或大规模场景中可能需要结合 GPU 加速或更专业的框架(如 TensorFlow/PyTorch)优化。