智能體開(kāi)發(fā)技術(shù)(Python+FastAPI版) 課件 第六章 智能考勤_第1頁(yè)
智能體開(kāi)發(fā)技術(shù)(Python+FastAPI版) 課件 第六章 智能考勤_第2頁(yè)
智能體開(kāi)發(fā)技術(shù)(Python+FastAPI版) 課件 第六章 智能考勤_第3頁(yè)
智能體開(kāi)發(fā)技術(shù)(Python+FastAPI版) 課件 第六章 智能考勤_第4頁(yè)
智能體開(kāi)發(fā)技術(shù)(Python+FastAPI版) 課件 第六章 智能考勤_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

智能考勤content目錄01需求與設(shè)計(jì)分析02OpenCV版本實(shí)現(xiàn)03Web端版本實(shí)現(xiàn)04活體檢測(cè)防作弊需求與設(shè)計(jì)分析01核心功能列表基于人臉識(shí)別和活體檢測(cè)的智能考勤系統(tǒng),其核心功能是準(zhǔn)確的人臉識(shí)別和基于防作弊機(jī)制的活體檢測(cè)功能,并提供相應(yīng)的界面用于考勤數(shù)據(jù)的查詢、導(dǎo)出等。為了讓用戶能夠及時(shí)得知是否打卡成功,建議添加語(yǔ)音播放功能,并同步顯示當(dāng)天的最新的考勤數(shù)據(jù)。另外,可以將智能考勤系統(tǒng)整合到企業(yè)內(nèi)部的辦公自動(dòng)化或人力資源系統(tǒng)中,這部分內(nèi)容不在本書(shū)討論范疇,但是在設(shè)計(jì)時(shí)可以考慮相應(yīng)的拓展性。圖6-1展示了智能考勤系統(tǒng)純Web端通過(guò)WebSocket實(shí)現(xiàn)的界面截圖。整體實(shí)現(xiàn)思路(1)人臉數(shù)據(jù)采集:前端界面可以通過(guò)JavaScript調(diào)用MediaRecorderAPI來(lái)實(shí)現(xiàn)攝像頭調(diào)用,并利用canvas元素進(jìn)行實(shí)時(shí)截圖;也可以基于Python的OpenCV庫(kù)來(lái)調(diào)用攝像頭實(shí)時(shí)獲取人臉數(shù)據(jù)。兩者思路完全一致,只是實(shí)現(xiàn)方法有所差異,本章后續(xù)內(nèi)容會(huì)對(duì)此進(jìn)行詳細(xì)講解。(2)人臉識(shí)別:核心在于檢測(cè)攝像頭中是否存在人臉,并提取出人臉輪廓數(shù)據(jù)。face_recognition庫(kù)提供的face_locations()函數(shù)可以直接讀取并返回人臉在整段視頻中的位置信息。如果有多張人臉,則返回多條人臉位置信息。(3)人臉位置標(biāo)注:為了給用戶提供實(shí)時(shí)的可視化反饋,最好是在識(shí)別到人臉時(shí)實(shí)時(shí)在攝像頭視頻畫(huà)面中繪制位置框。在Python中,可以使用OpenCV庫(kù)直接進(jìn)行繪制,在JavaScript中,可以使用“DIV+固定定位”的方案進(jìn)行繪制。整體實(shí)現(xiàn)思路(4)人臉對(duì)比:考勤系統(tǒng)一般會(huì)先錄入人臉數(shù)據(jù),將其保存為圖像,并將每一張人臉照片識(shí)別為一組編碼,此編碼在face_recognition庫(kù)中是一組128維的特征編碼向量。人臉對(duì)比時(shí),主要對(duì)比錄入的人臉的特征和識(shí)別的人臉的特征,如果相似度較高,則認(rèn)為兩張人臉屬于同一個(gè)人。(5)數(shù)據(jù)管理:需要使用數(shù)據(jù)庫(kù)對(duì)人臉特征向量和考勤數(shù)據(jù)進(jìn)行保存,所以使用SQLModel來(lái)操作數(shù)據(jù)庫(kù)。可以使用3張表來(lái)保存數(shù)據(jù):第一張表用于保存人員基本信息,如姓名、部門(mén)等;第二張表用于保存首次錄入的人臉數(shù)據(jù);第三張表用于保存每一次的考勤記錄。(6)活體檢測(cè):為了防止考勤時(shí)使用事先拍攝好的照片進(jìn)行作弊,通常需要進(jìn)行活體檢測(cè)?;铙w檢測(cè)的方案有很多,本章智能考勤系統(tǒng)的實(shí)現(xiàn)思路是基于face_recognition庫(kù)所識(shí)別的臉部的68個(gè)關(guān)鍵特征點(diǎn)的坐標(biāo)值來(lái)進(jìn)行眨眼、張嘴、點(diǎn)頭、搖頭等動(dòng)作的實(shí)時(shí)計(jì)算,以檢測(cè)是否為活體。face_recognition的用法要使用face_recognition,需要先安裝環(huán)境,主要安裝OpenCV、Dlib和face_recognition這3個(gè)庫(kù),運(yùn)行“pipinstallopencv-pythondlibface_recognition”命令即可完成安裝。其中,OpenCV庫(kù)主要用于采集攝像頭數(shù)據(jù)、進(jìn)行圖案繪制、實(shí)時(shí)繪制人臉框等,也包括處理來(lái)自前端的視頻數(shù)據(jù)的轉(zhuǎn)碼等;Dlib是face_recognition的依賴包。主要函數(shù)和功能(1)load_image_file(filename):加載圖像文件,并返回表示該圖像的NumPy數(shù)組。該函數(shù)用于從磁盤(pán)加載圖像數(shù)據(jù),以便后續(xù)進(jìn)行人臉識(shí)別或分析。(2)face_locations(image,model="hog"):在圖像中檢測(cè)人臉,并返回一個(gè)列表,其中每個(gè)元素表示檢測(cè)到的人臉的位置。位置以(top,right,bottom,left)四元組形式表示,分別代表人臉框的上、右、下、左邊界??梢赃x擇使用hog或cnn模型來(lái)進(jìn)行檢測(cè),默認(rèn)使用hog。face_recognition的用法(3)face_landmarks(image):在圖像中檢測(cè)人臉并標(biāo)記68個(gè)關(guān)鍵特征點(diǎn),返回一個(gè)字典類型的數(shù)據(jù),其中包含每個(gè)檢測(cè)到的人臉的關(guān)鍵特征點(diǎn)坐標(biāo)。關(guān)鍵特征點(diǎn)包括眼睛、眉毛、鼻子、嘴巴、下巴等。該函數(shù)的返回值主要用于活體檢測(cè)。(4)face_encoding(image,location=None,num_jitters=1,model="small"):返回圖像的128維特征編碼向量。其中,location是人臉的位置,是可選項(xiàng),若不指定,則編碼整張人臉;num_jitters表示抽樣次數(shù),值越大表示計(jì)算速度越慢,但是可以提升準(zhǔn)確率;model表示使用哪種模型,默認(rèn)值為small,其計(jì)算量小,只針對(duì)臉部的5個(gè)關(guān)鍵特征點(diǎn)進(jìn)行編碼。(5)compare_faces(known_face_encodings,face_encoding_to_check,tolerance=0.6):將一個(gè)人臉編碼與一組已知人臉編碼進(jìn)行比較,查看其中是否有相似人臉,并返回一個(gè)布爾值數(shù)組,表示待比較人臉與已知人臉的匹配結(jié)果,當(dāng)兩組編碼的差距小于閾值時(shí),認(rèn)為其是一個(gè)人并返回true,否則返回false。可選參數(shù)tolerance用于指定容錯(cuò)度閾值,取值為0~1,默認(rèn)值為0.6,該值越大,說(shuō)明容錯(cuò)度越高。face_recognition的用法下述代碼展示了如何使用face_recognition模型識(shí)別人臉并在圖像上標(biāo)注出位置。OpenCV版本實(shí)現(xiàn)02利用OpenCV采集攝像頭數(shù)據(jù)代碼演示了如何使用OpenCV實(shí)時(shí)采集攝像頭數(shù)據(jù),并借助face_recognition判斷是否存在人臉,如果存在,則將人臉通過(guò)矩形框標(biāo)注出來(lái)。人臉數(shù)據(jù)存儲(chǔ)與對(duì)比代碼展示了如何進(jìn)行人臉對(duì)比,并找到正確的人臉進(jìn)行姓名和位置標(biāo)注。人臉數(shù)據(jù)存儲(chǔ)與對(duì)比上述代碼中有以下兩點(diǎn)需要注意。首先,由于Mr-Zhang.png這張圖像是由AI生成的,編者使用提示詞讓AI生成了一張佩戴眼鏡的人的圖像,以體現(xiàn)真實(shí)的人臉識(shí)別時(shí)面部有所變化的情況,如圖6-4所示。但是在實(shí)際生產(chǎn)環(huán)境中,智能考勤系統(tǒng)中存儲(chǔ)的均是真實(shí)的人臉數(shù)據(jù),個(gè)體差異通常比較大,不會(huì)存在此類長(zhǎng)得特別像的情況,所以在實(shí)際環(huán)境中,調(diào)用compare_face()函數(shù)時(shí),需要調(diào)整tolerance參數(shù)以達(dá)到識(shí)別相對(duì)準(zhǔn)確的目的。人臉數(shù)據(jù)存儲(chǔ)與對(duì)比其次,OpenCV中利用putText()函數(shù)繪制文字標(biāo)注時(shí),無(wú)法繪制中文標(biāo)注,因?yàn)樵摵瘮?shù)只支持繪制ASCII字符。如果需要繪制中文標(biāo)注,則需要安裝PIL(即Python圖像庫(kù)),安裝命令為pipinstallPillow,并由該庫(kù)生成中文字符。以下代碼演示了PIL庫(kù)的基礎(chǔ)功能,后續(xù)章節(jié)中使用到其他功能時(shí)再進(jìn)行補(bǔ)充。設(shè)計(jì)智能考勤系統(tǒng)數(shù)據(jù)表其核心功能主要涉及3張表。第一張表為用戶信息表,用于保存用戶的基本信息;第二張表為人臉編碼表,用于保存預(yù)存儲(chǔ)的人臉編碼信息;第三張表為考勤記錄表,用于記錄每次考勤的數(shù)據(jù)。實(shí)現(xiàn)新增人臉數(shù)據(jù)功能新增人臉數(shù)據(jù)功能通過(guò)Web界面實(shí)現(xiàn)交互,利用FastAPI提供后臺(tái)數(shù)據(jù)操作。前端界面可以使用兩種方案來(lái)完成新增:第一種方案是直接上傳人臉圖像并編碼保存;第二種方案是打開(kāi)攝像頭讀取人臉數(shù)據(jù)并截圖,上傳截圖并編碼保存。后端代碼實(shí)現(xiàn)若要新增人臉數(shù)據(jù),則需要提供后臺(tái)接口來(lái)獲取前端人臉圖像,且前端提交的圖像與對(duì)應(yīng)的人員圖像是正確關(guān)聯(lián)的,進(jìn)而利用face_recognition進(jìn)行人臉編碼和保存。因此后端代碼需要實(shí)現(xiàn)以下功能。(1)提供/user接口,用于查詢?nèi)藛T信息,并渲染給前端模板界面。前端在提交人臉圖像時(shí),同時(shí)提交userid的信息,后臺(tái)可以正確保存對(duì)應(yīng)人員的人臉編碼。(2)提供/face/add接口,用于獲取前端提交的userid和人臉圖像,編碼后將其保存到數(shù)據(jù)表中。(3)創(chuàng)建SQLModel數(shù)據(jù)映射關(guān)系,用于關(guān)聯(lián)對(duì)應(yīng)的3張表,以在接口代碼中實(shí)現(xiàn)數(shù)據(jù)的查詢或新增等操作。實(shí)現(xiàn)新增人臉數(shù)據(jù)功能首先,實(shí)現(xiàn)數(shù)據(jù)表的映射關(guān)系,代碼如下。實(shí)現(xiàn)新增人臉數(shù)據(jù)功能其次,編寫(xiě)/user接口代碼,該接口用于渲染前端模板界面,列出所有人員信息。同時(shí),該接口實(shí)現(xiàn)了Users和Faces兩張表的連接查詢,用于確認(rèn)哪些人員還沒(méi)有上傳人臉數(shù)據(jù)。此處使用LeftJoin(左外連接),將Users作為左表,F(xiàn)aces作為右表。左表Users會(huì)顯示所有數(shù)據(jù),而右表中如果未匹配到userid,則顯示為空,說(shuō)明未上傳人臉數(shù)據(jù)。這樣即可在前端界面中清楚地知道哪些人員需要上傳人臉圖像,哪些人員不需要上傳人臉圖像。具體實(shí)現(xiàn)代碼如下。實(shí)現(xiàn)新增人臉數(shù)據(jù)功能上述/user接口只是將人員信息渲染出來(lái),未實(shí)現(xiàn)人臉編碼信息的存儲(chǔ),所以需要使用/face/add接口將人臉編碼信息保存到數(shù)據(jù)表中,同時(shí),如果前端提交的圖像未包含有效的人臉信息,則需要提示用戶,具體代碼如下。實(shí)現(xiàn)新增人臉數(shù)據(jù)功能前端代碼實(shí)現(xiàn)前端模板界面需要填充所有用戶信息,同時(shí),為了將人臉圖像與userid關(guān)聯(lián)起來(lái),以便后端將人臉編碼關(guān)聯(lián)到正確的userid上,需要對(duì)文件上傳框進(jìn)行特殊處理。此處的處理方案是為每一條人員信息生成一個(gè)隱藏的文件上傳框,通過(guò)按鈕來(lái)觸發(fā)文件上傳、瀏覽功能,并根據(jù)元素的相對(duì)層級(jí)定位來(lái)進(jìn)行元素操作。實(shí)現(xiàn)新增人臉數(shù)據(jù)功能前端代碼實(shí)現(xiàn)最后,完成前后端功能對(duì)接和調(diào)試。前端代碼運(yùn)行結(jié)果如圖6-5所示。實(shí)現(xiàn)人臉考勤功能整體實(shí)現(xiàn)思路可以分為以下4個(gè)步驟。(1)從Faces表中查詢所有人臉的編碼信息,并將其從字符串類型轉(zhuǎn)換為Python列表類型。(2)利用OpenCV打開(kāi)攝像頭,實(shí)時(shí)采集人臉數(shù)據(jù),并根據(jù)采集到的人臉信息與已知的人臉編碼列表進(jìn)行對(duì)比。(3)如果人臉對(duì)比成功,則記錄一條考勤信息到Checks表中,如果是當(dāng)天的第一條考勤數(shù)據(jù),則同時(shí)記錄到checkdate列和checkstart列,否則記錄到checkend列。(4)如果人臉對(duì)比成功,則通過(guò)語(yǔ)音進(jìn)行提示,告知用戶打卡成功,無(wú)須繼續(xù)采集人臉數(shù)據(jù)。同時(shí),代碼需要進(jìn)行限制,如10分鐘內(nèi)不允許進(jìn)行第2次打卡。該限制方案可以通過(guò)查詢數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)。實(shí)現(xiàn)人臉考勤功能以下代碼演示了如何進(jìn)行考勤并記錄考勤數(shù)據(jù),文件名為pycheckin.py實(shí)現(xiàn)Web端考勤數(shù)據(jù)查詢功能實(shí)現(xiàn)兩個(gè)接口,一個(gè)接口為/check/month,用于渲染默認(rèn)的當(dāng)月考勤記錄數(shù)據(jù);另一個(gè)接口為/check/query,用于在前端通過(guò)設(shè)置查詢條件(如姓名、部門(mén)、性別或日期)來(lái)實(shí)現(xiàn)對(duì)考勤記錄的查詢。以下代碼用于實(shí)現(xiàn)后端的查詢。實(shí)現(xiàn)Web端考勤數(shù)據(jù)查詢功能前端界面的布局和代碼如下。實(shí)現(xiàn)Web端考勤數(shù)據(jù)查詢功能前端界面的布局和代碼如下。Web端版本實(shí)現(xiàn)03前端采集攝像頭數(shù)據(jù)攝像頭視頻的實(shí)時(shí)渲染可以使用HTML的video元素來(lái)完成,但是video元素并不能直接實(shí)現(xiàn)截圖。要實(shí)現(xiàn)視頻截圖,還需要使用canvas元素。canvas元素是HTML中繪制復(fù)雜圖像的元素,其核心是繪圖功能。一些HTML游戲也可以使用canvas實(shí)現(xiàn)。具體實(shí)現(xiàn)方案是當(dāng)單擊“截圖”按鈕時(shí),動(dòng)態(tài)生成一個(gè)canvas元素,先將視頻幀渲染到canvas中,再將canvas數(shù)據(jù)轉(zhuǎn)換為圖像數(shù)據(jù)。下述代碼演示了其具體實(shí)現(xiàn)。前端采集攝像頭數(shù)據(jù)以下代碼用于列出所有攝像頭設(shè)備的deviceId,在請(qǐng)求權(quán)限時(shí)指定該設(shè)備即可?;赪ebSocket進(jìn)行實(shí)時(shí)檢測(cè)首先,開(kāi)發(fā)Python端的WebSocket服務(wù)器,用于接收前端實(shí)時(shí)傳輸過(guò)來(lái)的視頻截圖,并進(jìn)行人臉檢測(cè),檢測(cè)到人臉后將人臉位置回傳給前端,代碼如下。基于WebSocket進(jìn)行實(shí)時(shí)檢測(cè)其次,開(kāi)發(fā)前端界面用于實(shí)時(shí)截取攝像頭圖像,并傳輸給WebSocket服務(wù)器,WebSocket服務(wù)器將識(shí)別到的人臉位置回傳給前端,前端再動(dòng)態(tài)增加1個(gè)或多個(gè)DIV(由人臉的數(shù)量決定),并根據(jù)攝像頭video元素相對(duì)于當(dāng)前界面的位置(offsetWidth或offsetHeight)配合后端回傳的人臉位置進(jìn)行運(yùn)算,將DIV繪制在對(duì)應(yīng)的人臉位置上,該DIV必須使用固定定位才能準(zhǔn)確地定位人臉位置。同時(shí),為了體現(xiàn)人臉識(shí)別的實(shí)時(shí)性,前端代碼將不再使用“截圖”按鈕手動(dòng)操作,而是使用setInterval()函數(shù)進(jìn)行定時(shí)任務(wù)調(diào)用,這樣用戶可以體驗(yàn)到更好的實(shí)時(shí)性效果。具體代碼如下。基于WebSocket進(jìn)行實(shí)時(shí)檢測(cè)基于前端界面進(jìn)行考勤首先,優(yōu)化WebSocket端代碼,加入考勤功能,代碼如下?;谇岸私缑孢M(jìn)行考勤其次,修改前端代碼,對(duì)單張人臉的位置信息進(jìn)行檢測(cè),并對(duì)打卡成功或重復(fù)打卡的響應(yīng)內(nèi)容進(jìn)行檢測(cè),同時(shí)語(yǔ)音播放考勤結(jié)果。打卡成功并顯示考勤記錄為了更加直觀地讓用戶看到考勤數(shù)據(jù),可以在視頻下方添加一個(gè)表格,將當(dāng)天的考勤數(shù)據(jù)實(shí)時(shí)添加到表格中,并使數(shù)據(jù)倒序排列,讓最后一條考勤記錄顯示在最上方?;铙w檢測(cè)防作弊04人臉68個(gè)關(guān)鍵特征點(diǎn)通過(guò)神經(jīng)網(wǎng)絡(luò)模型識(shí)別人臉的68個(gè)關(guān)鍵特征點(diǎn),進(jìn)而計(jì)算距離或比例來(lái)得到結(jié)果。使用face_recognition庫(kù)可以準(zhǔn)確標(biāo)注出這68個(gè)點(diǎn)位的像素坐標(biāo)。人臉68個(gè)關(guān)鍵特征點(diǎn)face_recognition庫(kù)的face_landmarks()函數(shù)可以識(shí)別并標(biāo)記出人臉中對(duì)應(yīng)的68個(gè)點(diǎn)的坐標(biāo),并返回一個(gè)“列表+字典”對(duì)象,其中包括不同部位的坐標(biāo)數(shù)據(jù)。例如,以下數(shù)據(jù)就是一張人臉的68個(gè)關(guān)鍵特征點(diǎn)的坐標(biāo)信息,其中每一個(gè)元組中的數(shù)據(jù)代表對(duì)應(yīng)的(x,y)坐標(biāo)。人臉68個(gè)關(guān)鍵特征點(diǎn)上面的數(shù)據(jù)一共包含9種類型的坐標(biāo)信息,對(duì)應(yīng)的特征部位及下標(biāo)如下。人臉68個(gè)關(guān)鍵特征點(diǎn)基于特征點(diǎn)定位,以下代碼繪制了人臉上眼睛和嘴巴的特征點(diǎn)位連接起來(lái)的線條。指令動(dòng)作檢測(cè)原理下面列舉4個(gè)常用的動(dòng)作檢測(cè)算法。(1)眨眼。因?yàn)槊恐谎劬τ?個(gè)坐標(biāo)點(diǎn)構(gòu)成,眨眼動(dòng)作通常由兩只眼睛同步完成,所以只需要計(jì)算眼睛的高度與寬度之間的比例便可以確定是睜眼還

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論