Python搭建人臉識(shí)別考勤系統(tǒng)
介紹
在本文中,你將學(xué)習(xí)如何使用 Python 構(gòu)建人臉識(shí)別系統(tǒng)。人臉識(shí)別比人臉檢測更進(jìn)一步。在人臉檢測中,我們只檢測人臉在圖像中的位置,但在人臉識(shí)別中,我們制作了一個(gè)可以識(shí)別人的系統(tǒng)。
“人臉識(shí)別是驗(yàn)證或識(shí)別圖片或視頻中的人的挑戰(zhàn)。大型科技巨頭仍在努力打造更快、更準(zhǔn)確的人臉識(shí)別模型。”
人臉識(shí)別的實(shí)際應(yīng)用
人臉識(shí)別目前正被用于讓世界更安全、更智能、更方便。
有幾個(gè)用例:
· 尋找失蹤人員
· 零售犯罪
· 安全標(biāo)識(shí)
· 識(shí)別社交媒體上的帳戶
· 考勤系統(tǒng)
· 識(shí)別汽車中的駕駛員
根據(jù)性能和復(fù)雜性,有多種方法可以執(zhí)行面部識(shí)別。
傳統(tǒng)人臉識(shí)別算法:
在 1990 年代,整體方法被用于人臉識(shí)別。手工制作的局部描述符在 1920 年代初期開始流行,然后在 2000 年代后期采用局部特征學(xué)習(xí)方法。目前廣泛使用并在OpenCV中實(shí)現(xiàn)的算法如下:
每種方法都遵循不同的方法來提取圖像信息并將其與輸入圖像進(jìn)行匹配。Fischer-faces和Eigenfaces與 SURF 和 SIFT 具有幾乎相似的方法。LBPH 是一種簡單但非常有效的方法,但與現(xiàn)代人臉識(shí)別器相比,速度較慢。與現(xiàn)代人臉識(shí)別算法相比,這些算法并不快。傳統(tǒng)算法不能僅通過拍攝一個(gè)人的單張照片來訓(xùn)練。
人臉識(shí)別深度學(xué)習(xí):
一些廣泛使用的基于深度學(xué)習(xí)的人臉識(shí)別系統(tǒng)如下:DeepFaceDeepID series of systemsVGGFaceFaceNet人臉識(shí)別器一般是在人臉圖像中找出重要的點(diǎn),如嘴角、眉毛、眼睛、鼻子、嘴唇等。這些點(diǎn)的坐標(biāo)稱為五官點(diǎn),這樣的點(diǎn)有66個(gè)。這樣,尋找特征點(diǎn)的不同技術(shù)給出不同的結(jié)果。
人臉識(shí)別模型涉及的步驟:
1.**人臉檢測:**定位人臉并在人臉周圍繪制邊界框并保留邊界框的坐標(biāo)。
2.**人臉對齊:**標(biāo)準(zhǔn)化人臉以與訓(xùn)練數(shù)據(jù)庫一致。
3.**特征提。海崛⒂糜谟(xùn)練和識(shí)別任務(wù)的人臉特征。
4.人臉識(shí)別: 將人臉與準(zhǔn)備好的數(shù)據(jù)庫中的一張或多張已知人臉進(jìn)行匹配。在傳統(tǒng)的人臉識(shí)別方法中,我們有單獨(dú)的模塊來執(zhí)行這 4 個(gè)步驟。在本文中,你將看到一個(gè)將這 4 個(gè)步驟組合在一個(gè)步驟中的庫。
構(gòu)建人臉識(shí)別系統(tǒng)的步驟
安裝庫
我們需要安裝 2 個(gè)庫來實(shí)現(xiàn)人臉識(shí)別。
dlib : dlib是一個(gè)現(xiàn)代 C++ 工具包,包含機(jī)器學(xué)習(xí)算法和工具,用于在 C++ 中創(chuàng)建復(fù)雜的軟件以解決實(shí)際問題。
# installing dlib
pip install dlib
臉部識(shí)別:將face_recognition庫,創(chuàng)建和維護(hù) Adam Geitgey(https://adamgeitgey.com/),包含了dlib人臉識(shí)別功能。
# installing face recognition
pip install face recognition
Opencv 用于一些圖像預(yù)處理。
# installing opencv
pip install opencv
注意:如果你在安裝dlib 時(shí)遇到任何錯(cuò)誤 **,**我建議你使用vs_code 社區(qū)版安裝 C++ 開發(fā)工具包
導(dǎo)入庫
現(xiàn)在你已經(jīng)下載了所有重要的庫,讓我們導(dǎo)入它們來構(gòu)建系統(tǒng)。
import cv2
import numpy as np
import face_recognition
加載圖像
導(dǎo)入庫后,你需要加載圖像。
face_recognition 庫以 BGR 的形式加載圖像,為了打印圖像,你應(yīng)該使用 OpenCV 將其轉(zhuǎn)換為 RGB。
imgelon_bgr = face_recognition.load_image_file('elon.jpg')
imgelon_rgb = cv2.cvtColor(imgelon_bgr,cv2.COLOR_BGR2RGB)
cv2.imshow('bgr', imgelon_bgr)
cv2.imshow('rgb', imgelon_rgb)
cv2.waitKey(0)
如你所見,RGB 看起來很自然,因此你將始終把通道更改為 RGB。
查找人臉位置并繪制邊界框
你需要在人臉周圍繪制一個(gè)邊界框,以顯示是否已檢測到人臉。
imgelon =face_recognition.load_image_file('elon.jpg')
imgelon = cv2.cvtColor(imgelon,cv2.COLOR_BGR2RGB)
#----------Finding face Location for drawing bounding boxes-------
face = face_recognition.face_locations(imgelon_rgb)[0]
copy = imgelon.copy()
#-------------------Drawing the Rectangle-------------------------
cv2.rectangle(copy, (face[3], face[0]),(face[1], face[2]), (255,0,255), 2)
cv2.imshow('copy', copy)
cv2.imshow('elon',imgelon)
cv2.waitKey(0)
為人臉識(shí)別訓(xùn)練圖像
該庫的制作方式是自動(dòng)查找人臉并僅處理人臉,因此你無需從圖片中裁剪人臉。
訓(xùn)練:
在這個(gè)階段,我們將訓(xùn)練圖像轉(zhuǎn)換為一些編碼,并使用該圖像的人名存儲(chǔ)編碼。
train_elon_encodings = face_recognition.face_encodings(imgelon)[0]
測試:
為了測試,我們加載圖像并將其轉(zhuǎn)換為編碼,然后在訓(xùn)練期間將編碼與存儲(chǔ)的編碼進(jìn)行匹配,這種匹配基于尋找最大相似度。當(dāng)你找到與測試圖像匹配的編碼時(shí),你將獲得與訓(xùn)練編碼相關(guān)聯(lián)的名稱。
# lets test an image
test = face_recognition.load_image_file('elon_2.jpg')
test = cv2.cvtColor(test, cv2.COLOR_BGR2RGB)
test_encode = face_recognition.face_encodings(test)[0]
print(face_recognition.compare_faces([train_encode],test_encode))
face_recognition.compare_faces,如果兩個(gè)圖像中的人相同,返回True,否則返回False。
構(gòu)建人臉識(shí)別系統(tǒng)
導(dǎo)入必要的庫
import cv2
import face_recognition
import os
import numpy as np
from datetime import datetime
import pickle
定義將存儲(chǔ)訓(xùn)練圖像數(shù)據(jù)集的文件夾路徑
path = 'student_images'
注意:對于訓(xùn)練,我們只需要將訓(xùn)練圖片放到path目錄下,圖片名稱必須是person_name.jpg/jpeg格式。
例如:
正如你在我的 student_images 路徑中到的,有 6 個(gè)人。因此我們的模型只能識(shí)別這 6 個(gè)人。你可以在此目錄中添加更多圖片,以便更多人識(shí)別
現(xiàn)在創(chuàng)建一個(gè)列表來存儲(chǔ) person_name 和圖像數(shù)組。
遍歷path目錄中存在的所有圖像文件,讀取圖像,并將圖像數(shù)組附加到圖像列表,并將文件名附加到classNames。
創(chuàng)建一個(gè)函數(shù)來對所有訓(xùn)練圖像進(jìn)行編碼并將它們存儲(chǔ)在一個(gè)變量encoding_face_train 中。
創(chuàng)建一個(gè)函數(shù),該函數(shù)將創(chuàng)建一個(gè)Attendance.csv文件來存儲(chǔ)考勤時(shí)間。
注意:這里需要手動(dòng)創(chuàng)建Attendance.csv文件并在函數(shù)中給出路徑
**with open(“filename.csv”,'r+')創(chuàng)建一個(gè)文件,'r+'**模式用于打開文件進(jìn)行讀寫。
我們首先檢查出席者的名字是否已經(jīng)在attenting .csv中可用。
如果出席者的名字在attends.csv中不可用,我們將在函數(shù)調(diào)用的時(shí)間中寫入出席者的名字。
閱讀網(wǎng)絡(luò)攝像頭進(jìn)行實(shí)時(shí)識(shí)別
# take pictures from webcam
cap = cv2.VideoCapture(0)while True:
success, img = cap.read()
imgS = cv2.resize(img, (0,0), None, 0.25,0.25)
imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
faces_in_frame = face_recognition.face_locations(imgS)
encoded_faces = face_recognition.face_encodings(imgS, faces_in_frame)for encode_face, faceloc in zip(encoded_faces,faces_in_frame):
matches = face_recognition.compare_faces(encoded_face_train, encode_face)
faceDist = face_recognition.face_distance(encoded_face_train, encode_face)
matchIndex = np.a(chǎn)rgmin(faceDist)
print(matchIndex)
if matches[matchIndex]:
name = classNames[matchIndex].upper().lower()
y1,x2,y2,x1 = faceloc
# since we scaled down by 4 times
y1, x2,y2,x1 = y1*4,x2*4,y2*4,x1*4
cv2.rectangle(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.rectangle(img, (x1,y2-35),(x2,y2), (0,255,0), cv2.FILLED)
cv2.putText(img,name, (x1+6,y2-5), cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),2)
markAttendance(name)
cv2.imshow('webcam', img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
僅將識(shí)別部分的圖像大小調(diào)整為 1/4。
輸出幀將是原始大小。調(diào)整大小可提高每秒幀數(shù)。
face_recognition.face_locations()在調(diào)整大小的圖像(imgS)上被調(diào)用。對于人臉邊界框坐標(biāo)必須乘以 4 才能覆蓋在輸出幀上。
**face_recognition.distance()**返回測試圖像的距離數(shù)組,其中包含我們訓(xùn)練目錄中存在的所有圖像。
最小人臉距離的索引將是匹配的人臉。
找到匹配的名稱后,我們調(diào)用markAttendance函數(shù)。
使用**cv2.rectangle()**繪制邊界框。
我們使用**cv2.putText()**將匹配的名稱放在輸出幀上。
考勤報(bào)告
人臉識(shí)別系統(tǒng)面臨的挑戰(zhàn)
盡管構(gòu)建面部識(shí)別看起來很容易,但在沒有任何限制的情況下拍攝的現(xiàn)實(shí)世界圖像中卻并不容易。面部識(shí)別系統(tǒng)面臨的幾個(gè)挑戰(zhàn)如下:
**照明:**它極大地改變了面部外觀,觀察到照明條件的輕微變化對其結(jié)果產(chǎn)生重大影響。
**姿勢:**面部識(shí)別系統(tǒng)對姿勢高度敏感,如果數(shù)據(jù)庫僅在正面視圖上進(jìn)行訓(xùn)練,可能會(huì)導(dǎo)致識(shí)別錯(cuò)誤或無法識(shí)別。
面部表情:同一個(gè)人的不同表情是另一個(gè)需要考慮的重要因素。不過,現(xiàn)代識(shí)別器可以輕松處理它。
低分辨率:識(shí)別器的訓(xùn)練必須在分辨率好的圖片上進(jìn)行,否則模型將無法提取特征。
**老化:**隨著年齡的增長,人臉的形狀、線條、紋理變化是另一個(gè)挑戰(zhàn)。
結(jié)論
在本文中,我們討論了如何使用face_recognition庫創(chuàng)建人臉識(shí)別系統(tǒng)并制作了考勤系統(tǒng)。你可以使用Tkinter或Pyqt進(jìn)一步設(shè)計(jì)用于人臉識(shí)別考勤系統(tǒng)的GUI。
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
最新活動(dòng)更多
-
即日-10.29立即報(bào)名>> 2024德州儀器嵌入式技術(shù)創(chuàng)新發(fā)展研討會(huì)
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場仿真助跑新能源汽車
-
11月14日立即報(bào)名>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國智造CIO在線峰會(huì)
推薦專題
- 1 Intel宣布40年來最重大轉(zhuǎn)型:年底前裁員15000人、拋掉2/3房產(chǎn)
- 2 因美封殺TikTok,字節(jié)股價(jià)骨折!估值僅Meta1/5
- 3 宏山激光重磅發(fā)布行業(yè)解決方案,助力智能制造產(chǎn)業(yè)新飛躍
- 4 國產(chǎn)AI芯片公司破產(chǎn)!白菜價(jià)拍賣
- 5 具身智能火了,但規(guī)模落地還需時(shí)間
- 6 國產(chǎn)英偉達(dá)們,抓緊沖刺A股
- 7 三次錯(cuò)失風(fēng)口!OpenAI前員工殺回AI編程賽道,老東家捧金相助
- 8 英特爾賦能智慧醫(yī)療,共創(chuàng)數(shù)字化未來
- 9 英偉達(dá)的麻煩在后頭?
- 10 將“網(wǎng)紅”變成“商品”,AI“爆改”實(shí)力拉滿
- 高級軟件工程師 廣東省/深圳市
- 自動(dòng)化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市