python人脸考勤系统

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实现人脸考勤系统的基本步骤和相关代码,可以帮助我们理解这门技术的基本原理,并在实践中通过调整算法参数来提高人脸识别的精度。

后端开发标签