项目简介
本项目是一个基于 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;显示帧和识别帧已分离。 |














