Py学习  »  机器学习算法

锋哥的人脸识别 智能考勤系统(深度学习+OpenCV DNN+FastAPI+Vue3) 视频教程 项目实战课程 正式发布了。。。

java1234 • 2 周前 • 203 次点击  
大家好,我是锋哥。
就在刚刚,锋哥的人脸识别 智能考勤系统(深度学习+OpenCV DNN+FastAPI+Vue3) 视频教程发布了。质量杠杠的!
B站地址:

https://www.bilibili.com/video/BV17Hut6NE98/

图片
本课程主要结合AI编程 Cursor 实现一个 人脸识别 智能考勤系统。讲解内容包括需求分析,YuNet人脸识别库介绍,SFace人脸识别特征提取库介绍,新建后端Python项目,新建Vue前端项目,利用Cursor AI编程实现Plan沟通项目方案,Agent生成项目,Agent修复bug和完善功能。利用AI编程开发项目的完整过程是免费的。一共是8讲,是免费的。
图片

高清视频+源码+领取

扫描下方公众号【python222】回复888

可获取下载链接

👇👇👇

图片


👆长按上方二维码 2 秒
回复「888」即可获取


项目效果预览

图片
图片
图片
图片

Cursor AI 生成的这个项目 架构和代码质量非常高。锋哥花了2天时间,录制了这个项目的架构以及所有功能模块的实现讲解。一共16讲。这个是属于VIP会员享受的。

图片

欢迎加入锋哥的VIP,目前活动,购买Python+AI大模型  VIP,送Java+AI大模型+AI编程 VIP。

2026年,锋哥又开始收Python+AI大模型学员了!目前活动,送AI编程+Java编程 VIP

一、项目概述

SmartFace Attendance(智能人脸考勤系统) 是一套面向企业日常考勤管理的 Web 应用。系统通过摄像头采集人脸图像,利用深度学习模型完成人脸检测与特征比对,实现员工无接触式签到/签退;管理员可在后台完成组织架构维护、人脸库管理、考勤记录查询、请假/加班审批及数据统计分析。

1.1 核心功能模块

模块说明
刷脸打卡公开页面,无需登录,摄像头采集人脸后自动识别并签到/签退
首页看板展示在职人数、今日出勤、迟到数、识别成功率及 ECharts 统计图表
员工管理员工档案 CRUD,关联部门、岗位、班次
人脸库录入/删除员工人脸,提取 128 维特征向量存入数据库
组织架构部门、岗位、班次(上下班时间、迟到/早退容忍分钟)管理
考勤记录按日期、员工查询签到/签退记录及考勤状态
请假/加班 申请录入与审批(待审批 → 已通过/已拒绝)
识别日志记录每次刷脸识别的相似度、成功与否、IP 地址
个人中心管理员头像上传、资料修改、密码修改

二、业务逻辑

2.1 系统角色

  • 管理员:登录后台,管理员工、人脸库、组织架构、考勤及审批流程,查看统计数据。

  • 员工(被动识别):无需登录系统,在打卡终端通过刷脸完成签到/签退。

2.2 人脸注册流程

  1. 管理员在「员工管理」中创建员工档案(工号、姓名、部门、岗位、班次等)。

  2. 在「人脸库」页面选择员工,上传/拍摄正面清晰照片。

  3. 后端使用 YuNet 检测最大人脸, SFace 提取 128 维特征向量。

  4. 特征向量以 JSON 格式存入 t_face 表,图片保存至 D:/uploads30/faces/

  5. 应用启动时及每次注册/删除后,将全部特征加载至内存底库,供 1:N 比对。

2.3 刷脸打卡流程

  1. 员工打开 /punch 公开打卡页,前端调用摄像头采集 Base64 图片。

  2. 调用 POST /api/v1/punch(免 JWT 认证)。

  3. FaceService 保存抓拍图 → 提取特征 → 与内存底库批量余弦相似度比对。

  4. 最高相似度 ≥ 阈值(默认 0.363)则匹配成功,否则返回识别失败。

  5. 写入 t_recognition_log 识别日志。

  6. AttendanceService 根据当日是否已有记录决定签到或签退:

  • 首次打卡:创建考勤记录,写入签到时间与抓拍图,按班次判定「正常/迟到」。

  • 二次打卡 :写入签退时间与抓拍图,计算工时,判定「正常/早退/迟到且早退」。

  • 已完成签退:拒绝重复打卡。

2.4 考勤状态判定规则

场景判定逻辑
签到打卡时间 ≤ 班次上班时间 + 迟到容忍分钟 → 正常;否则迟到
签退打卡时间 < 班次下班时间 - 早退容忍分钟 → 早退;结合签到状态可产生「迟到且早退」
无班次默认状态为「正常」

2.5 请假/加班审批

  • 管理员录入请假/加班申请,初始状态为「待审批」。

  • 审批通过后记录审批人 ID 与审批时间,状态变为「已通过」。

2.6 业务流程图

人脸注册流程

图片

刷脸打卡流程

图片

管理员登录与鉴权流程

图片

三、技术栈

3.1 前端(client)

类别 技术版本用途
框架Vue 3^3.5组件化 UI
构建Vite^8.2开发服务器与打包
UI 库Element Plus^2.9表格、表单、布局组件
路由Vue Router^4.5SPA 路由与登录守卫
状态 Pinia^2.3管理员登录态
HTTPAxios^1.7REST API 请求
图表ECharts^5.5首页看板统计图表
日期dayjs^1.11日期格式化

3.2 后端(server)

类别 技术用途
Web 框架FastAPIREST API、自动文档、依赖注入
ASGI 服务器Uvicorn应用运行
ORMSQLAlchemy 2.x数据库模型与查询
数据库驱动PyMySQL连接 MySQL
配置Pydantic Settings读取 .env 环境变量
认证PyJWT + bcryptJWT 令牌与密码哈希
图像处理OpenCV (opencv-python)人脸检测与识别
数值计算NumPy特征向量运算
图像读写Pillow辅助图像处理

3.3 AI 模型

模型文件功能
YuNetface_detection_yunet_2023mar.onnx人脸检测,选取最大人脸
SFaceface_recognition_sface_2021dec.onnx人脸对齐与 128 维特征提取

3.4 数据库与部署

项目说明
数据库MySQL 8,库名 db_smart_attendance,默认端口 3308
字符集utf8mb4
文件存储D:/uploads30(头像、人脸、打卡抓拍、ONNX 模型)
后端端口8030(可配置)
前端开发Vite 默认端口,代理至后端 API

四、系统架构

4.1 总体架构

系统采用 前后端分离 架构:Vue 3 单页应用负责管理端 UI 与公开打卡页;FastAPI 提供 RESTful API;MySQL 持久化业务数据;OpenCV DNN 模块在服务端完成人脸 AI 推理。

图片

4.2 技术分层架构

图片

4.3 后端目录结构

server/
├── main.py                 # FastAPI 应用入口、CORS、静态文件挂载
├── requirements.txt        # Python 依赖
├── sql/
│   └── db_smart_attendance.sql   # 数据库初始化脚本
└── app/
    ├── api/v1/             # REST API 路由
    │   ├── auth.py         # 登录认证
    │   ├── profile.py      # 个人中心
    │   ├── employee.py     # 员工管理
    │   ├── face.py         # 人脸库
    │   ├── punch.py        # 刷脸打卡(公开)
    │   ├── attendance.py   # 考勤记录
    │   ├── leave.py        # 请假管理
    │   ├── overtime.py     # 加班管理
    │   ├── stats.py        # 首页统计
    │   └── ...
    ├── core/               # 配置、安全、依赖注入
    ├── db/                 # 数据库 Session
    ├── models/             # SQLAlchemy ORM 模型
    ├── schemas/            # Pydantic 请求/响应模型
    ├── services/           # 业务服务(人脸、考勤)
    └── utils/              # 工具类(文件、CRUD)

4.4 前端目录结构

client/
├── src/
│   ├── views/              # 页面组件(Home、Employee、Punch 等)
│   ├── layout/             # MainLayout 主布局
│   ├── router/             # 路由与登录守卫
│   ├── store/              # Pinia 用户状态
│   ├── api/                # API 封装
│   └── utils/              # 请求拦截、日期、美颜等工具
├── vite.config.js          # Vite 配置与 API 代理
└── package.json

4.5 API 接口一览

前缀模块鉴权说明
/api/v1/auth认证部分登录、获取当前用户
/api/v1/profile个人中心JWT资料修改、密码修改
/api/v1/departments部门 JWT部门 CRUD
/api/v1/positions岗位JWT岗位 CRUD
/api/v1/shifts班次JWT班次 CRUD
/api/v1/employees员工JWT员工 CRUD
/api/v1/faces人脸库JWT人脸注册/删除/列表
/api/v1/attendance考勤JWT考勤记录查询
/api/v1/leaves请假JWT请假 CRUD 与审批
/api/v1/overtimes加班JWT加班 CRUD 与审批
/api/v1/recognition-logs识别日志JWT识别记录查询
/api/v1/stats统计JWT 首页看板数据
/api/v1/upload上传JWT头像/图片上传
/api/v1/punch打卡公开刷脸签到/签退

4.6 数据库 ER 关系

图片

五、数据库设计

  • 数据库名称db_smart_attendance

  • 引擎:InnoDB

  • 字符集 :utf8mb4 / utf8mb4_unicode_ci

  • 命名规范:表名以 t_ 开头

5.1 t_admin(管理员表)

字段名字段类型长度是否为空备注
idINT主键ID,自增
username VARCHAR50登录账号,唯一
passwordVARCHAR255登录密码
nicknameVARCHAR50昵称
avatarVARCHAR255头像路径
phoneVARCHAR20 手机号
emailVARCHAR100邮箱
statusTINYINT状态:1启用 0禁用,默认1
create_timeDATETIME创建时间,默认当前时间
update_timeDATETIME更新时间,自动更新

索引:PRIMARY KEY (id),UNIQUE KEY uk_admin_username (username)


5.2 t_department(部门表)

字段名字段类型长度是否为空备注
idINT 主键ID,自增
nameVARCHAR100部门名称
codeVARCHAR50部门编码,唯一
leaderVARCHAR50负责人
phoneVARCHAR20联系电话
sort_orderINT排序,默认0
statusTINYINT状态:1启用 0禁用,默认1
create_timeDATETIME创建时间
update_timeDATETIME更新时间

索引:PRIMARY KEY (id ),UNIQUE KEY uk_dept_code (code)


5.3 t_position(岗位表)

字段名字段类型长度是否为空备注
idINT主键ID,自增
name VARCHAR100岗位名称
codeVARCHAR50岗位编码,唯一
sort_orderINT排序,默认0
statusTINYINT状态:1启用 0禁用,默认1
create_timeDATETIME 创建时间
update_timeDATETIME更新时间

索引:PRIMARY KEY (id),UNIQUE KEY uk_position_code (code)


5.4 t_shift(班次表)

字段名字段类型长度 是否为空备注
idINT主键ID,自增
nameVARCHAR100班次名称
start_timeTIME上班时间
end_timeTIME 下班时间
late_toleranceINT迟到容忍分钟,默认10
early_toleranceINT早退容忍分钟,默认10
statusTINYINT状态:1启用 0禁用,默认1
create_timeDATETIME创建时间
update_timeDATETIME更新时间

索引:PRIMARY KEY (id)


5.5 t_employee(员工表)

字段名字段类型长度是否为空备注
idINT 主键ID,自增
emp_noVARCHAR50工号,唯一
nameVARCHAR50姓名
genderTINYINT性别:1男 2女,默认1
avatarVARCHAR255 头像路径
phoneVARCHAR20手机号
emailVARCHAR100邮箱
department_idINT部门ID,关联 t_department.id
position_idINT岗位ID,关联 t_position.id
shift_idINT班次ID,关联 t_shift.id
hire_dateDATE入职日期
statusTINYINT状态:1在职 0离职,默认1
create_timeDATETIME创建时间
update_timeDATETIME 更新时间

索引:PRIMARY KEY (id),UNIQUE KEY uk_emp_no (emp_no),KEY idx_employee_dept (department_id),KEY idx_employee_shift (shift_id)


5.6 t_face(人脸库表)

字段名字段类型 长度是否为空备注
idINT主键ID,自增
employee_idINT员工ID,关联 t_employee.id
image_pathVARCHAR255人脸图片路径
featureJSON 128维人脸特征向量
quality_scoreDECIMAL5,2人脸质量分
is_primaryTINYINT是否主脸:1是 0否,默认1
create_timeDATETIME创建时间
update_timeDATETIME更新时间

索引:PRIMARY KEY (id),KEY idx_face_employee (employee_id)


5.7 t_attendance(考勤记录表)

字段名字段类型长度是否为空备注
idINT 主键ID,自增
employee_idINT员工ID,关联 t_employee.id
attendance_dateDATE考勤日期
check_in_timeDATETIME签到时间
check_out_timeDATETIME签退时间
check_in_imageVARCHAR255签到抓拍图路径
check_out_imageVARCHAR255签退抓拍图路径
statusVARCHAR20考勤状态,默认「正常」
work_hoursDECIMAL5,2工时(小时)
similarityDECIMAL 5,4识别相似度
remarkVARCHAR255备注
create_timeDATETIME创建时间
update_timeDATETIME更新时间

考勤状态枚举:正常、迟到、早退、迟到且早退、缺卡

索引 :PRIMARY KEY (id),UNIQUE KEY uk_attendance_emp_date (employee_idattendance_date),KEY idx_attendance_date (attendance_date)


5.8 t_leave(请假表)

字段名字段类型长度是否为空备注
id INT主键ID,自增
employee_idINT员工ID,关联 t_employee.id
leave_typeVARCHAR20请假类型(事假/病假/年假等)
start_timeDATETIME开始时间
end_timeDATETIME 结束时间
durationDECIMAL5,2时长(小时)
reasonVARCHAR500请假原因
statusVARCHAR20审批状态,默认「待审批」
approver_idINT审批人ID,关联 t_admin.id
approve_timeDATETIME审批时间
create_timeDATETIME创建时间
update_timeDATETIME更新时间

审批状态枚举:待审批、已通过、已拒绝

索引:PRIMARY KEY (id),KEY idx_leave_employee ( employee_id)


5.9 t_overtime(加班表)

字段名字段类型长度是否为空备注
idINT主键ID,自增
employee_idINT 员工ID,关联 t_employee.id
start_timeDATETIME开始时间
end_timeDATETIME结束时间
durationDECIMAL5,2时长(小时)
reasonVARCHAR500加班原因
statusVARCHAR20审批状态,默认「待审批」
approver_idINT审批人ID,关联 t_admin.id
approve_timeDATETIME审批时间
create_timeDATETIME创建时间
update_timeDATETIME 更新时间

索引:PRIMARY KEY (id),KEY idx_overtime_employee (employee_id)


5.10 t_recognition_log(识别日志表)

字段名字段类型长度是否为空备注
id INT主键ID,自增
employee_idINT识别到的员工ID,失败时为 NULL
similarityDECIMAL5,4相似度
successTINYINT是否成功:1是 0否,默认0
image_pathVARCHAR255 抓拍图片路径
ip_addressVARCHAR50客户端 IP 地址
create_timeDATETIME识别时间

索引:PRIMARY KEY (id),KEY idx_recognition_time (create_time)


六、关键技术说明

6.1 人脸识别引擎

  • FaceEngine 采用单例模式,应用生命周期内只加载一次 ONNX 模型。

  • 检测阶段使用 OpenCV FaceDetectorYN(YuNet),输入尺寸自适应,置信度阈值 0.9。

  • 识别阶段使用 FaceRecognizerSF(SFace),对齐裁剪后输出 128 维特征。

  • 1:N 比对采用批量余弦相似度,阈值 FACE_THRESHOLD = 0.363(可在 .env 配置)。

6.2 内存人脸底库

  • 应用启动时 face_service.reload_gallery() 将全部 t_face.feature 加载至 NumPy 数组。

  • 注册/删除人脸后自动刷新,避免每次识别查询数据库,提升比对性能。

6.3 安全机制

  • 管理端 API 通过 JWT Bearer Token 鉴权(get_current_admin 依赖)。

  • 密码使用 bcrypt 哈希存储。

  • 刷脸打卡接口 /api/v1/punch 为公开接口,便于部署打卡终端。

6.4 统一响应格式

{
  "code"200,
  "msg""操作成功",
  "data": { }
}

七、部署架构

图片
组件 默认配置
MySQL127.0.0.1:3308,用户 root,密码 123456
FastAPI0.0.0.0:8030
上传目录D:/uploads30
JWT 有效期24 小时

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/200089