本项目是一个前后端分离的会议签到系统,毕业设计题目为"基于人脸识别的会议签到系统"。系统采用 FastAPI + Vue 3 + MySQL 架构,算法部分采用"两阶段人脸识别方案":先使用基于 WIDER FACE 数据集训练得到的 YOLO 模型完成人脸检测,再使用 MobileFaceNet 提取人脸特征并进行身份匹配。
系统包含用户前台和管理员后台。用户前台用于参会人员登录、查看会议、人脸注册、在线签到和补签申诉;管理员后台用于人员管理、会议管理、签到记录管理、补签审核、公告发布、模型配置和数据统计。
技术栈
| 模块 | 技术 |
|---|---|
| 后端框架 | FastAPI |
| 数据库 | MySQL |
| ORM | SQLAlchemy |
| 前端框架 | Vue 3 |
| UI 组件 | Element Plus |
| HTTP 请求 | Axios |
| 人脸检测 | YOLO / Ultralytics |
| 人脸识别 | MobileFaceNet ONNX |
| 模型推理 | PyTorch、ONNXRuntime |
| 图像处理 | OpenCV、NumPy |
系统架构
用户前台 Vue ─┐
├── FastAPI 后端 ── MySQL
管理员后台 Vue ┘ │
├── YOLO 人脸检测
└── MobileFaceNet 人脸特征提取
整体识别流程如下:
摄像头采集图像
↓
FastAPI 接收图片
↓
YOLO 检测人脸位置
↓
裁剪人脸区域
↓
MobileFaceNet 提取特征向量
↓
与数据库中的注册特征计算余弦相似度
↓
生成签到结果
项目目录
.
├── backend/ # FastAPI 后端
│ ├── app/
│ │ ├── api/ # 接口路由
│ │ ├── core/ # 配置、数据库、安全工具
│ │ ├── models/ # SQLAlchemy 数据模型
│ │ ├── services/ # 人脸检测、识别、图像处理等服务
│ │ ├── main.py # 后端入口
│ │ └── schemas.py # 请求与响应结构
│ └── requirements.txt # 后端依赖
├── frontend/ # Vue 前端
│ ├── src/
│ │ ├── api/ # Axios 请求封装
│ │ ├── components/ # 摄像头等通用组件
│ │ ├── layouts/ # 用户前台、管理员后台布局
│ │ ├── stores/ # 登录状态
│ │ └── views/ # 前后台页面
│ ├── package.json
│ └── vite.config.js
├── datasets/ # YOLO 人脸检测数据集
│ ├── images/
│ └── labels/
├── train_result/ # YOLO 训练产物
│ └── yolo_face/
├── uploads/ # 人脸注册、签到图片保存目录
├── mobilefacenet.onnx # MobileFaceNet 人脸识别模型
├── train_yolo.py # YOLO 人脸检测训练脚本
├── yolov8n.pt # YOLO 预训练权重
├── yolo26n.pt # 备用 YOLO 权重
└── 数据集说明.md # 数据集说明
核心功能
用户前台
| 功能 | 说明 |
|---|---|
| 用户注册/登录 | 用户可以注册账号并登录前台 |
| 首页 | 查看个人会议数量、已签到数量、待签到数量和通知公告 |
| 我的会议 | 查看当前用户需要参加的会议 |
| 人脸注册 | 通过摄像头采集人脸,生成并保存 MobileFaceNet 特征 |
| 在线签到 | 上传摄像头图片,完成 YOLO 检测和 MobileFaceNet 身份匹配 |
| 签到记录 | 查看个人历史签到记录 |
| 补签申诉 | 对识别失败、漏签等情况提交申诉 |
管理员后台
| 功能 | 说明 |
|---|---|
| 数据总览 | 查看人员总数、会议总数、今日签到、待审补签等 |
| 人员管理 | 新增、编辑、删除人员,管理员可为人员采集人脸 |
| 会议管理 | 创建会议、设置会议时间地点、选择参会人员 |
| 签到记录 | 按会议、人员、部门查询签到记录 |
| 补签审核 | 审核用户提交的补签申诉,通过后自动生成补签记录 |
| 模型配置 | 配置 YOLO 模型路径、MobileFaceNet 模型路径、识别阈值和推理设备 |
| 通知公告 | 发布、编辑、删除前台公告 |
算法说明
YOLO 人脸检测
YOLO 模型用于检测图像中的人脸位置。训练数据来源于 Kaggle 的 WIDER FACE for YOLO Training 数据集,项目本地数据结构为:
datasets/
├── images/
└── labels/
当前数据集为单类别检测任务,类别为:
0: face
训练脚本为:
train_yolo.py
训练产物统一保存到:
train_result/
本次训练结果目录为:
train_result/yolo_face/
YOLO 原生训练结果包括:
train_result/yolo_face/results.png
train_result/yolo_face/results.csv
train_result/yolo_face/confusion_matrix.png
train_result/yolo_face/BoxPR_curve.png
train_result/yolo_face/BoxP_curve.png
train_result/yolo_face/BoxR_curve.png
train_result/yolo_face/BoxF1_curve.png
train_result/yolo_face/weights/best.pt
train_result/yolo_face/weights/last.pt
额外生成的单指标浅色可视化图位于:
train_result/yolo_face/metric_charts/
包含:
precision_curve.png
recall_curve.png
map50_curve.png
map50_95_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
当前系统默认使用的 YOLO 检测模型路径为:
train_result/yolo_face/weights/best.pt
MobileFaceNet 人脸识别
MobileFaceNet 用于提取人脸特征向量。当前项目使用 ONNX 模型:
mobilefacenet.onnx
系统会将 YOLO 检测到的人脸区域裁剪出来,送入 MobileFaceNet,得到人脸特征向量。注册阶段保存该特征,签到阶段提取当前图像特征,并与数据库中已注册的人员特征计算余弦相似度。
默认相似度阈值为:
0.60
后台"模型配置"页面可以修改阈值和模型路径。
数据库说明
默认数据库连接配置在:
backend/app/core/config.py
默认连接地址:
mysql+pymysql://root:123456@127.0.0.1:3306/face_meeting_system?charset=utf8mb4
也可以通过环境变量覆盖:
$env:DATABASE_URL="mysql+pymysql://root:你的密码@127.0.0.1:3306/face_meeting_system?charset=utf8mb4"
后端启动时会自动创建数据库表。默认管理员账号会自动初始化:
账号:admin
密码:123456
主要数据表:
| 表名 | 作用 |
|---|---|
admin_user |
管理员账号 |
user |
前台用户/参会人员 |
face_feature |
人脸特征向量 |
meeting |
会议信息 |
meeting_member |
会议参会人员关系 |
attendance_record |
签到记录 |
attendance_appeal |
补签申诉 |
announcement |
通知公告 |
model_config |
模型路径和阈值配置 |
operation_log |
操作日志 |
后端运行
在项目根目录下运行:
cd backend
pip install -r requirements.txt
cd ..
$env:PYTHONPATH="backend"
uvicorn app.main:app --host 0.0.0.0 --port 8000
后端启动后访问:
http://127.0.0.1:8000
接口文档:
http://127.0.0.1:8000/docs
前端运行
进入前端目录:
cd frontend
npm install
npm run dev
前端默认地址:
http://127.0.0.1:5173
前端已经配置接口代理:
/api -> http://127.0.0.1:8000
/uploads -> http://127.0.0.1:8000
常用环境变量
| 变量 | 默认值 | 说明 |
|---|---|---|
DATABASE_URL |
mysql+pymysql://root:123456@127.0.0.1:3306/face_meeting_system?charset=utf8mb4 |
MySQL 连接地址 |
SECRET_KEY |
Jay8059_face_meeting_2026 |
登录令牌签名密钥 |
TOKEN_EXPIRE_HOURS |
24 |
登录有效时间 |
YOLO_MODEL_PATH |
train_result/yolo_face/weights/best.pt |
YOLO 检测模型路径 |
MOBILEFACENET_MODEL_PATH |
mobilefacenet.onnx |
MobileFaceNet 模型路径 |
FACE_MATCH_THRESHOLD |
0.60 |
人脸匹配阈值 |
YOLO_CONFIDENCE |
0.35 |
YOLO 检测置信度 |
YOLO_IMGSZ |
640 |
YOLO 推理图像尺寸 |
MODEL_DEVICE |
0 |
推理设备,CPU 可设为 cpu |
AUTO_CREATE_TABLES |
true |
是否启动时自动建表 |
接口模块
后端接口统一以 /api 开头:
| 接口模块 | 说明 |
|---|---|
/api/auth |
登录、当前用户、修改密码 |
/api/persons |
人员管理、人脸注册、用户注册 |
/api/meetings |
会议管理、我的会议 |
/api/attendance |
人脸签到、签到记录、补签申诉 |
/api/admin |
后台统计、操作日志 |
/api/announcements |
通知公告 |
/api/model |
模型配置 |
训练 YOLO 模型
训练脚本:
train_yolo.py
常用训练命令:
python train_yolo.py --model yolov8n.pt --epochs 100 --batch 16 --device 0
脚本特点:
-
自动检查
datasets/images和datasets/labels -
自动生成训练集/验证集划分
-
训练产物统一保存到
train_result -
开启 YOLO 原生
plots=True -
生成
results.png、混淆矩阵、PR 曲线、P/R/F1 曲线等 YOLO 原生图 -
自动处理少量异常标签框,源数据不被修改
-
对 PyTorch 模型读写做了中文路径兼容处理
中文路径兼容说明
项目路径中包含中文字符。Windows 环境下,PyTorch 底层 C++ 文件写入器在部分场景中会对中文路径支持不稳定。因此项目中涉及 PyTorch 模型加载的位置,使用了 io.BytesIO + open() 的方式读取模型,避免直接把中文路径字符串传给 torch.load。
模型、数据集和上传文件路径尽量使用相对路径。项目移动到其他目录后,只要目录结构不变,系统仍可正常识别数据集、训练结果和模型文件。
使用流程
管理员流程
-
启动 MySQL、后端和前端。
-
使用默认管理员账号登录后台。
-
在"人员管理"中新增参会人员。
-
在"会议管理"中创建会议并选择参会人员。
-
在"模型配置"中确认 YOLO 和 MobileFaceNet 模型路径。
-
在"签到记录"和"补签审核"中查看和处理签到数据。
用户流程
-
用户注册或由管理员创建账号。
-
登录用户前台。
-
在"人脸注册"中采集本人脸部信息。
-
在"我的会议"中选择会议并进行在线签到。
-
在"签到记录"中查看结果。
-
若识别失败或漏签,可在"补签申诉"中提交说明。
注意事项
-
mobilefacenet.onnx已放在项目根目录,系统默认会优先使用它。 -
YOLO 训练完成后的默认模型路径为
train_result/yolo_face/weights/best.pt。 -
如果训练输出目录名称发生变化,可在后台"模型配置"中修改 YOLO 模型路径。
-
如果 ONNXRuntime 没有 GPU Provider,会自动使用 CPU 推理。
-
如果 MobileFaceNet 模型不存在,系统会使用兜底特征提取逻辑,只适合临时跑通流程,不适合作为最终识别效果。
-
真实部署时建议修改默认管理员密码和
SECRET_KEY。 -
前端摄像头功能需要浏览器允许摄像头权限。
主要文件说明
| 文件 | 说明 |
|---|---|
train_yolo.py |
YOLO 人脸检测模型训练入口 |
backend/app/main.py |
FastAPI 后端入口 |
backend/app/core/config.py |
系统配置 |
backend/app/models/entities.py |
数据库表模型 |
backend/app/services/yolo_detector.py |
YOLO 人脸检测服务 |
backend/app/services/mobilefacenet_service.py |
MobileFaceNet 特征提取服务 |
backend/app/services/face_matcher.py |
人脸特征相似度计算 |
frontend/src/App.vue |
前端主入口 |
frontend/src/layouts/UserShell.vue |
用户前台布局 |
frontend/src/layouts/AdminShell.vue |
管理员后台布局 |
frontend/src/components/CameraCapture.vue |
摄像头采集组件 |
适用场景
本系统适用于会议、课堂、培训、企业内部活动等需要参会人员身份确认和签到统计的场景。系统通过人脸检测、人脸识别和 Web 管理后台实现自动签到,减少人工点名和纸质签到工作量。











