face_recognition
仅用3行Python代码实现人脸检测、特征点定位与身份识别的开源工具包
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
仅用3行Python代码实现人脸检测、特征点定位与身份识别的开源工具包
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下这个场景:你整理完一整年的家庭相册,上千张照片里孩子的脸从婴儿肥逐渐长成少年,亲戚朋友来来去去——想把同一个人在不同照片里找出来,以前得靠肉眼一张张比对。现在,Python 开发者 Adam Geitgey 在 2017 年开源的 face_recognition 库,让这件事变得像调用一个函数一样简单:你给程序两张照片,它告诉你这是不是同一个人。
这个项目的诞生颇具戏剧性。Adam Geitgey 原本是机器学习领域的工程师,他在 Medium 上写了一篇名为《Machine Learning is Fun!》的系列文章,其中第四篇详细讲解了如何用深度学习做现代人脸识别。文章发布后迅速在社交网络刷屏,无数开发者涌入留言区询问"哪里能找到代码"——于是 Geitgey 把整个实现打包成了这个开源库,发布到 GitHub。
2017 年 3 月上线至今,该项目已斩获 56,000+ stars,fork 数超过 13,700,在 Python 机器学习类项目中持续位居前列。它甚至催生了整个 AI 爱好者社区里"用 5 行代码做人脸识别"的入门范式。
face_recognition 本质上是一个封装层,真正的核心引擎是 Davis King 开发的 dlib 库中的人脸识别模型。该模型基于深度残差网络(ResNet-10 结构),在 LFW(Labeled Faces in the Wild)标准测试集上达到了 99.38% 的识别准确率,这在当时是商业级别的性能。
它的技术流程分为两步:
第一步:人脸检测(Face Detection)。给定一张图片,库会找出图中所有人脸的位置,用矩形框标注。底层支持两种检测算法——传统的 HOG(方向梯度直方图)特征,速度快、CPU 友好;以及基于 CNN 深度卷积网络的检测模型,精度更高但需要 GPU 加速。
第二步:人脸编码(Face Encoding)。找到人脸后,将每张脸的 68 个面部特征点(眼睛、鼻子、嘴巴、眉毛等的坐标)提取出来,通过神经网络映射为一个 128 维的向量——这相当于给每张脸生成了一份独一无二的"数字指纹"。比对时,只需计算两个向量的欧氏距离:距离小于阈值(默认 0.6),判断为同一人。
安装后系统自带两个 CLI 命令:face_recognition 和 face_detection。前者用于人脸识别(需要提供已知人物的参考图片目录),后者仅做检测。典型用法:
# 识别照片中的人是谁
face_recognition ./known_people/ ./unknown_photo.jpg
# 输出: ./unknown_photo.jpg,Barack Obama
# 找出照片中所有人脸的位置
face_detection ./group_photo.jpg
# 输出: ./group_photo.jpg,65,215,169,112
支持多线程加速(--cpus 参数),以及调节识别阈值(--tolerance),还可以显示每张脸的比对距离(--show-distance true)。
import face_recognition
# 加载图片并找出人脸
image = face_recognition.load_image_file("photo.jpg")
face_locations = face_recognition.face_locations(image)
# 用 CNN 模型检测(更准,需 GPU)
face_locations = face_recognition.face_locations(image, model="cnn")
# 提取面部特征点
landmarks = face_recognition.face_landmarks(image)
# 人脸识别:已知 vs 未知
known_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
result = face_recognition.compare_faces([known_encoding], unknown_encoding)
项目自带丰富的示例代码,涵盖:实时摄像头人脸识别(facerec_from_webcam.py)、视频文件分析(facerec_from_video_file.py)、人脸模糊隐私处理(blur_faces_on_webcam.py)、数字美妆效果(digital_makeup.py)、眨眼检测(blink_detection.py)、树莓派部署(facerec_on_raspberry_pi.py),以及 Flask HTTP Web 服务(web_service_example.py)——将识别能力暴露为 REST API。
架构风格:轻量封装型。face_recognition/ 目录下仅有 4 个 Python 文件:__init__.py 做导入聚合,api.py 是核心 API,face_detection_cli.py 和 face_recognition_cli.py 分别封装命令行工具。这种极简结构让项目非常容易阅读和维护——任何人都能在 10 分钟内理解全部核心逻辑。
依赖管理:通过 requirements.txt 明确声明 5 个依赖:dlib(核心)、face_recognition_models(预训练权重)、numpy、scipy、Pillow。无多余依赖链。setup.py 支持标准 pip install。
容器化支持:项目提供 Dockerfile(基于 python:3.10-slim-bullseye)和 docker-compose.yml,一键 docker-compose up --build 即可在隔离环境中运行示例。同时提供 Dockerfile.gpu 支持 Nvidia GPU 加速(需 nvidia-docker)。
文档质量:出色的多语言文档覆盖(英文/简体中文/韩文/日文均有 README),完整的 Sphinx 文档站(ReadTheDocs),安装指南详细到覆盖 macOS/Ubuntu/Jetson Nano/树莓派/FreeBSD/Windows。配套 Medium 教程文章让非 ML 背景开发者也能理解原理。
face_recognition 并非完美无缺,开发者和使用者需要注意以下问题:
face_recognition 的意义远不止于一个工具库。它代表了 2017 年那波"AI 民主化"浪潮中一个极佳的产品化案例:用最少的 API、最低的门槛,把最前沿的深度学习技术交到普通开发者手里。
在它出现之前,人脸识别的入门门槛极高:需要理解 CNN、Triplet Loss、FaceNet 等概念,还要自己训练模型。Geitgey 的做法是"我只给你 3 个函数,你拿去用就好"——这种产品直觉让它成为全球无数 AI 入门教程的标配素材,至今仍在持续活跃更新。
虽然 2020 年后商用人脸识别技术已高度成熟(如 ArcFace、Face++ 等),但 face_recognition 作为教育工具和本地离线识别场景的首选依然不可替代——它不依赖任何云服务,128维向量完全本地计算,数据不出本地。