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



一、项目概述
本项目实现了两套基于 Python 的桌面人脸识别登录系统:
face_recognition_app.py | |||
kiro/face_recognition_system.py |
两套方案功能相同:人脸注册、人脸登录、人脸验证、数据表格记录、摄像头实时画面、异常处理。
二、两套方案核心区别
2.1 算法对比
2.2 安装体积明细(face_recognition)
模型文件明细:
2.3 模型文件安装位置
执行 pip install face_recognition 后,模型下载到 Python 环境的 site-packages 中:
<Python安装路径>/Lib/site-packages/face_recognition_models/models/
不同环境的具体路径:
C:\Python3x\Lib\site-packages\face_recognition_models\models\ | |
.\venv\Lib\site-packages\face_recognition_models\models\ | |
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...
解决方案优先级:
设置环境变量: $env:PYTHONUTF8="1"然后pip install dlib下载预编译whl文件(需能访问GitHub) 放弃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
七、方案选择建议
八、界面操作说明
程序界面分为四个区域:
功能操作区(左上):用户名/账号输入框 + 注册/登录/验证/关闭按钮 摄像头画面区(左中):实时显示摄像头画面,自动标注人脸绿色边框 抓拍确认按钮(左下):绿色大按钮,点击后执行当前模式的操作 数据表格区(右侧):已注册用户列表 + 登录记录 + 系统日志
操作流程:
注册:填写用户名+账号 → 点击"人脸注册" → 摄像头开启 → 点击绿色"抓拍确认" → 完成
登录:点击"人脸登录" → 摄像头开启 → 面对镜头 → 点击绿色"抓拍确认" → 显示结果
验证:点击"人脸验证" → 摄像头开启 → 面对镜头 → 点击绿色"抓拍确认" → 显示结果
夜雨聆风