项目简介
本项目是一个基于 YOLO 人脸检测 + InsightFace(ArcFace) 人脸识别 + MySQL 数据库 + PyQt6 桌面端界面 的本地应急管理系统。系统面向工厂、工地、园区、医疗看护等场景,支持人员注册、实时识别、陌生人告警、识别记录查询、人员信息管理、告警中心、日志审计和系统参数配置。
系统识别流程如下:
![]()
摄像头 / 视频 / 图片
YOLO 人脸检测
InsightFace 人脸对齐
ArcFace 特征提取
MySQL 特征库余弦相似度比对
界面展示识别结果
识别日志 / 告警日志 / 审计日志入库
核心功能
-
登录注册:系统启动先进入登录/注册窗口,首次使用可注册管理员账号。
-
数据概览:作为登录后的默认首页,展示注册人员、今日识别、已识别、陌生人脸、未处理告警、近 7 天趋势、今日识别占比、来源分布和最近告警。
-
实时监控:支持摄像头、视频文件、图片文件识别。
-
人脸检测:使用 YOLO 权重定位人脸区域。
-
人脸识别:使用 InsightFace 的 ArcFace 模型提取人脸特征并进行身份比对。
-
人员注册:支持图片注册和摄像头当前帧注册,注册图片保存到本地相对路径。
-
人员信息:展示已注册人员信息,支持关键字筛选和删除。
-
记录查询:查询识别时间、姓名、编号、相似度、来源和摄像头。
-
告警中心:展示陌生人脸告警,支持未处理筛选和告警处理。
-
日志审计:记录登录、注册、人员删除、告警处理、系统设置保存和引擎重载等操作。
-
系统设置:维护 MySQL、YOLO 权重、InsightFace 目录、设备模式和识别阈值。
-
实时性能优化:摄像头显示帧和模型识别帧分离,画面保持较高频率刷新,识别频率由系统设置控制,默认 2 FPS。
-
GPU 优先:推理层优先使用 GPU,失败时自动退回 CPU。
-
中文路径兼容:图像读写和 PyTorch 权重加载兼容 Windows 中文路径。
技术栈
-
Python 3.9
-
PyQt6
-
Ultralytics YOLO
-
InsightFace
-
ArcFace
-
OpenCV
-
NumPy
-
PyMySQL
-
MySQL 8.x
-
PyTorch
-
ONNX Runtime
目录结构与文件作用
以下说明按当前项目结构整理,__pycache__、.pyc 等运行缓存文件不属于项目源码,已省略。
.
├── main.py
├── train_yolo.py
├── requirements.txt
├── README.md
├── yolov8n.pt
├── app/
│ ├── __init__.py
│ ├── core/
│ │ ├── __init__.py
│ │ ├── config.py
│ │ ├── face_engine.py
│ │ ├── io_utils.py
│ │ ├── local_config.py
│ │ ├── paths.py
│ │ └── types.py
│ ├── db/
│ │ ├── __init__.py
│ │ └── mysql_store.py
│ ├── services/
│ │ ├── __init__.py
│ │ ├── auth_service.py
│ │ └── recognition_service.py
│ └── ui/
│ ├── __init__.py
│ ├── auth_dialog.py
│ ├── dashboard_widgets.py
│ ├── main_window.py
│ ├── styles.py
│ └── workers.py
├── data/
│ ├── app_config.json
│ └── insightface/
│ └── models/
│ ├── buffalo_l.zip
│ └── buffalo_l/
│ ├── 1k3d68.onnx
│ ├── 2d106det.onnx
│ ├── det_10g.onnx
│ ├── genderage.onnx
│ └── w600k_r50.onnx
└── train_result/
├── 数据集说明.md
├── face_dataset.yaml
├── splits/
│ ├── train.txt
│ └── val.txt
└── yolo_face/
├── args.yaml
├── results.csv
├── results.png
├── labels.jpg
├── confusion_matrix.png
├── confusion_matrix_normalized.png
├── BoxF1_curve.png
├── BoxP_curve.png
├── BoxPR_curve.png
├── BoxR_curve.png
├── train_batch0.jpg
├── train_batch1.jpg
├── train_batch2.jpg
├── train_batch65250.jpg
├── train_batch65251.jpg
├── train_batch65252.jpg
├── val_batch0_labels.jpg
├── val_batch0_pred.jpg
├── val_batch1_labels.jpg
├── val_batch1_pred.jpg
├── val_batch2_labels.jpg
├── val_batch2_pred.jpg
├── metric_charts/
│ ├── map50_95_curve.png
│ ├── map50_curve.png
│ ├── precision_curve.png
│ ├── recall_curve.png
│ ├── train_box_loss_curve.png
│ ├── train_cls_loss_curve.png
│ ├── train_dfl_loss_curve.png
│ ├── val_box_loss_curve.png
│ ├── val_cls_loss_curve.png
│ └── val_dfl_loss_curve.png
└── weights/
├── best.pt
└── last.pt
根目录文件
| main.py | 桌面端系统启动入口,初始化运行目录、加载配置、连接 MySQL、加载识别服务,并先打开登录/注册窗口。 |
| train_yolo.py | YOLO 人脸检测模型训练脚本,负责校验数据集、划分训练/验证集、生成训练配置并启动训练。 |
| requirements.txt | 项目依赖库列表,不固定版本,便于在不同电脑上安装环境。 |
| README.md | 项目说明文档。 |
| yolov8n.pt | YOLO 预训练权重,可作为训练人脸检测模型的初始权重。 |
app/ 应用源码
| app/__init__.py | Python 包标记文件。 |
app/core/ 核心算法与配置层
| app/core/__init__.py | 核心模块包标记文件。 |
| app/core/config.py | 应用配置模型,负责读取和保存 data/app_config.json,并合并本地数据库配置。 |
| app/core/face_engine.py | 人脸算法引擎,封装 YOLO 检测、InsightFace 模型加载、ArcFace 特征提取、中文标注绘制、GPU/CPU 兜底逻辑。 |
| app/core/io_utils.py | Unicode 安全读写工具,负责中文路径下的 OpenCV 图像读写和 torch.save / torch.load 补丁。 |
| app/core/local_config.py | 本地 MySQL 覆盖配置文件,可直接在此设置数据库主机、端口、账号、密码和数据库名。 |
| app/core/paths.py | 项目路径管理,定义项目根目录、配置文件路径、默认权重路径、注册图片目录、抓拍目录、临时目录等。 |
| app/core/types.py | 业务数据类型定义,包括人员记录、系统用户、检测框、识别事件、识别日志、告警日志和审计日志。 |
app/db/ 数据库层
| app/db/__init__.py | 数据库模块包标记文件。 |
| app/db/mysql_store.py | MySQL 数据访问层,负责自动建库建表、人员信息、特征向量、识别日志、告警日志、审计日志和系统用户的增删查改。 |
app/services/ 业务服务层
| app/services/__init__.py | 服务模块包标记文件。 |
| app/services/auth_service.py | 系统用户认证服务,负责管理员注册、登录、密码哈希校验和登录审计写入。 |
| app/services/recognition_service.py | 人脸识别业务服务,负责人员注册、特征缓存、实时识别、相似度匹配、抓拍保存、识别日志写入和陌生人告警生成。 |
app/ui/ 界面层
| app/ui/__init__.py | UI 模块包标记文件。 |
| app/ui/auth_dialog.py | 登录/注册对话框,系统启动后先进入该窗口。 |
| app/ui/dashboard_widgets.py | 数据概览页 PyQt6 自绘图表组件,包括指标卡、近 7 天趋势图、环形占比图和横向柱状图。 |
| app/ui/main_window.py | 主界面文件,包含实时监控、人员注册、人员信息、记录查询、系统设置、告警中心、日志审计等页面。 |
| app/ui/styles.py | PyQt6 全局浅色主题 QSS,统一窗口、导航、按钮、表格、输入框、下拉框等组件样式。 |
| app/ui/workers.py | 视频采集后台线程,负责摄像头、视频、图片读取,并调用识别服务处理帧数据。 |
data/ 运行数据目录
| data/app_config.json | 系统本地配置文件,保存 MySQL 参数、模型路径、InsightFace 路径、设备模式、检测阈值、匹配阈值等。 |
| data/insightface/ | InsightFace 模型缓存目录。 |
| data/insightface/models/buffalo_l.zip | InsightFace buffalo_l 模型压缩包。 |
| data/insightface/models/buffalo_l/det_10g.onnx | InsightFace 人脸检测模型,用于关键点/对齐前的人脸定位能力。 |
| data/insightface/models/buffalo_l/w600k_r50.onnx | ArcFace 人脸识别模型,用于提取 512 维人脸特征向量。 |
| data/insightface/models/buffalo_l/2d106det.onnx | 2D 人脸关键点模型。 |
| data/insightface/models/buffalo_l/1k3d68.onnx | 3D/68 点人脸关键点模型。 |
| data/insightface/models/buffalo_l/genderage.onnx | 性别年龄模型,当前项目不作为核心识别依据。 |
| data/register/ | 运行时自动生成,保存人员注册图片。 |
| data/snapshots/ | 运行时自动生成,保存识别抓拍图片。 |
| data/temp/ | 运行时自动生成,保存摄像头注册当前帧等临时图片。 |
| data/exports/ | 运行时自动生成,预留导出文件目录。 |
train_result/ 训练产物目录
| train_result/数据集说明.md | 训练数据集来源、格式、统计信息和使用说明。 |
| train_result/face_dataset.yaml | YOLO 训练数据配置文件,记录训练集、验证集、类别数和类别名。 |
| train_result/splits/train.txt | 训练集图片路径列表。 |
| train_result/splits/val.txt | 验证集图片路径列表。 |
| train_result/yolo_face/args.yaml | 本次 YOLO 训练参数记录。 |
| train_result/yolo_face/results.csv | 训练过程指标数据。 |
| train_result/yolo_face/results.png | YOLO 自动生成的训练指标总览图。 |
| train_result/yolo_face/labels.jpg | 数据集标签分布可视化图。 |
| train_result/yolo_face/confusion_matrix.png | 混淆矩阵图。 |
| train_result/yolo_face/confusion_matrix_normalized.png | 归一化混淆矩阵图。 |
| train_result/yolo_face/BoxF1_curve.png | F1 曲线图。 |
| train_result/yolo_face/BoxP_curve.png | Precision 曲线图。 |
| train_result/yolo_face/BoxPR_curve.png | Precision-Recall 曲线图。 |
| train_result/yolo_face/BoxR_curve.png | Recall 曲线图。 |
| train_result/yolo_face/train_batch*.jpg | 训练批次样本可视化图,用于查看训练数据和标注效果。 |
| train_result/yolo_face/val_batch*_labels.jpg | 验证集真实标签可视化图。 |
| train_result/yolo_face/val_batch*_pred.jpg | 验证集预测结果可视化图。 |
| train_result/yolo_face/metric_charts/*.png | 项目额外生成的训练指标曲线图,包含 mAP、Precision、Recall、训练损失和验证损失。 |
| train_result/yolo_face/weights/best.pt | 当前系统默认加载的人脸检测 YOLO 最优权重。 |
| train_result/yolo_face/weights/last.pt | YOLO 最后一轮训练权重,可用于断点续训或对比。 |
| train_result/prepared_dataset/ | 训练脚本自动生成的中间数据目录,包含整理后的图片、标签和缓存文件。 |
运行环境
-
Windows 10 / Windows 11
-
Python 3.9
-
MySQL 8.x
-
已训练好的人脸检测 YOLO 权重
依赖安装
项目依赖已写入 requirements.txt:
numpy
opencv-python
PyQt6
pymysql
torch
ultralytics
insightface
onnxruntime
Pillow
如目标电脑需要 InsightFace 也走 GPU,可根据显卡和 CUDA 环境自行替换为合适的 onnxruntime-gpu。如果 GPU 或 GPU 推理库不可用,系统会自动使用 CPU 兜底。
MySQL 配置
系统支持两种数据库配置方式。
方式一:修改本地配置文件
可直接修改:
app/core/local_config.py
示例:
MYSQL_HOST = "127.0.0.1"
MYSQL_PORT = 3306
MYSQL_USER = "root"
MYSQL_PASSWORD = "root"
MYSQL_DATABASE = "face_emergency_management"
local_config.py 的优先级高于 data/app_config.json,适合部署到别人电脑时直接设置数据库密码。
方式二:在系统设置界面修改
启动后进入“系统设置”页面,可修改:
-
MySQL 主机
-
MySQL 端口
-
MySQL 用户名
-
MySQL 密码
-
数据库名
-
YOLO 权重路径
-
InsightFace 模型目录
-
GPU/CPU 设备模式
-
检测阈值和识别阈值
数据库表说明
程序连接 MySQL 后会自动创建数据库和表结构。
| system_config | 保存系统参数配置。 |
| system_users | 保存系统登录用户、密码哈希、角色和登录时间。 |
| persons | 保存注册人员基础信息。 |
| face_features | 保存人员人脸特征向量,特征使用 LONGBLOB 存储。 |
| recognition_logs | 保存每次识别记录。 |
| alarm_logs | 保存陌生人脸等告警记录。 |
| audit_logs | 保存登录、注册、删除、设置修改、告警处理等操作审计。 |
图片文件不直接存入数据库,数据库中保存项目相对路径,便于项目移动和迁移。
默认模型路径
YOLO 人脸检测权重默认路径:
train_result/yolo_face/weights/best.pt
InsightFace 默认模型目录:
data/insightface
系统中人脸检测使用 YOLO,身份识别使用 InsightFace 的 ArcFace 特征模型 w600k_r50.onnx。
启动方式
python main.py
启动流程:
创建 data/ 运行目录。
修补 Windows 中文路径下的 PyTorch 模型读写。
读取本地配置。
连接 MySQL 并自动建库建表。
加载 YOLO 和 InsightFace 模型。
打开登录/注册窗口。
登录成功后提示登录成功并进入主界面。
使用流程
1. 登录注册
首次启动时,如果数据库中没有系统用户,会默认进入注册管理员页面。注册成功后自动登录。后续启动需要输入账号密码进入主界面。
2. 数据概览
登录后默认进入“数据概览”页面,页面展示:
-
注册人员、今日识别、已识别人数、陌生人脸和未处理告警。
-
近 7 天识别趋势,包含总识别、陌生人和告警数量。
-
今日识别占比,展示已识别与陌生人脸比例。
-
今日识别来源分布,例如摄像头、视频和图片。
-
最近告警列表。
数据概览基于 MySQL 中已有的 persons、recognition_logs、alarm_logs 和 audit_logs 聚合统计,不新增业务表。页面提供刷新按钮,并会按固定间隔自动刷新。
3. 人员注册
进入“人员注册”页面:
填写人员编号、姓名、部门、电话和备注。
可添加本地图片,也可启动摄像头后使用当前帧。
点击注册后,系统会检测人脸、提取 ArcFace 特征、写入 MySQL。
注册图片保存到 data/register/。
4. 实时监控
进入“实时监控”页面,可选择:
-
摄像头
-
视频文件
-
图片文件
系统会在画面上绘制检测框和识别结果。已知人员显示姓名和相似度,未匹配人员显示为陌生人脸并写入告警。
实时监控采用显示帧和识别帧分离机制:
-
摄像头画面以较高频率刷新显示,提升预览流畅度。
-
YOLO + ArcFace 完整识别按 video_fps_limit 控制,默认 2 FPS。
-
两次识别之间复用最近一次识别框和标签。
-
复用帧只刷新画面和统计,不重复写数据库、不重复追加事件表、不重复触发告警。
5. 人员信息
进入“人员信息”页面,可查看已注册人员,并按人员编号、姓名、部门筛选。删除人员时会同步删除对应特征,并写入审计日志。
6. 记录查询
进入“记录查询”页面,可按关键字查询识别日志,也可只查看陌生人记录。页面展示时间、姓名、编号、相似度、阈值、类型、来源和摄像头。
7. 告警中心
进入“告警中心”页面,可查看陌生人脸告警,支持:
-
关键字搜索
-
仅未处理筛选
-
处理选中告警
告警处理会更新 alarm_logs 状态,并写入 audit_logs。
8. 日志审计
进入“日志审计”页面,可查看系统关键操作,包括:
-
用户登录
-
管理员注册
-
人员注册
-
人员删除
-
告警处理
-
系统设置保存
-
识别引擎重载
9. 系统设置
进入“系统设置”页面,可维护数据库、模型和推理参数。保存后配置会同步到 data/app_config.json 和 system_config 表。
识别原理
YOLO 对输入图像进行人脸检测,输出人脸框。
InsightFace 根据人脸区域完成对齐和预处理。
ArcFace 模型提取 512 维人脸特征向量。
系统对特征向量进行 L2 归一化。
待识别人脸特征与 MySQL 中注册特征做余弦相似度计算。
相似度高于 match_threshold 时判定为已注册人员,否则判定为陌生人脸。
识别结果、抓拍路径、告警记录和操作审计写入 MySQL。
配置字段说明
data/app_config.json 常用字段:
| mysql.host | MySQL 主机地址。 |
| mysql.port | MySQL 端口。 |
| mysql.user | MySQL 用户名。 |
| mysql.password | MySQL 密码。 |
| mysql.database | MySQL 数据库名。 |
| model_path | YOLO 人脸检测权重路径。 |
| insightface_root | InsightFace 模型根目录。 |
| device_mode | 推理设备模式,可选 auto、gpu、cpu。 |
| img_size | YOLO 推理输入尺寸。 |
| det_conf | YOLO 检测置信度阈值。 |
| det_iou | YOLO NMS IOU 阈值。 |
| match_threshold | 人脸识别相似度阈值。 |
| cooldown_seconds | 重复识别/重复告警冷却时间。 |
| camera_index | 默认摄像头编号。 |
| video_fps_limit | 视频/摄像头模型识别帧率上限,默认 2 FPS;显示帧和识别帧已分离。 |



















