人臉識別考勤系統實現教程:基于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.pswp.cn/bicheng/78271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78271.shtml
英文地址,請注明出處:http://en.pswp.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類 兩者的使用關系如下&…