基于OpenCV和Python的课堂考勤系统的设计与实现
2019-07-16邹锰
邹锰
摘要:随着计算机新技术的流行,人脸识别等新技术的应用范围越来越宽广。在学校招生规模的扩大的前提下,课堂上有效快速点名成了上课教师的新问题。该文采用OpenCV和Python构建人脸识别技术实现课堂快速考勤。
关键词:OpenCV;Python;人脸识别;课堂考勤
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2019)15-0066-02
1 问题的提出
近年来,我国学生人数呈现逐步上升的趋势。特别是在经济发达地区,由于外来务工人员人数非常多,很多地区的学校都招生爆满,每个班人数都在50人以上。对于任课老师来说,点名考勤成了不小的挑战。特别对于中职学校来说,实训课很多学生不一定按照指定的位置就座,因此点名时经常出现“张冠李戴”的情况。另一方面,在实训课上,教师需要操作计算机进行实操演示,这个过程中,有些学生不认真听讲,趴在桌面上睡觉。怎样快速准确统计出上课时不认真的学生,值得我们研究。
2 系统的构成
基于OpenCV和Python的课堂考勤系统其核心是利用基于OpenCV和Python实现人脸识别,通过对人脸的检测、识别及统计实现课堂考勤。使用到的硬件设备主要是高清摄像头加上一台计算机作为服务器。软件上我们采用OpenCV和Python来实现。系统的主要功能如下图1:
3 相关技术知识
OpenCV:
OpenCV是一个免费开源的跨平台计算机视觉库,可以运行多个操作系统上。它的应用领域非常广泛,在人机互动、图像分割、物体识别、动作识别、人脸识别、运动跟踪、运动分析、机器人等多个最新技术领域都有应用[1]。
Python:
Python是一种计算机程序设计语言。Python程序简单易懂功能强大,许多功能不必从零编写,直接使用现成的即可。许多大型网站就是用Python开发的,例如YouTube、豆瓣。Google、Yahoo ,美国航空航天局等都大量地使用Python[2]。
开发环境的搭建:
Python也可在多种平台开发运行,本文以WINDOWS系统作为开发平台。本文以Anaconda套件作为开发环境,它包括几百种常用的科学与数据分析套件。并内置Spyder及Jupyter Notebook编辑器。
首先到anaconda 官方网站下载对应win平台下的安装包:
https://www.anaconda.com/download/ 安装完anaconda,就相当于安装了Python、IPython、集成开发环境Spyder、一些包等等。
然后安装opencv,确定好Python版本,电脑64位或者32位。下载对应版本的文件。下载网址:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 。
安装后特别注意pip安装opencv_python-3.2.0-cp36-cp36m-win_amd64.whl以后,文件目录下没有 opencv/sources/data/haarcascades目录,找不到分类器的.xml。这时需要查看下你的opencv和Python版本。(本文为Python3.6+opencv 3.4),然后下载opencv win x64/x86对应版本,安装解压到硬盘上你指定的位置。解压你就会发现分类器的位置。这样我们就搭配好了OpenCV和Python的开发环境。
4 系统主要功能的实现
4.1 人脸的识别
课堂考勤系统开启后,第一步要使用摄像头对学生上课的图像进行采集,这里根据系统不同功能又分为静态图片和视频的图片抓取。图像采集后可以通过一些算法对图像进行优化,如降噪、平滑、直方图均衡化处理等以增强人脸特征。然后对采集的图像进行人脸检测和识别。人脸识别的算法非常复杂,国内比较专业的有科大讯飞、阿里云和百度等提供的人脸识别算法。本文利用 OpenCV 提供的函数和分类器进行人脸检测相對来说比较简单易实现。在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。使用已经训练好的XML格式的分类器进行人脸检测[3]。人脸检测完毕后再标识出面部位置为后面的脸部图形抓取做好准备。最后对图像中面部区域抓取并保存。如图2。
在OpenCV中,使用类“CascadeClassifier”进行人脸检测, PYTHON中创建CascadeClassifier对象
在Python脚本中创建名为face_cascade_name的识别对象:face_cascade_name = "e:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml
OpenCV中人脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸,并将人脸用vector保存每个人脸的坐标、大小(用矩形表示),函数由分类器对象调用:
FACES=face_cascade_name.detectMultiScale(IMAGE,scaleFactor=1.1,minNeighbors=5,minSize=(5,5),flags=cv2.CASCADE_SCALE_IMAGE)
detectMultiScale方法可识别图片中的多个面部,返回值是一个列表,列表元素是由面部区域左上角的X,Y坐标,W,H坐标,面部宽度,面部高度组成的元组。通过下列代码可获取每一张面部区域的数据:(图3)
for (x,y,w,h) in faces;
对识别的人脸用矩形框住显示,静态图片采集识别主要是作为初始化数据时使用,或者用于静态点名。全班刚上课时,摆好拍摄姿势,教师用系统采集静态图片给系统进行人脸识别从而后台统计人脸数目实现点名效果。静态点名的好处是系统能够最佳識别全班的人脸。但是动态视频的图像抓取同样非常重要,系统启动后自动按照系统设置的频率抓取课堂图像并在后台自动进行人脸识别和统计识别出的数据,按照一定的算法统计出没有认真上课(趴下睡觉)的人数,并通过人脸比对推算出不认真上课(趴下睡觉)的同学名字和不在上课状态的大约时间。
4.2 人脸的比对
课堂考勤中学生经常出现的问题一般有不按固定位置就坐;迟到;早退;上课睡觉;找人顶替上课等一系列的问题。为解决这些问题需要系统后台对识别出来的人脸比对。人脸的比对就是要将人脸识别出信息与数据库中的已经标识出具体信息的人脸数据进行比对,从而真正识别出这张(这些)人脸是属于谁。对人脸的比对基本原理是通过对比两张图片的差异度来判断两张图片是否为同一人的面部。对比图片差异度的算法有很多种,本文应用“颜色直方图”算法来实现对人脸图像的识别。下面代码为在Python中比较两张图片的差异:
from PIL import Image
from functools import reduce
import math, operator
pic01 = Image.open("img01.jpg") #打开img01文件
pic02 = Image.open("img02.jpg") #打开img02文件
h1 = pic01.histogram() #取img01文件的直方图信息
h2 = pic02.histogram() #取img02图片的直方图信息
diff = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2, h1, h2)))/len(h1)) #计算两个图形差异度
使用颜色直方图算法需要导入pillow、 functools 、match及operator包,最终的计算结果 放入diff变量中,保存的是一个浮点数,其值代表两张图片的差异度,数值越大,表示图片差异度越大,若两张图片完全相同,则diff值为0.0
系统开启后,任课教师可以“手动”让学生摆好姿势以照片形式采集静态图片,同时系统一直以实时视频为基础按固定的频率抓取图像。在后台与数据库中人脸进行比对,经过与不同的实时图像比对,经过算法分析,给出考勤中迟到,缺席等具体学生名单。当然为了减轻服务器的负担,这个实时抓取比对的频率可以设置为一节课3-4次。并且系统实时人脸比对功能默认情况下是上课后3分钟至5分钟后实时对比3-4次,下课前3分钟再实时对比一次。这种主要针对一般按正常座位上课的班级。对特殊情况,教师可以在上课中间开启实时对比功能设置对比时间和抓取频率,查询出没按位置就座或顶替上课的学生名单。
5 存在的问题
本系统虽然通过OpenCV和Python构建人脸识别技术能够实现课堂快速考勤。但也有不少问题值得后面去改进。首先是高清摄像头的问题,一般的学校教室没有配置这个设备,只有一些作为高考考场的教室有这些设备。教师上课需要自带高清摄像头显然不现实。然后是拍摄角度问题以及光照外部环境极大的影响到人脸的检测,特别是人脸比对采用颜色直方图方法,环境影响非常大。学生上课不认真除了睡觉还有一些情况如开小差,闭眼睡觉等,这些可以参考开车疲劳检测的算法进行开发。同样,怎样有效地减少外部环境影响,有效快速地进行人脸检测和比对,都值得我们后面去研究。
参考文献:
[1] 武勃.黄畅.基于连续 Adaboost 算法的多视角人脸检测[J].计算机研究与发展,2005,42(9):1612-1621.
【通联编辑:唐一东】