基于Python搭建人脸识别考勤系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Python搭建⼈脸识别考勤系统
⽬录
介绍
⼈脸识别的实际应⽤
构建⼈脸识别系统的步骤
安装库
导⼊库
加载图像
查找⼈脸位置并绘制边界框
为⼈脸识别训练图像
构建⼈脸识别系统
⼈脸识别系统⾯临的挑战
结论
介绍
在本⽂中,你将学习如何使⽤ Python 构建⼈脸识别系统。
⼈脸识别⽐⼈脸检测更进⼀步。
在⼈脸检测中,我们只检测⼈脸在图像中的位置,但在⼈脸识别中,我们制作了⼀个可以识别⼈的系统。
“⼈脸识别是验证或识别图⽚或视频中的⼈的挑战。
⼤型科技巨头仍在努⼒打造更快、更准确的⼈脸识别模型。
”
⼈脸识别的实际应⽤
⼈脸识别⽬前正被⽤于让世界更安全、更智能、更⽅便。
有⼏个⽤例:
寻找失踪⼈员
零售犯罪
安全标识
识别社交媒体上的帐户
考勤系统
识别汽车中的驾驶员
根据性能和复杂性,有多种⽅法可以执⾏⾯部识别。
传统⼈脸识别算法:
在 1990 年代,整体⽅法被⽤于⼈脸识别。
⼿⼯制作的局部描述符在 1920 年代初期开始流⾏,然后在 2000 年代后期采⽤局部特征学习⽅法。
⽬前⼴泛使⽤并在OpenCV中实现的算法如下:
Eigenfaces (1991)
Local Binary Patterns Histograms (LBPH) (1996)
Fisherfaces(1997)
Scale Invariant Feature Transform (SIFT) (1999)
Speed Up Robust Features (SURF)(2006)
每种⽅法都遵循不同的⽅法来提取图像信息并将其与输⼊图像进⾏匹配。
Fischer-faces和Eigenfaces与 SURF 和 SIFT 具有⼏乎相似的⽅法。
LBPH 是⼀种简单但⾮常有效的⽅法,但与现代⼈脸识别器相⽐,速度较慢。
与现代⼈脸识别算法相⽐,这些算法并不快。
传统算法不能仅通过拍摄⼀个⼈的单张照⽚来训练。
⼈脸识别深度学习:
⼀些⼴泛使⽤的基于深度学习的⼈脸识别系统如下:
DeepFace
DeepID series of systems
VGGFace
FaceNet
⼈脸识别器⼀般是在⼈脸图像中找出重要的点,如嘴⾓、眉⽑、眼睛、⿐⼦、嘴唇等。
这些点的坐标称为五官点,这样的点有66个。
这样,寻找特征点的不同技术给出不同的结果。
⼈脸识别模型涉及的步骤:
1.⼈脸检测:定位⼈脸并在⼈脸周围绘制边界框并保留边界框的坐标。
2.⼈脸对齐:标准化⼈脸以与训练数据库⼀致。
3.特征提取:提取将⽤于训练和识别任务的⼈脸特征。
4.⼈脸识别:将⼈脸与准备好的数据库中的⼀张或多张已知⼈脸进⾏匹配。
在传统的⼈脸识别⽅法中,我们有单独的模块来执⾏这 4 个步骤。
在本⽂中,你将看到⼀个将这 4 个步骤组合在⼀个步骤中的库。
构建⼈脸识别系统的步骤
安装库
我们需要安装 2 个库来实现⼈脸识别。
dlib : dlib是⼀个现代 C++ ⼯具包,包含机器学习算法和⼯具,⽤于在 C++ 中创建复杂的软件以解决实际问题。
# installing dlib
pip install dlib
脸部识别:将face_recognition库,创建和维护,包含了dlib⼈脸识别功能。
# installing face recognition
pip install face recognition
Opencv ⽤于⼀些图像预处理。
# installing opencv
pip install opencv
导⼊库
现在你已经下载了所有重要的库,让我们导⼊它们来构建系统。
import cv2
import numpy as np
import face_recognition
加载图像
导⼊库后,你需要加载图像。
face_recognition 库以 BGR 的形式加载图像,为了打印图像,你应该使⽤ OpenCV 将其转换为 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。
查找⼈脸位置并绘制边界框
你需要在⼈脸周围绘制⼀个边界框,以显⽰是否已检测到⼈脸。
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_pare_faces([train_encode],test_encode))
face_pare_faces,如果两个图像中的⼈相同,返回True,否则返回False。
构建⼈脸识别系统
导⼊必要的库
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格式。
例如:
正如你在我的 student_images 路径中看到的,有 6 个⼈。
因此我们的模型只能识别这 6 个⼈。
你可以在此⽬录中添加更多图⽚,以便更多⼈识别
现在创建⼀个列表来存储 person_name 和图像数组。
遍历path⽬录中存在的所有图像⽂件,读取图像,并将图像数组附加到图像列表,并将⽂件名附加到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])
创建⼀个函数来对所有训练图像进⾏编码并将它们存储在⼀个变量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)
创建⼀个函数,该函数将创建⼀个Attendance.csv⽂件来存储考勤时间。
注意:这⾥需要⼿动创建Attendance.csv⽂件并在函数中给出路径
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}')
我们⾸先检查出席者的名字是否已经在attenting .csv中可⽤。
如果出席者的名字在attends.csv中不可⽤,我们将在函数调⽤的时间中写⼊出席者的名字。
阅读⽹络摄像头进⾏实时识别
# 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_pare_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
仅将识别部分的图像⼤⼩调整为 1/4。
输出帧将是原始⼤⼩。
调整⼤⼩可提⾼每秒帧数。
face_recognition.face_locations()在调整⼤⼩的图像(imgS)上被调⽤。
对于⼈脸边界框坐标必须乘以 4 才能覆盖在输出帧上。
**face_recognition.distance()**返回测试图像的距离数组,其中包含我们训练⽬录中存在的所有图像。
最⼩⼈脸距离的索引将是匹配的⼈脸。
找到匹配的名称后,我们调⽤markAttendance函数。
使⽤**cv2.rectangle()**绘制边界框。
我们使⽤**cv2.putText()**将匹配的名称放在输出帧上。
考勤报告
⼈脸识别系统⾯临的挑战
尽管构建⾯部识别看起来很容易,但在没有任何限制的情况下拍摄的现实世界图像中却并不容易。
⾯部识别系统⾯临的⼏个挑战如下:
**照明:**它极⼤地改变了⾯部外观,观察到照明条件的轻微变化对其结果产⽣重⼤影响。
**姿势:**⾯部识别系统对姿势⾼度敏感,如果数据库仅在正⾯视图上进⾏训练,可能会导致识别错误或⽆法识别。
⾯部表情:同⼀个⼈的不同表情是另⼀个需要考虑的重要因素。
不过,现代识别器可以轻松处理它。
低分辨率:识别器的训练必须在分辨率好的图⽚上进⾏,否则模型将⽆法提取特征。
**⽼化:**随着年龄的增长,⼈脸的形状、线条、纹理变化是另⼀个挑战。
结论
在本⽂中,我们讨论了如何使⽤face_recognition库创建⼈脸识别系统并制作了考勤系统。
你可以使⽤Tkinter或Pyqt进⼀步设计⽤于⼈脸识别考勤系统的GUI。
以上就是基于Python搭建⼈脸识别考勤系统的详细内容,更多关于Python⼈脸识别考勤系统的资料请关注其它相关⽂章!。