先跟大家交个底:拿Python和OpenCV做“人脸识别”,这件事的难点从来不在算法本身,而在环境、模型和报错这三道坎。网上随便一搜全是demo代码,但真正往摄像头前面一摆,从 import cv2 开始就有一堆人卡住——模块装不上、版本不匹配、摄像头打不开、视频写不进去,好不容易跑起来又发现只是画了个框,根本没识别出“这是谁”。我最近正好在用人脸识别做门禁验证系统,从OpenCV环境安装、图像处理到深度模型推理完整跑了一遍,踩过的坑比看过的教程还多。这篇文章就用OpenCV和Python,把从零到实时人脸识别、再到能比对出具体身份的完整链路讲清楚,环境问题、模型选型、代码实现和常见报错都覆盖到,最后聊几个往产品化走时的进阶方向。想少走弯路的话,可以照着这份实操顺序来。
1. 先把概念捋清楚:人脸检测≠人脸识别
1.1 检测是找脸,识别是认人
我在帮人看代码的时候,发现大多数人一开始就把这两个词混在一起用。人脸检测(Face Detection)解决的是“画面里有没有人脸,脸在哪里”,输出通常是一个矩形框,可能附带几个关键点;人脸识别(Face Recognition)解决的是“这张脸到底是谁”,输出的是一个身份标签,或者一个可以用来比对的向量。
这个区别直接决定了你该用什么工具。网上很多标题写“人脸识别”的教程,实际上只教了目标检测:加载一个Haar级联分类器,把脸框出来,就收工了。这离“识别”还差着十万八千里。门禁系统为什么知道你刷脸能不能进门?因为它提前对员工建过档,把每个人的人脸特征存进了特征库。每次识别就是把当前人脸的特征和库里所有人逐一比对,看跟谁最像、像到什么程度。这一整套流程,才叫识别。
如果你只是做个人脸贴纸、人脸特效,那检测确实够用;但如果你想做“考勤打卡”、“会员识别”、“访客登记”,那就必须走完“检测 -> 特征提取 -> 特征比对”这条完整的链。
1.2 三条路线,对号入座
用OpenCV做人脸检测/识别,主流路线有三条:
第一条:Haar Cascade级联分类器。 这是2001年Viola-Jones提出的经典方案,基于Haar-like特征和AdaBoost级联。OpenCV自带训练好的XML文件,API很短,CPU上跑得非常快。缺点是光照变化大、侧脸、遮挡情况下漏检误检很严重。它适合拿来学习原理、验证流程,做正式产品我基本不推荐。
第二条:OpenCV DNN模块加载深度学习检测模型。 OpenCV从3.3版本开始有了完善的DNN推理模块,可以直接加载Caffe、TensorFlow、ONNX格式的模型。比较经典的是OpenCV官方提供的res10 SSD人脸检测模型,精度比Haar高一大截,CPU上也能做到准实时。如果你用的是4.x新版本,可以走这条路线,代码量也不大。
第三条:YuNet检测 + SFace识别。 这是OpenCV Zoo里官方维护的一套现代人脸方案。YuNet是轻量级人脸检测模型,输出人脸框、置信度、五个人脸关键点(双眼、鼻尖、左右嘴角);SFace是配套的识别模型,把对齐后的人脸转成512维的特征向量。两个模型都是ONNX格式,OpenCV 4.5.4以上版本直接支持,API封装得非常友好。
1.3 我为什么推荐新项目直接走YuNet+SFace
做一个新项目,我现在的默认选择就是YuNet+SF
