人脸识别考勤系统实现教程:基于Face-Recognition、OpenCV与SQLite

引言

随着人工智能技术的飞速发展,人脸识别技术已广泛应用于安防、金融、教育等多个领域。本文将带领大家利用Python的face-recognition库、OpenCVSQLite数据库,从零开始构建一个具备异常报警功能的人脸识别考勤系统。该系统能够实时检测视频流中的人脸,与预存数据库进行比对,自动记录考勤信息,并在检测到未注册人员时触发报警。通过本文的学习,你将掌握以下技能:

  • 人脸特征提取与数据库构建
  • 实时视频流处理与人脸识别
  • 考勤记录管理与异常报警
  • 模型优化与部署基础

技术栈简介

  1. Python:作为核心编程语言,提供丰富的库支持。
  2. face-recognition:基于dlib的深度学习模型,用于高效的人脸识别。
  3. OpenCV:开源计算机视觉库,处理图像和视频流。
  4. SQLite:轻量级数据库,用于存储人脸特征及考勤记录。

环境搭建

首先,确保安装以下依赖库:

bash复制代码pip install face-recognition opencv-python numpy sqlite3

一、构建人脸特征数据库

步骤1:采集人脸图像

  1. 创建dataset文件夹,按员工姓名建立子文件夹(如AliceBob),每个子文件夹内存放该员工的清晰正面照片(至少5张)。

步骤2:提取人脸特征并存储

import face_recognition
import sqlite3
import os# 连接SQLite数据库
conn = sqlite3.connect('attendance.db')
c = conn.cursor()# 创建表存储人脸特征
c.execute('''CREATE TABLE IF NOT EXISTS faces(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, encoding BLOB)''')# 遍历dataset文件夹,提取人脸特征
def load_faces():for root, dirs, files in os.walk('dataset'):for dir_name in dirs:person_dir = os.path.join(root, dir_name)for file in os.listdir(person_dir):file_path = os.path.join(person_dir, file)image = face_recognition.load_image_file(file_path)encodings = face_recognition.face_encodings(image)if len(encodings) > 0:encoding = encodings[0]c.execute("INSERT INTO faces (name, encoding) VALUES (?, ?)", (dir_name, sqlite3.Binary(encoding.tobytes())))conn.commit()load_faces()
conn.close()

二、实时视频流处理

步骤1:捕获视频流

import cv2video_capture = cv2.VideoCapture(0)  # 使用默认摄像头

步骤2:实时人脸识别

import numpy as npknown_face_encodings = []
known_face_names = []# 从数据库加载已知人脸数据
conn = sqlite3.connect('attendance.db')
c = conn.cursor()
c.execute("SELECT name, encoding FROM faces")
rows = c.fetchall()for row in rows:name = row[0]encoding = np.frombuffer(row[1], dtype=np.float64)known_face_encodings.append(encoding)known_face_names.append(name)conn.close()while True:ret, frame = video_capture.read()# 调整帧大小以提高处理速度small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)# 转换颜色空间rgb_small_frame = small_frame[:, :, ::-1]# 查找所有人脸位置及特征face_locations = face_recognition.face_locations(rgb_small_frame)face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)# 遍历检测到的人脸for face_encoding in face_encodings:matches = face_recognition.compare_faces(known_face_encodings, face_encoding)name = "Unknown"# 使用阈值提高识别准确性face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)best_match_index = np.argmin(face_distances)if matches[best_match_index] and face_distances[best_match_index] < 0.6:name = known_face_names[best_match_index]# 在画面上标注识别结果top, right, bottom, left = face_locations[0]top *= 4right *= 4bottom *= 4left *= 4cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)cv2.putText(frame, name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)cv2.imshow('Video', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakvideo_capture.release()
cv2.destroyAllWindows()

三、考勤记录系统开发

步骤1:创建考勤表

CREATE TABLE attendance (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);

步骤2:集成考勤记录功能

修改实时识别代码,添加考勤记录逻辑:

# 在识别到已知人脸后添加
if name != "Unknown":conn = sqlite3.connect('attendance.db')c = conn.cursor()c.execute("INSERT INTO attendance (name) VALUES (?)", (name,))conn.commit()conn.close()

四、异常报警与邮件通知

步骤1:定义异常规则

例如:非工作时间段考勤、连续多次未识别到人脸等。

步骤2:实现邮件通知

import smtplib
from email.mime.text import MIMETextdef send_alert(message):msg = MIMEText(message)msg['Subject'] = '考勤异常警报'msg['From'] = 'your_email@example.com'msg['To'] = 'admin@example.com'with smtplib.SMTP('smtp.example.com', 587) as server:server.login('your_email@example.com', 'your_password')server.sendmail('your_email@example.com', ['admin@example.com'], msg.as_string())# 在检测到未知人脸时触发报警
if name == "Unknown":send_alert("检测到未注册人员!")

五、模型优化与部署

优化策略

  1. 算法优化:使用更高效的模型(如MobileFaceNet)
  2. 硬件加速:利用GPU加速计算
  3. 多线程处理:分离视频采集与识别任务

部署建议

  1. 容器化部署:使用Docker打包应用
  2. API服务化:将核心功能封装为REST API
  3. 监控集成:添加系统健康检查与日志记录

总结

本文完整展示了基于Python生态构建人脸识别考勤系统的全过程,从数据采集到模型部署,涵盖了计算机视觉应用的典型流程。通过实践,读者不仅掌握了具体技术的实现细节,更能理解系统设计中的权衡与优化思路。该系统可进一步扩展为更复杂的应用场景,如结合门禁控制、体温检测等功能,构建智慧办公解决方案。

希望本文能成为你探索计算机视觉领域的起点,激发更多创新应用的灵感!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亲测成功❗❗❗Linux下编译opencv-4.10.0(静态链接库和动态链接库)

1. 安装依赖 在编译之前&#xff0c;确保系统中安装了必要的依赖工具和库。运行以下命令安装&#xff1a; sudo apt update sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config sudo apt-get install libavcodec-dev libavforma…

windows 部署Prometheus+Node-expoter

Prometheus v3.2.1 离线部署方式 通过helm部署prometheus会自动部署Node-expoter只需要添加prometheus的抓取规则&#xff01;&#xff01; 删除&#xff1a; 清除之前安装的 Prometheus 如果你之前已经安装了 Prometheus&#xff0c;需要清除原有的 Prometheus 安装&#xf…

HTMLCSS实现网页轮播图

网页中轮播图区域的实现与解析 在现代网页设计中&#xff0c;轮播图是一种常见且实用的元素&#xff0c;能够在有限的空间内展示多个内容&#xff0c;吸引用户的注意力。下面将对上述代码中轮播图区域的实现方式进行详细介绍。 一、HTML 结构 <div class"carousel-c…

Linux:进程的概念

基本概念 课本概念&#xff1a;程序的一个可执行实例&#xff0c;正在执行的程序。 内核观点&#xff1a;担当分配系统资源实体。 当操作系统要执行程序时&#xff0c;也就是说操作系统要执行代码&#xff0c;但一个操作系统需要执行多个程序&#xff0c;而CPU只有一块&#xf…

前端基础之《Vue(10)—过滤器》

一、过滤器 1、作用 用于数据处理。 2、全局过滤器 使用Vue.filter(名称, val>{return newVal})定义。 在任何组件中都可以直接使用。 3、局部过滤器 使用选项&#xff0c;filters: {}定义&#xff0c;只能在当前组件中使用。 4、过滤器在Vue 3.0中已经淘汰了 5、过滤器…

平板电脑做欧盟网络安全法案(EU)2022/30

平板电脑做欧盟网络安全法案&#xff08;EU&#xff09;2022/30 平板电脑做EN18031,平板电脑做无障碍法规EU2019/882 欧盟委员会于2022年通过补充授权法案 &#xff08;EU&#xff09; 2022/30&#xff0c;明确要求无线电设备需满足网络安全、隐私保护及反欺诈要求。 新规时间轴…

Unity中打可选择的AssetBundle,以及URP中加载AssetBundle包Shader丢失问题显示洋红色的解决方案

在上一篇打AssetBundle中已经实现了简单的打AB包和加载,《Unity中打包AssetBundle并加载》,本篇笔记是进一步上一篇最后提出的问题,进行优化。 一、打可选择的AssetBundle 每次打包都会把设置了AssetBundle名称和后缀的所有文件都打包,这也是现在网上教学最多的 但是有时…

解决cannot find attribute `serde` in this scope记录

问题描述&#xff1a; 在Rust中使用serde做json序列化&#xff0c;需要对一个字段指定序列化方法&#xff0c;添加serde注解后报错: error: cannot find attribute serde in this scope --> src\models\order_model.rs:38:7 | 38 | #[serde(deserialize_with &qu…

基于whisper和ffmpeg语音转文本小程序

目录 一、环境准备 ✅ 第一步&#xff1a;安装并准备 Conda 环境 ✅ 第二步&#xff1a;创建 Whisper 专用的 Conda 虚拟环境 ✅ 第三步&#xff1a;安装 GPU 加速版 PyTorch&#xff08;适配 RTX 4060&#xff09; ✅ 第四步&#xff1a;安装 Whisper 和 FFMPEG 依赖 ✅…

Linux GPIO驱动开发实战:Poll与异步通知双机制详解

1. 引言 在嵌入式Linux开发中&#xff0c;GPIO按键驱动是最基础也最典型的案例之一。本文将基于一个支持poll和异步通知双机制的GPIO驱动框架&#xff0c;深入剖析以下核心内容&#xff1a; GPIO中断与防抖处理环形缓冲区设计Poll机制实现异步通知(SIGIO)实现应用层交互方式 …

【最新版】西陆健身系统源码全开源+uniapp前端

一.系统介绍 一款基于UniappThinkPHP开发健身系统&#xff0c;支持多城市、多门店&#xff0c;包含用户端、教练端、门店端、平台端四个身份。有团课、私教、训练营三种课程类型&#xff0c;支持在线排课。私教可以通过上课获得收益&#xff0c;在线申请提现功能&#xff0c;无…

济南国网数字化培训班学习笔记-第二组-6-输电线路现场教学

输电线路现场教学 杆塔组装 角钢塔 角钢-连扳-螺栓 螺栓&#xff08;M&#xff09;&#xff1a; 脚钉-螺栓&#xff08;螺栓头-无扣长-螺纹-螺帽&#xff09;-垫片-螺帽/防盗帽/防松帽M20*45 表示直径20mm&#xff0c;长度45mm螺栓级别由一个类似浮点数表示&#xff0c;如…

抖音的逆向工程获取弹幕(websocket和protobuf解析)

目录 声明前言第一节 获取room_id和ttwid值第二节 signture值逆向python 实现signature第三节 Websocket实现长链接请求protubuf反序列化pushFrame反序列化Response解压和反序列化消息体Message解析应答ack参考博客声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的…

反射,枚举,lambda表达式

目录 反射枚举的使用Lambda表达式函数式接口语法Lambda表达式语法精简 变量捕获Lambda在集合List中的使用 反射 作用&#xff1a;在Java代码中&#xff0c;让一个对象认识到自己 比如一个类的名字&#xff0c;里面的方法&#xff0c;属性等 让程序运行的过程&#xff0c;某个对…

鸿蒙移动应用开发--渲染控制实验

任务&#xff1a;使用“对象数组”、“ForEach渲染”、“Badge角标组件”、“Grid布局”等相关知识&#xff0c;实现生效抽奖卡案例。如图1所示&#xff1a; 图1 生肖抽奖卡实例图 图1(a)中有6张生肖卡可以抽奖&#xff0c;每抽中一张&#xff0c;会通过弹层显示出来&#xf…

webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)

目录 1、webpack简介2、简单示例3、入口(entry)和输出(output)4、自动生成html文件5、打包css代码6、优化&#xff08;单独提取css代码&#xff09;7、优化&#xff08;压缩过程&#xff09;8、打包less代码9、打包图片10、搭建开发环境&#xff08;webpack-dev-server&#xf…

Java快速上手之实验4(接口回调)

1&#xff0e;编写接口程序RunTest.java&#xff0c;通过接口回调实现多态性。解释【代码4】和【代码6】的执行结果为何不同&#xff1f; interface Runable{ void run(); } class Cat implements Runable{ public void run(){ System.out.println("猫急上树.."…

Volcano 实战快速入门 (一)

一、技术背景 随着大型语言模型&#xff08;LLM&#xff09;的蓬勃发展&#xff0c;其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源&#xff08;尤其是 GPU&#xff09;的巨大需求、分布式任务固有的复杂依…

Qwen2.5简要全流程以及QA

1 输入prompt 得到input id input id&#xff1a; [B,L] # batch size , lenth 2 embeding之后得到 input_embeds: [B,L,D] # demensions 3 进入Transformer层 先通过linear层得到shape不变的 QKV 多头注意力 分割Dimension &#xff0c; kv变成 [B,H,L,head_dim] h是…

爬虫学习——Item封装数据与Item Pipeline处理数据

一、Item封装数据 对于有字段的数据&#xff0c;最好的数据结构维护方法为字典类型(dict)&#xff0c;但是由于字典不便于携带元数据和传递给其他组件使用&#xff0c;故可以使用Item类封装爬取到的数据。 这里涉及两个类&#xff1a;Item基类和Field类 两者的使用关系如下&…