命令行工具
ageitgey/face_recognition avatar
ageitgey/face_recognition

face_recognition:一行代码做人脸识别的 Python 库,但你需要先搞定 dlib

世界上最简单的 Python 和命令行面部识别 API。

56,743 个 Star13,689 个 ForkPythonMIT
GitHub

秒懂

它是什么?
face_recognition 号称世界最简单的人脸识别 API,基于 dlib 的深度学习模型,在 LFW 基准上达到 99.38% 准确率。它把复杂的人脸检测、特征提取和比对封装成几个函数,适合快速原型,但安装依赖和性能瓶颈是绕不开的门槛。
适合谁用?
face_recognition 适合需要快速验证人脸识别思路的 Python 开发者,尤其是原型阶段:你可以在几分钟内写出从图片中定位人脸、提取特征并比对的代码。但如果你要部署到生产环境,或者需要实时处理视频流,它可能不是最佳选择。
能商用吗?
可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 82 天前。
用什么语言写的?
主要是 Python(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月14日)和我们的分析,不构成法律意见。

开源项目深度解析

它解决什么问题,谁该用它

它解决什么问题,谁该用它。人脸识别在 2018 年还不是随手可得的 Python 库。你要么自己训练模型,要么调用云服务,要么在 OpenCV 里拼凑 Haar 级联。face_recognition 把 dlib 的深度学习模型包装成几个简单函数,让开发者用几行代码完成人脸定位、特征提取和身份比对。它面向的是不想深究底层原理、想快速做出原型的人。比如一个周末项目,或者一个需要人脸比对功能的内部工具。它不适合需要高精度定制模型或低延迟推理的生产系统,因为封装层隐藏了太多细节,你很难干预中间过程。

核心机制:从图片到 128 维特征向量

库的运作方式很直接。你调用 load_image_file 读入图片,然后 face_locations 用 dlib 的 HOG 或 CNN 检测器找出人脸边界框。face_landmarks 进一步定位眼睛、鼻子、嘴和下巴的轮廓点。最关键的是 face_encodings,它把每张脸转换为一个 128 维的数值向量。compare_faces 函数计算这些向量之间的欧氏距离,距离小于 tolerance 就判定为同一人。整个过程不需要你接触任何模型文件或张量运算。README 给出的示例里,识别拜登照片只需三行核心代码。这种设计让初学者能立刻上手,但也意味着你无法调整模型结构或训练新数据,只能接受 dlib 预训练模型的行为。

安装:真正的门槛在 dlib

pip3 install face_recognition 只是最后一步。在此之前,你必须先安装 dlib 及其 Python 绑定。README 明确要求 macOS 或 Linux,Windows 不被官方支持。dlib 需要从源码编译,依赖 cmake。在 macOS 上先执行 brew install cmake,然后按照作者提供的 gist 指南编译 dlib。对树莓派 2+ 和 Nvidia Jetson Nano 有专门的安装文章,Jetson 上还有一个已知坑:CUDA 库的 bug 会导致库静默失败,必须按文章指示注释掉 dlib 中的一行代码再重新编译。FreeBSD 用户可以直接 pkg install graphics/py-face_recognition。Windows 用户只能依赖社区教程,比如 @masoudr 的指南。整个过程对不熟悉编译工具链的人是个不小的挑战。如果你只是想试一下,作者还提供了一个预配置的虚拟机镜像,省去编译麻烦。

命令行工具:两分钟完成人脸识别

安装后你会得到两个命令。face_recognition 接受两个参数:已知人物图片文件夹和未知图片文件夹。已知文件夹里每个文件按人名命名,比如 biden.jpg。运行 face_recognition ./known_people/ ./unknown_pictures/,输出是逗号分隔的文本,每行一个检测到的人脸,格式为文件名,人名。如果没匹配到任何人,就显示 unknown_person。face_detection 命令只做检测,输出人脸边界框的像素坐标,顺序是 top,right,bottom,left。这两个命令适合批量处理图片,比如给照片集打标签。但输出格式很简单,没有 JSON 或 XML 选项,如果你要集成到自动化流程里,可能需要自己解析文本。

调整 tolerance:默认值可能不够用

README 提到一个实际问题:如果同一人出现多个匹配结果,说明照片里的人长得太像,需要降低 --tolerance 参数让比对更严格。tolerance 是 compare_faces 的距离阈值,默认值在文档中被截断了,但你可以通过命令行参数覆盖。这个参数直接影响误报率。设置太低会漏掉真实匹配,设置太高会把不同的人认成同一个。文档没有给出推荐范围,你需要在自己的图片集上实验。这是库的灵活性所在,也是它的一个弱点:没有自动调优机制,完全靠用户手动调整。对于大规模数据集,手动调整 tolerance 几乎不可行。

局限与失败模式:性能、平台和精度

首先,性能是硬伤。dlib 的深度学习模型在 CPU 上运行很慢,尤其是 face_locations 使用 CNN 检测器时。README 提供了 webcam 实时识别的示例,但那是用 HOG 检测器加快速编码,帧率仍然有限。其次,Windows 不支持,这排除了大量桌面开发者。第三,准确率 99.38% 是在 LFW 基准上测的,那是受控环境下的正面人脸。真实场景中,侧脸、遮挡、低光照都会显著降低效果。第四,库从 2018 年 4 月后就没有再更新,v1.2.2 是最后一个版本。这意味着它不会适配新的 Python 版本或 dlib 更新。最后,模型本身是固定的,你无法针对特定人群(比如亚洲人脸)微调。如果你的场景需要高鲁棒性,这个库可能不够用。

替代方案:dlib 本身与 OpenCV

最直接的替代是直接用 dlib。face_recognition 的底层就是 dlib,但 dlib 的接口更底层,你需要自己处理模型加载、图像缩放和特征比对。好处是你能控制更多细节,比如选择不同的检测模型,或者自己训练分类器。另一个常见选择是 OpenCV 的人脸检测模块,它提供 Haar 级联和 DNN 检测器,但 OpenCV 本身不提供特征提取和比对,你需要额外搭配 face_recognition 或其他库。还有深度学习的现代方案,比如 FaceNet 或 ArcFace,它们通常需要 TensorFlow 或 PyTorch,学习曲线更陡,但精度和性能可能更好。选择取决于你的需求:快速原型用 face_recognition,需要控制底层用 dlib,需要最新模型就用深度学习框架。

维护与许可证:MIT 的便利与停滞的风险

face_recognition 使用 MIT 许可证,这意味着你可以自由使用、修改和分发,包括商业用途。但注意,它依赖的 dlib 是 Boost Software License,也是宽松许可证,两者都没有传染性。然而,项目自 2018 年后没有新提交,README 中的安装指南可能过时。例如,Python 3.3+ 的要求在今天看来太低了,新版 Python 可能无法兼容旧版的 dlib。如果你要长期使用,需要自己维护依赖版本,或者考虑 fork。另一个隐含成本是模型文件的更新,dlib 的模型是独立的,你可以单独升级 dlib 而不升级 face_recognition,但接口可能不匹配。总之,许可证友好,但项目的停滞状态意味着你要承担未来的兼容性风险。

编辑结论

face_recognition 适合需要快速验证人脸识别思路的 Python 开发者,尤其是原型阶段:你可以在几分钟内写出从图片中定位人脸、提取特征并比对的代码。但如果你要部署到生产环境,或者需要实时处理视频流,它可能不是最佳选择。首先确认你的目标平台能否顺利编译 dlib,特别是 Windows 用户要提前查好社区安装指南。其次,测试你的图片集在默认 tolerance 值下的误报率,必要时调整 --tolerance 参数。最后,评估性能:在普通 CPU 上处理一张图片可能需要数秒,如果数据量大会很吃力。如果你的需求只是人脸检测而非识别,可以直接用 OpenCV 或 dlib 自带接口,省去安装整个库的麻烦。

官方来源

  1. Official README
  2. Project repository
  3. Release notes
社区笔记

社区笔记