Python:人脸识别的课堂/班级考勤系统 基于opencv,python,pyqt5,mysql 开发。 该项目 配置好相应环境即可使用 (涉及隐私 部分内容已打码)可根据个人需求在该项目上进行功能添加与修改 主要功能: ① 人脸信息和学生信息采集/查询 ② 对新录入的人脸进行训练 ③ 考勤签到/请假/补签 ④ 生成当天考勤签到表 ⑤ 查看个人课程考勤情况 ⑥ 根据有无课程安排解锁考勤功能 ⑦ 教师登录验证解锁信息采集(已添加) ⑧ 班级考勤查询/课程考勤查询(已添加) ⑨ 活体检测功能(后续添加) ⑩ 信息添加功能,如: 课表添加,班级信息添加,个人信息添加(后续添加)

教室门口的人脸识别设备突然亮起绿灯:"同学你已迟到三分钟,本次考勤记为异常。"这个画面在计算机实验室里被我们复现了——用Python搞了个能自动识别班级考勤的系统,比传统点名有趣多了。

信息采集模块的GUI用PyQt5搭得像个专业软件。核心代码里藏着OpenCV的魔法:

def face_capture(self):
    face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    count = 0
    while True:
        ret, frame = self.cap.read()
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_detector.detectMultiScale(gray, 1.3, 5)
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
            count += 1
            cv2.imwrite("data/User." + str(self.id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])
        cv2.imshow('Capture', frame)
        if cv2.waitKey(1) & 0xff == 27 or count >= 300:
            break

这段代码像电子捕手,用Haar级联分类器在视频流里抓人脸。count控制采集数量,存到本地准备训练模型。有趣的是当画面里出现多人脸时,程序会疯狂保存所有检测到的人脸——得手动加个防误触机制。

训练环节用到了LBPH算法,代码简洁得不像实力派:

recognizer = cv2.face.LBPHFaceRecognizer_create()
faces, labels = prepare_training_data("data/")
recognizer.train(faces, np.array(labels))
recognizer.save("trainer.yml")

这里有个坑:训练集需要至少两个人脸数据才能运行,单用户训练会报错。解决方法是在data目录放两个以上用户文件夹,每个文件夹命名格式User.xx(xx是用户ID)。

考勤逻辑藏在数据库操作里。看这段MySQL交互代码:

def check_in(student_id):
    conn = mysql.connector.connect(host='localhost',user='root',password='123456',database='attendance')
    cursor = conn.cursor()
    current_time = datetime.now().strftime("%H:%M:%S")
    status = "正常" if datetime.now().hour < 8 else "迟到"
    sql = "INSERT INTO attendance_record VALUES (%s, %s, %s, %s)"
    cursor.execute(sql, (student_id, datetime.today().strftime("%Y-%m-%d"), current_time, status))
    conn.commit()

时间判断简单粗暴,实际部署需要结合课程表数据。有个学生试过把系统时间改成23:59成功骗过考勤,后来加上了NTP校时功能。

生成考勤报表时用了pandas的花式操作:

df = pd.read_sql("SELECT * FROM attendance_record WHERE date=%s", conn, params=(today,))
pivot_table = df.pivot_table(index='status', aggfunc='size')
plt.figure(figsize=(8,6))
pivot_table.plot.pie(autopct='%1.1f%%')
plt.savefig('daily_report.png')

饼图展示考勤状态分布,导出的图片自动插入到PyQt5的报表界面。有个隐藏bug:当所有学生全勤时饼图会消失,后来加了个if判断显示全勤提示。

项目中最酷的是活体检测的雏形(虽然还没完全实现):

face_landmarks = detector(gray, rects[0])
left_eye_ratio = eye_aspect_ratio(face_landmarks[36:42])
right_eye_ratio = eye_aspect_ratio(face_landmarks[42:48])
if left_eye_ratio < 0.2 and right_eye_ratio < 0.2:
    print("检测到闭眼动作")

用dlib的人脸关键点检测计算眼睛纵横比,防御照片攻击。实测发现戴眼镜的同学容易被误判,可能需要调整阈值参数。

现在这系统在实验室跑得挺欢,就是偶尔会把长得像的老师和学生搞混——看来特征提取算法还得优化。下一步想接入深度学习模型,不过得先解决显卡算力不足的问题,或许该试试轻量化的Mobilenet?

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐