手把手搭建人脸识别考勤系统
重磅干货,第一时间送达
人脸识别的实际应用
寻找失踪人员 零售犯罪 安全标识 识别社交媒体上的帐户 考勤系统 识别汽车中的驾驶员
传统人脸识别算法:
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
**人脸检测:**定位人脸并在人脸周围绘制边界框并保留边界框的坐标。 **人脸对齐:**标准化人脸以与训练数据库一致。 **特征提取:**提取将用于训练和识别任务的人脸特征。 人脸识别: 将人脸与准备好的数据库中的一张或多张已知人脸进行匹配。
构建人脸识别系统的步骤
安装库
# installing dlib
pip install dlib
# installing face recognition
pip install face recognition
# installing opencv
pip install opencv
注意:如果你在安装dlib 时遇到任何错误 **,**我建议你使用vs_code 社区版安装 C++ 开发工具包: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))
构建人脸识别系统
导入必要的库
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格式。
现在创建一个列表来存储 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}')
阅读网络摄像头进行实时识别
# 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
仅将识别部分的图像大小调整为 1/4。输出帧将是原始大小。 调整大小可提高每秒帧数。 face_recognition.face_locations()在调整大小的图像(imgS)上被调用。对于人脸边界框坐标必须乘以 4 才能覆盖在输出帧上。 **face_recognition.distance()**返回测试图像的距离数组,其中包含我们训练目录中存在的所有图像。 最小人脸距离的索引将是匹配的人脸。 找到匹配的名称后,我们调用markAttendance函数。 使用**cv2.rectangle()**绘制边界框。 我们使用**cv2.putText()**将匹配的名称放在输出帧上。
考勤报告
人脸识别系统面临的挑战
**照明:**它极大地改变了面部外观,观察到照明条件的轻微变化对其结果产生重大影响。 **姿势:**面部识别系统对姿势高度敏感,如果数据库仅在正面视图上进行训练,可能会导致识别错误或无法识别。 面部表情:同一个人的不同表情是另一个需要考虑的重要因素。不过,现代识别器可以轻松处理它。 低分辨率:识别器的训练必须在分辨率好的图片上进行,否则模型将无法提取特征。 **老化:**随着年龄的增长,人脸的形状、线条、纹理变化是另一个挑战。
结论
交流群
欢迎加入公众号读者群一起和同行交流,目前有美颜、三维视觉、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群
个人微信(如果没有备注不拉群!) 请注明:地区+学校/企业+研究方向+昵称
下载1:何恺明顶会分享
在「AI算法与图像处理」公众号后台回复:何恺明,即可下载。总共有6份PDF,涉及 ResNet、Mask RCNN等经典工作的总结分析
下载2:终身受益的编程指南:Google编程风格指南
在「AI算法与图像处理」公众号后台回复:c++,即可下载。历经十年考验,最权威的编程规范!
下载3 CVPR2021 在「AI算法与图像处理」公众号后台回复:CVPR,即可下载1467篇CVPR 2020论文 和 CVPR 2021 最新论文
评论