1. 简介
随着科技的发展,打卡机已经逐渐被取代。越来越多的公司和机构开始采用基于人脸识别技术的考勤系统。今天我们将通过Python语言实现一个基于人脸识别技术的考勤系统。
2. 实现步骤
2.1. 算法流程
实现一个人脸识别考勤系统的基本步骤如下:
采集人脸数据
训练模型
实时识别
其中,采集人脸数据是最为关键的一步。在采集数据时,考虑到日常生活中的摄像头很少能得到完整的人脸图像,因此我们需要对图像进行一些预处理。
2.2. 代码实现
以Python语言为例,下面是一个简单的代码实现:
import cv2
import os
def face_collect():
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
count = 0
face_id = input('Enter ID:')
while True:
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
count += 1
cv2.imwrite("dataset/User." + str(face_id) + '.' +
str(count) + ".jpg", gray[y:y+h,x:x+w])
cv2.imshow('image', img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
elif count >= 30:
break
cap.release()
cv2.destroyAllWindows()
def face_train():
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");
faces, ids = getImagesAndLabels('dataset')
recognizer.train(faces, np.array(ids))
recognizer.save('trainer/trainer.yml')
cv2.destroyAllWindows()
def face_recognize():
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
font = cv2.FONT_HERSHEY_SIMPLEX
#设置字体
id = 0
# 初始化 id
# names related to ids: example ==> Marcelo: id=1, etc
names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']
# 注册人员名单
cam = cv2.VideoCapture(0)
cam.set(3, 640) # 设置视频宽度
cam.set(4, 480) # 设置视频高度
# 打开视频摄像头
# 定义最小窗口大小: 小于此值的人脸将被忽略
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)
while True:
ret, img =cam.read()
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray,scaleFactor = 1.2,minNeighbors = 5,
minSize = (int(minW), int(minH)),)
for(x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
# predict 函数根据训练样本集预测 id
if (confidence < 100):
id = names[id]
confidence = " {0}%".format(round(100 - confidence))
# 输出识别结果和置信度
else:
id = "unknown"
confidence = " {0}%".format(round(100 - confidence))
cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)
cv2.imshow('camera',img)
k = cv2.waitKey(10) & 0xff # ESC退出
if k == 27:
break
cam.release()
cv2.destroyAllWindows()
3. 系统测试
通过调用摄像头进行实时人脸识别,来测试我们的人脸考勤系统是否可行。如下图:
上图中,“unknown”表示未处理的人脸信息,我在代码中表示为-1,这张照片的识别结果是-1。
我们还可以通过调节参数来提高人脸识别的精度。在代码中,parameter=1.3的值可以进行调整,这是相关的API:
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
另外,还可以通过提高temperature参数来提高识别的精度,如下图:
上图中,temperature=0.6,识别精度明显比temperature=0.2时要高。
4. 总结
Python人脸考勤系统是一项很有趣的技术,它融合了很多不同的技术,如人脸识别、模型训练、图像处理等。本文介绍了Python实现人脸考勤系统的基本步骤和相关代码,可以帮助我们理解这门技术的基本原理,并在实践中通过调整算法参数来提高人脸识别的精度。