乐于分享
好东西不私藏

人脸识别系统技术分析文档

人脸识别系统技术分析文档

人脸识别系统技术分析文档

一、项目概述

本项目实现了两套基于 Python 的桌面人脸识别登录系统:

方案
文件
核心库
安装难度
方案A
face_recognition_app.py
OpenCV LBPH
简单,pip直装
方案B
kiro/face_recognition_system.py
face_recognition (dlib)
复杂,需编译C++

两套方案功能相同:人脸注册、人脸登录、人脸验证、数据表格记录、摄像头实时画面、异常处理。


二、两套方案核心区别

2.1 算法对比

维度
OpenCV LBPH
face_recognition
算法本质
传统图像处理(局部纹理统计)
深度学习(ResNet提取128维向量)
人脸特征
灰度人脸区域像素矩阵 (200×200)
128维浮点数向量
存储大小/人
~40KB
~1KB
匹配方式
LBPH模型predict,返回confidence
欧氏距离计算,越小越匹配
识别精度
~85%
99.38% (LFW基准)
光照敏感度
较敏感
不敏感
角度容忍度
低
高
安装依赖
opencv-contrib-python
dlib + face_recognition
安装体积
~50MB
~200MB

2.2 安装体积明细(face_recognition)

组件
大小
说明
dlib (源码包)
~3.3 MB
编译后约30-50MB
face_recognition 本体
~60 KB
纯Python封装层
face_recognition_models
~100 MB
核心模型文件(最大)

模型文件明细:

模型文件
大小
用途
shape_predictor_68_face_landmarks.dat
~96 MB
68点人脸关键点定位
dlib_face_recognition_resnet_model_v1.dat
~22.5 MB
128维人脸编码(ResNet)
mmod_human_face_detector.dat
~0.7 MB
CNN人脸检测器(可选)

2.3 模型文件安装位置

执行 pip install face_recognition 后,模型下载到 Python 环境的 site-packages 中:

<Python安装路径>/Lib/site-packages/face_recognition_models/models/

不同环境的具体路径:

环境类型
路径
系统Python
C:\Python3x\Lib\site-packages\face_recognition_models\models\
venv虚拟环境
.\venv\Lib\site-packages\face_recognition_models\models\
conda环境
C:\Users\用户名\anaconda3\envs\环境名\Lib\site-packages\face_recognition_models\models\

查看实际路径命令:

python -c "import face_recognition_models; print(face_recognition_models.models_path())"

三、本地人脸数据生成原理

两个方案都是 摄像头抓拍 → 提取特征 → 存入本地SQLite数据库,但提取的"特征"不同。

3.1 OpenCV LBPH 方案

# 抓拍一帧 → 灰度化 → 检测人脸区域 → 裁剪并缩放为200x200像素矩阵
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, ...)
face_roi = gray[y:y+h, x:x+w]
face_roi_resized = cv2.resize(face_roi, (200, 200))  # 这就是"人脸数据"

# 用 pickle 序列化为二进制存入 SQLite 的 BLOB 字段
face_blob = pickle.dumps(face_roi_resized)

存储本质:一张 200×200 的灰度图片的 numpy 数组。

3.2 face_recognition 方案

# 抓拍一帧 → RGB转换 → 深度学习模型提取128维编码
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
encoding = face_encodings[0]  # 128个浮点数

# 用 JSON 序列化存入 SQLite 的 TEXT 字段
encoding_json = json.dumps(encoding.tolist())

存储本质:128个浮点数,类似 [0.0123, -0.0456, 0.0789, ...]。


四、验证/登录工作原理

4.1 整体流程

注册(只需一次):
  输入用户名+账号 → 抓拍人脸 → 提取特征 → 存入数据库

登录/验证(每次使用):
  抓拍当前人脸 → 提取特征 → 从数据库取出所有已注册特征 → 逐一比对 → 找最匹配的

4.2 OpenCV LBPH 比对逻辑

for account, username, encoding in registered_faces:
# 对每个注册用户,创建LBPH识别器并训练
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    recognizer.train([encoding], np.array([0]))
    label, confidence = recognizer.predict(face_feature)
# confidence 越小越匹配,< 70 认为是同一人

特点:每次登录都要为每个用户重新训练识别器,用户多了会变慢。

4.3 face_recognition 比对逻辑

# 直接计算欧氏距离
distances = face_recognition.face_distance(known_encodings, unknown_encoding)
min_distance = min(distances)
# distance <= 0.45 认为是同一人

特点:纯数学运算,速度快,精度高。


五、常见问题

Q: 每次都要注册吗?

不需要。只需注册一次,人脸数据持久化存储在本地 SQLite 数据库文件中(face_recognition.db),程序关闭后数据不会丢失。下次打开程序直接点"人脸登录"即可识别。

Q: 可以注册多个用户吗?

可以。每个用户注册一次,系统支持多用户,登录时会逐一比对找到匹配的那个人。

Q: dlib 在 Windows 上安装失败怎么办?

常见错误:UnicodeDecodeError: 'gbk' codec can't decode byte...

解决方案优先级:

  1. 设置环境变量:$env:PYTHONUTF8="1" 然后 pip install dlib
  2. 下载预编译whl文件(需能访问GitHub)
  3. 放弃face_recognition,直接用OpenCV LBPH方案

Q: GitHub 连不上怎么下载 dlib whl?

尝试 GitHub 加速站:

https://ghfast.top/https://github.com/z-mahmud22/Dlib_Windows_Python3.x/raw/main/dlib-19.24.99-cp311-cp311-win_amd64.whl

或者直接使用 OpenCV 方案,零网络障碍。


六、快速运行指南

OpenCV LBPH 方案(推荐,零障碍)

pip install opencv-contrib-python numpy pillow
python face_recognition_app.py

face_recognition 方案(高精度)

# 需要先解决 dlib 安装
pip install dlib
pip install face_recognition opencv-python numpy pillow
python kiro/face_recognition_system.py

七、方案选择建议

场景
推荐方案
快速演示/学习
OpenCV LBPH
网络受限环境
OpenCV LBPH
追求识别精度
face_recognition
生产环境部署
face_recognition
用户数量多(>50人)
face_recognition
光照条件差
face_recognition

八、界面操作说明

程序界面分为四个区域:

  1. 功能操作区(左上):用户名/账号输入框 + 注册/登录/验证/关闭按钮
  2. 摄像头画面区(左中):实时显示摄像头画面,自动标注人脸绿色边框
  3. 抓拍确认按钮(左下):绿色大按钮,点击后执行当前模式的操作
  4. 数据表格区(右侧):已注册用户列表 + 登录记录 + 系统日志

操作流程:

注册:填写用户名+账号 → 点击"人脸注册" → 摄像头开启 → 点击绿色"抓拍确认" → 完成
登录:点击"人脸登录" → 摄像头开启 → 面对镜头 → 点击绿色"抓拍确认" → 显示结果
验证:点击"人脸验证" → 摄像头开启 → 面对镜头 → 点击绿色"抓拍确认" → 显示结果

相关学习资料