手把手搭建人臉識別考勤系統(tǒng)
重磅干貨,第一時間送達
人臉識別的實際應用
尋找失蹤人員 零售犯罪 安全標識 識別社交媒體上的帳戶 考勤系統(tǒng) 識別汽車中的駕駛員
傳統(tǒng)人臉識別算法:
Eigenfaces (1991):http://www.scholarpedia.org/article/Eigenfaces Local Binary Patterns Histograms (LBPH) (1996):https://en.wikipedia.org/wiki/Local_binary_patterns Fisherfaces(1997):http://www.scholarpedia.org/article/Fisherfaces Scale Invariant Feature Transform (SIFT) (1999):https://en.wikipedia.org/wiki/Scale-invariant_feature_transform Speed Up Robust Features (SURF)(2006):https://en.wikipedia.org/wiki/Speeded_up_robust_features
人臉識別深度學習:
DeepFace DeepID series of systems VGGFace FaceNet

**人臉檢測:**定位人臉并在人臉周圍繪制邊界框并保留邊界框的坐標。 **人臉對齊:**標準化人臉以與訓練數(shù)據(jù)庫一致。 **特征提取:**提取將用于訓練和識別任務的人臉特征。 人臉識別: 將人臉與準備好的數(shù)據(jù)庫中的一張或多張已知人臉進行匹配。
構建人臉識別系統(tǒng)的步驟
安裝庫
#?installing?dlib?
pip?install?dlib
#?installing?face?recognition
pip?install?face?recognition
#?installing?opencv?
pip?install?opencv
注意:如果你在安裝dlib 時遇到任何錯誤 **,**我建議你使用vs_code 社區(qū)版安裝 C++ 開發(fā)工具包:https://visualstudio.microsoft.com/vs/community/
導入庫
import?cv2
import?numpy?as?np
import?face_recognition
加載圖像
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)

查找人臉位置并繪制邊界框
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)

為人臉識別訓練圖像
train_elon_encodings?=?face_recognition.face_encodings(imgelon)[0]
#?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))
構建人臉識別系統(tǒng)
導入必要的庫
import?cv2
import?face_recognition
import?os
import?numpy?as?np
from?datetime?import?datetime
import?pickle
path?=?'student_images'
注意:對于訓練,我們只需要將訓練圖片放到path目錄下,圖片名稱必須是person_name.jpg/jpeg格式。

現(xiàn)在創(chuàng)建一個列表來存儲 person_name 和圖像數(shù)組。 遍歷path目錄中存在的所有圖像文件,讀取圖像,并將圖像數(shù)組附加到圖像列表,并將文件名附加到classNames。
images?=?[]
classNames?=?[]mylist?=?os.listdir(path)
for?cl?in?mylist:
????curImg?=?cv2.imread(f'{path}/{cl}')
????images.append(curImg)
????classNames.append(os.path.splitext(cl)[0])
創(chuàng)建一個函數(shù)來對所有訓練圖像進行編碼并將它們存儲在一個變量encoding_face_train 中。
def?findEncodings(images):
????encodeList?=?[]
????for?img?in?images:
????????img?=?cv2.cvtColor(img,?cv2.COLOR_BGR2RGB)
????????encoded_face?=?face_recognition.face_encodings(img)[0]
????????encodeList.append(encoded_face)
????return?encodeList
encoded_face_train?=?findEncodings(images)
創(chuàng)建一個函數(shù),該函數(shù)將創(chuàng)建一個Attendance.csv文件來存儲考勤時間。
注意:這里需要手動創(chuàng)建Attendance.csv文件并在函數(shù)中給出路徑
def?markAttendance(name):
????with?open('Attendance.csv','r+')?as?f:
????????myDataList?=?f.readlines()
????????nameList?=?[]
????????for?line?in?myDataList:
????????????entry?=?line.split(',')
????????????nameList.append(entry[0])
????????if?name?not?in?nameList:
????????????now?=?datetime.now()
????????????time?=?now.strftime('%I:%M:%S:%p')
????????????date?=?now.strftime('%d-%B-%Y')
????????????f.writelines(f'n{name},?{time},?{date}')
閱讀網(wǎng)絡攝像頭進行實時識別
#?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.argmin(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
僅將識別部分的圖像大小調(diào)整為 1/4。輸出幀將是原始大小。 調(diào)整大小可提高每秒幀數(shù)。 face_recognition.face_locations()在調(diào)整大小的圖像(imgS)上被調(diào)用。對于人臉邊界框坐標必須乘以 4 才能覆蓋在輸出幀上。 **face_recognition.distance()**返回測試圖像的距離數(shù)組,其中包含我們訓練目錄中存在的所有圖像。 最小人臉距離的索引將是匹配的人臉。 找到匹配的名稱后,我們調(diào)用markAttendance函數(shù)。 使用**cv2.rectangle()**繪制邊界框。 我們使用**cv2.putText()**將匹配的名稱放在輸出幀上。

考勤報告

人臉識別系統(tǒng)面臨的挑戰(zhàn)
**照明:**它極大地改變了面部外觀,觀察到照明條件的輕微變化對其結果產(chǎn)生重大影響。 **姿勢:**面部識別系統(tǒng)對姿勢高度敏感,如果數(shù)據(jù)庫僅在正面視圖上進行訓練,可能會導致識別錯誤或無法識別。 面部表情:同一個人的不同表情是另一個需要考慮的重要因素。不過,現(xiàn)代識別器可以輕松處理它。 低分辨率:識別器的訓練必須在分辨率好的圖片上進行,否則模型將無法提取特征。 **老化:**隨著年齡的增長,人臉的形狀、線條、紋理變化是另一個挑戰(zhàn)。
結論
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有美顏、三維視覺、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群
個人微信(如果沒有備注不拉群!) 請注明:地區(qū)+學校/企業(yè)+研究方向+昵稱
下載1:何愷明頂會分享
在「AI算法與圖像處理」公眾號后臺回復:何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結分析
下載2:終身受益的編程指南:Google編程風格指南
在「AI算法與圖像處理」公眾號后臺回復:c++,即可下載。歷經(jīng)十年考驗,最權威的編程規(guī)范!
下載3 CVPR2021 在「AI算法與圖像處理」公眾號后臺回復:CVPR,即可下載1467篇CVPR?2020論文 和 CVPR 2021 最新論文

評論
圖片
表情
