基于 YOLO + MobileFaceNet 的人脸识别会议签到系统

本项目是一个前后端分离的会议签到系统,毕业设计题目为"基于人脸识别的会议签到系统"。系统采用 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/imagesdatasets/labels

  • 自动生成训练集/验证集划分

  • 训练产物统一保存到 train_result

  • 开启 YOLO 原生 plots=True

  • 生成 results.png、混淆矩阵、PR 曲线、P/R/F1 曲线等 YOLO 原生图

  • 自动处理少量异常标签框,源数据不被修改

  • 对 PyTorch 模型读写做了中文路径兼容处理

中文路径兼容说明

项目路径中包含中文字符。Windows 环境下,PyTorch 底层 C++ 文件写入器在部分场景中会对中文路径支持不稳定。因此项目中涉及 PyTorch 模型加载的位置,使用了 io.BytesIO + open() 的方式读取模型,避免直接把中文路径字符串传给 torch.load

模型、数据集和上传文件路径尽量使用相对路径。项目移动到其他目录后,只要目录结构不变,系统仍可正常识别数据集、训练结果和模型文件。

使用流程

管理员流程

  1. 启动 MySQL、后端和前端。

  2. 使用默认管理员账号登录后台。

  3. 在"人员管理"中新增参会人员。

  4. 在"会议管理"中创建会议并选择参会人员。

  5. 在"模型配置"中确认 YOLO 和 MobileFaceNet 模型路径。

  6. 在"签到记录"和"补签审核"中查看和处理签到数据。

用户流程

  1. 用户注册或由管理员创建账号。

  2. 登录用户前台。

  3. 在"人脸注册"中采集本人脸部信息。

  4. 在"我的会议"中选择会议并进行在线签到。

  5. 在"签到记录"中查看结果。

  6. 若识别失败或漏签,可在"补签申诉"中提交说明。

注意事项

  1. mobilefacenet.onnx 已放在项目根目录,系统默认会优先使用它。

  2. YOLO 训练完成后的默认模型路径为 train_result/yolo_face/weights/best.pt

  3. 如果训练输出目录名称发生变化,可在后台"模型配置"中修改 YOLO 模型路径。

  4. 如果 ONNXRuntime 没有 GPU Provider,会自动使用 CPU 推理。

  5. 如果 MobileFaceNet 模型不存在,系统会使用兜底特征提取逻辑,只适合临时跑通流程,不适合作为最终识别效果。

  6. 真实部署时建议修改默认管理员密码和 SECRET_KEY

  7. 前端摄像头功能需要浏览器允许摄像头权限。

主要文件说明

文件 说明
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 管理后台实现自动签到,减少人工点名和纸质签到工作量。