一、项目简介
本项目是一个前后端分离的会议签到系统,毕业设计题目为“基于人脸识别的会议签到系统”。系统采用 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
十、接口模块
后端接口统一以 /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 模型读写做了中文路径兼容处理
十二、使用流程
管理员流程
- 启动 MySQL、后端和前端。
- 使用默认管理员账号登录后台。
- 在“人员管理”中新增参会人员。
- 在“会议管理”中创建会议并选择参会人员。
- 在“模型配置”中确认 YOLO 和 MobileFaceNet 模型路径。
- 在“签到记录”和“补签审核”中查看和处理签到数据。
用户流程
- 用户注册或由管理员创建账号。
- 登录用户前台。
- 在“人脸注册”中采集本人脸部信息。
- 在“我的会议”中选择会议并进行在线签到。
- 在“签到记录”中查看结果。
- 若识别失败或漏签,可在“补签申诉”中提交说明。
十三、主要文件说明
| 文件 | 说明 |
|---|---|
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 | 摄像头采集组件 |
本项目为个人原创,结构清晰,功能完整,适合课程设计、毕业设计和个人学习使用。如需购买项目成品或定制化需求可以联系作者。