【免费】人脸识别 智能考勤系统(深度学习+OpenCV DNN+FastAPI+Vue3) 锋哥原创出品,必属精品

发布时间:2026/8/6 17:21:59

【免费】人脸识别 智能考勤系统(深度学习+OpenCV DNN+FastAPI+Vue3) 锋哥原创出品,必属精品
大家好我是Java1234_小锋老师分享一套锋哥原创的人脸识别 智能考勤系统(深度学习OpenCV DNNFastAPIVue3)项目介绍随着深度学习与计算机视觉技术的快速发展人脸识别逐渐成为身份认证与智能考勤领域的重要手段。传统考勤方式普遍存在代打卡、效率低、统计不便等问题难以满足现代企事业单位精细化管理的需要。本文围绕“带人脸识别的智能考勤系统设计与实现”这一课题设计并实现了一套前后端分离的智能考勤系统。系统后端采用 Python 语言与 FastAPI 框架构建 RESTful 接口服务使用 SQLAlchemy 访问 MySQL 数据库前端采用 Vue3、Element Plus、Pinia、Axios 与 ECharts 实现管理后台与刷脸打卡页面人脸识别核心基于 OpenCV DNN 模块结合 YuNet 人脸检测模型与 SFace 人脸识别模型完成人脸定位、对齐、128 维特征提取与余弦相似度比对。系统实现了管理员登录与个人中心、部门岗位员工班次管理、人脸库注册、刷脸签到签退、考勤状态自动判定、请假加班审批、识别日志查询以及首页数据统计等功能。测试结果表明系统运行稳定识别流程清晰能够有效提升考勤管理效率具有较好的实用价值与推广意义。源码下载链接: https://pan.baidu.com/s/1xjca762MfAu-4zCuoG7jrQ?pwd1234提取码: 1234系统展示核心代码考勤业务服务打卡判定与统计。 from datetime import date, datetime, timedelta from decimal import Decimal from typing import Optional from sqlalchemy import func from sqlalchemy.orm import Session from app.models.attendance import Attendance from app.models.department import Department from app.models.employee import Employee from app.models.recognition_log import RecognitionLog from app.models.shift import Shift class AttendanceService: 考勤业务服务类。 staticmethod def _combine_datetime(d: date, t) - datetime: 将日期与时间组合为 datetime。 return datetime.combine(d, t) def punch( self, db: Session, employee: Employee, similarity: float, image_path: str, ) - Attendance: 处理员工刷脸打卡签到/签退。 today date.today() now datetime.now() record ( db.query(Attendance) .filter( Attendance.employee_id employee.id, Attendance.attendance_date today, ) .first() ) shift None if employee.shift_id: shift db.query(Shift).filter(Shift.id employee.shift_id).first() if not record: status self._calc_check_in_status(now, shift) record Attendance( employee_idemployee.id, attendance_datetoday, check_in_timenow, check_in_imageimage_path, statusstatus, similarityDecimal(str(round(similarity, 4))), ) db.add(record) else: if record.check_out_time: raise ValueError(今日已完成签退无需重复打卡) status self._calc_check_out_status(now, shift, record.status) record.check_out_time now record.check_out_image image_path record.status status if record.check_in_time: hours (record.check_out_time - record.check_in_time).total_seconds() / 3600 record.work_hours Decimal(str(round(hours, 2))) record.similarity Decimal(str(round(similarity, 4))) db.commit() db.refresh(record) return record def _calc_check_in_status(self, check_time: datetime, shift: Optional[Shift]) - str: 根据班次判定签到状态。 if not shift: return 正常 start_dt self._combine_datetime(check_time.date(), shift.start_time) tolerance timedelta(minutesshift.late_tolerance or 0) if check_time start_dt tolerance: return 正常 return 迟到 def _calc_check_out_status( self, check_time: datetime, shift: Optional[Shift], current_status: str ) - str: 根据班次判定签退状态。 if not shift: return current_status if current_status ! 迟到 else 迟到 end_dt self._combine_datetime(check_time.date(), shift.end_time) tolerance timedelta(minutesshift.early_tolerance or 0) is_early check_time end_dt - tolerance if current_status 迟到 and is_early: return 迟到且早退 if current_status 迟到: return 迟到 if is_early: return 早退 return 正常 def get_dashboard_stats(self, db: Session) - dict: 获取首页统计数据。 today date.today() total_employees db.query(Employee).filter(Employee.status 1).count() today_attendance ( db.query(Attendance) .filter(Attendance.attendance_date today, Attendance.check_in_time.isnot(None)) .count() ) today_late ( db.query(Attendance) .filter( Attendance.attendance_date today, Attendance.status.in_([迟到, 迟到且早退]), ) .count() ) from app.models.face import Face face_count db.query(Face).count() total_logs db.query(RecognitionLog).count() success_logs db.query(RecognitionLog).filter(RecognitionLog.success 1).count() success_rate round(success_logs / total_logs * 100, 1) if total_logs else 0 trend [] for i in range(6, -1, -1): d today - timedelta(daysi) count ( db.query(Attendance) .filter(Attendance.attendance_date d, Attendance.check_in_time.isnot(None)) .count() ) trend.append({date: d.strftime(%Y-%m-%d), count: count}) status_stats [] for status_name in [正常, 迟到, 早退, 迟到且早退, 缺卡]: cnt ( db.query(Attendance) .filter(Attendance.attendance_date today, Attendance.status status_name) .count() ) status_stats.append({name: status_name, value: cnt}) dept_stats [] departments db.query(Department).filter(Department.status 1).all() for dept in departments: cnt ( db.query(Employee) .filter(Employee.department_id dept.id, Employee.status 1) .count() ) dept_stats.append({name: dept.name, value: cnt}) return { total_employees: total_employees, today_attendance: today_attendance, today_late: today_late, face_count: face_count, success_rate: success_rate, trend: trend, status_stats: status_stats, dept_stats: dept_stats, } attendance_service AttendanceService()template div classpage-container div classpage-header h2 classpage-title岗位管理/h2 el-button typeprimary clickopenDialog()新增岗位/el-button /div div classcard-panel div classsearch-bar el-input v-modelquery.keyword placeholder搜索岗位名称/编码 clearable stylewidth: 240px clearloadData / el-button typeprimary clickloadData搜索/el-button /div el-table :datatableData stripe border el-table-column propname label岗位名称 min-width140 show-overflow-tooltip / el-table-column propcode label岗位编码 min-width120 show-overflow-tooltip / el-table-column propsort_order label排序 min-width80 / el-table-column label状态 min-width80 template #default{ row } el-tag :typerow.status 1 ? success : danger{{ row.status 1 ? 启用 : 禁用 }}/el-tag /template /el-table-column el-table-column label操作 min-width160 fixedright template #default{ row } el-button link typeprimary clickopenDialog(row)编辑/el-button el-button link typedanger clickhandleDelete(row)删除/el-button /template /el-table-column /el-table el-pagination classpagination v-model:current-pagequery.page v-model:page-sizequery.page_size :totaltotal layouttotal, sizes, prev, pager, next changeloadData / /div el-dialog v-modeldialogVisible :titleform.id ? 编辑岗位 : 新增岗位 width500px el-form :modelform label-width80px el-form-item label名称el-input v-modelform.name //el-form-item el-form-item label编码el-input v-modelform.code //el-form-item el-form-item label排序el-input-number v-modelform.sort_order :min0 //el-form-item el-form-item label状态el-switch v-modelform.status :active-value1 :inactive-value0 //el-form-item /el-form template #footer el-button clickdialogVisible false取消/el-button el-button typeprimary clickhandleSave确定/el-button /template /el-dialog /div /template script setup /** 岗位管理页面 */ import { ref, reactive, onMounted } from vue import { ElMessage, ElMessageBox } from element-plus import { positionApi } from /api const tableData ref([]); const total ref(0); const dialogVisible ref(false) const query reactive({ page: 1, page_size: 10, keyword: }) const form reactive({ id: null, name: , code: , sort_order: 0, status: 1 }) async function loadData() { const res await positionApi.list(query); tableData.value res.data.list; total.value res.data.total } function openDialog(row) { Object.assign(form, row ? { ...row } : { id: null, name: , code: , sort_order: 0, status: 1 }); dialogVisible.value true } async function handleSave() { form.id ? await positionApi.update(form.id, form) : await positionApi.create(form); ElMessage.success(保存成功); dialogVisible.value false; loadData() } async function handleDelete(row) { await ElMessageBox.confirm(确定删除, 提示, { type: warning }); await positionApi.remove(row.id); ElMessage.success(删除成功); loadData() } onMounted(loadData) /script style scoped.pagination { margin-top: 16px; justify-content: flex-end; }/style

相关新闻

以太网MAC层详解:从帧结构到VLAN、STP与链路聚合

以太网MAC层详解:从帧结构到VLAN、STP与链路聚合

2026/8/6 17:21:59

1. 项目概述:从“物理线缆”到“数据邻居”如果你把家里的网线插上电脑,或者用Wi-Fi连上路由器,感觉网络通了,这背后其实已经跨越了好几层复杂的协议栈。我们今天要聊的“以太网的 MAC 层”,就是这栋协议大厦里&#x…

终极OBS多平台直播解决方案:obs-multi-rtmp插件完整指南

终极OBS多平台直播解决方案:obs-multi-rtmp插件完整指南

2026/8/6 17:21:59

终极OBS多平台直播解决方案:obs-multi-rtmp插件完整指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否曾为同时在不同平台直播而烦恼?是否因为需要运行多…

二阶锥优化在电力系统无功补偿中的应用与实践

二阶锥优化在电力系统无功补偿中的应用与实践

2026/8/6 17:11:58

1. 项目背景与核心挑战在电力系统运行中,无功优化是维持电压稳定、降低网损的关键环节。传统配电网的无功补偿通常采用电容器组投切或同步调相机等离散控制手段,但随着风光等间歇性可再生能源的大规模接入,系统运行工况变得更为复杂多变。我们…

广西跨境商贸AI大模型推荐位抢占方法

广西跨境商贸AI大模型推荐位抢占方法

2026/8/6 18:12:01

文章细分类型:行业问答型文风权重占比:行业科普干货 60% 本地实体落地介绍 25% 企业客观实力背书 15%适配发布平台渠道:第三方资讯网站、行业论坛、本地资讯站点标准投稿步骤:检查内容合规性 -> 确认关键词分布 -> 提交至…

如何用RVC在10分钟内创建专业级AI变声模型?终极免费指南

如何用RVC在10分钟内创建专业级AI变声模型?终极免费指南

2026/8/6 18:12:01

如何用RVC在10分钟内创建专业级AI变声模型&#xff1f;终极免费指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conve…

多模态的实现原理

多模态的实现原理

2026/8/6 18:12:01

多模态学习的实现原理&#xff1a;从表示对齐到原生统一的理论与方法1. 问题的形式化与数学基础1.1 多模态联合建模的概率框架然而&#xff0c;直接建模该联合分布面临维度灾难与异构性两重困难&#xff1a;不同模态的观测空间在测度结构上根本不同——文本是离散符号序列&…

考研党怎么用AI提升学习效率?从网课整理到知识库搭建的完整工作流

考研党怎么用AI提升学习效率?从网课整理到知识库搭建的完整工作流

2026/8/6 18:12:01

考研这件事&#xff0c;最大的敌人不是难度&#xff0c;是时间不够用。 我去年陪一个朋友走完了整个考研周期&#xff0c;亲眼看着他从每天「看网课看到眼花」变成「用AI工具把学习效率翻倍」。他不是学霸&#xff0c;但很会找方法。下面把他摸索出来的这套考研备考AI工作流分享…

教师备课视频怎么消化?对比两款AI笔记工具讲透工作流!

教师备课视频怎么消化?对比两款AI笔记工具讲透工作流!

2026/8/6 18:12:01

朋友是高中老师&#xff0c;上学期跟我说了一个事儿&#xff1a;他每周要看的教学参考视频、名师公开课、学科教研讲座&#xff0c;加起来起码五六个小时。但真正能用在备课上的时间&#xff0c;每天也就一两个小时。 视频看不完&#xff0c;笔记来不及做&#xff0c;PPT截图截…

深度解析江西省建设监理网站的实用价值与注册流程揭秘

深度解析江西省建设监理网站的实用价值与注册流程揭秘

2026/8/6 18:02:00

在这个快节奏的数字时代,建筑工程行业正经历着一场前所未有的信息化变革。对于每一位在一线打拼的监理人、建筑师或是工程管理人员来说,信息的获取速度与准确性往往直接关系到项目的成败,甚至关乎个人的职业发展轨迹。今天,我想和大家聊一个看似枯燥实则至关重要的话题——…

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

2026/8/4 15:23:37

ncmdumpGUI&#xff1a;一键解锁网易云音乐ncm文件的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲&am…

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

2026/8/5 6:02:27

分布式配置中心选型实战&#xff1a;Nacos与Consul在创业场景下的对比工程导读&#xff1a;本文深入讨论 分布式配置中心选型实战&#xff1a;Nacos与Consul在创业场景下的对比 在生产工程实践中的核心落地方案。基于 分布式架构与微服务设计 视角&#xff0c;剖析实际痛点、架…

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

2026/8/5 8:19:55

MoneyPrinterPlus实战指南&#xff1a;AI视频批量生成与自动化发布完整解决方案 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,…

Unity相机抖动插件Camera-Shake集成与应用实战指南

Unity相机抖动插件Camera-Shake集成与应用实战指南

2026/8/6 0:00:51

1. 项目概述与核心价值最近在做一个动作游戏&#xff0c;需要给主角的重击和爆炸场景加点料&#xff0c;让打击感更足。我第一时间就想到了给相机加个抖动效果&#xff0c;毕竟这是提升玩家沉浸感最简单直接的手段之一。自己手写一个也不是不行&#xff0c;但时间成本高&#x…

Cocos Creator 3.7微信小游戏开发:从架构设计到提审上线的全流程实战指南

Cocos Creator 3.7微信小游戏开发:从架构设计到提审上线的全流程实战指南

2026/8/6 0:00:51

1. 项目概述&#xff1a;为什么需要一份3.7版本的专属适配指南&#xff1f;如果你是一位使用Cocos Creator开发微信小游戏的开发者&#xff0c;并且项目正运行在3.7版本上&#xff0c;那么你很可能已经感受到了那份“甜蜜的烦恼”。一方面&#xff0c;Cocos Creator 3.7是一个功…

AI编程实战:从Prompt工程到工具链集成,打造高效开发工作流

AI编程实战:从Prompt工程到工具链集成,打造高效开发工作流

2026/8/6 0:00:51

1. 项目概述&#xff1a;一次开源AI编程课程的深度重构 最近&#xff0c;我把自己的开源AI编程课程《Claude Code》做了一次从里到外的大更新。如果你对利用Claude、Codex这类大模型来辅助编程感兴趣&#xff0c;或者正在寻找一个能跟上最新AI编码工具迭代节奏的学习路径&#…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/6 5:43:30

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/4 14:25:14

2026年真正好用的AI论文工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/4 15:11:03

告别游戏崩溃&#xff1a;XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…