• 休闲生活
  • 教育教学
  • 经济贸易
  • 政法军事
  • 人文社科
  • 农林牧渔
  • 信息科技
  • 建筑房产
  • 环境安全
  • 当前位置: 达达文档网 > 达达文库 > 建筑房产 > 正文

    基于人脸识别的学生课程出勤管理系统设计

    时间:2021-04-09 07:51:50 来源:达达文档网 本文已影响 达达文档网手机站


    打开文本图片集

    摘 要: 由于当前教师对于学生课堂出勤情况大多以手动形式进行记录,不利于后期的数据统计以及分析。针对此类学生课堂出勤问题,提出一种通过人脸识别结合MySQL数据库技术进行学生课堂管理的方法。通过人脸识别技术获取学生基本信息,并且通过数据库技术获取当前课程的信息,结合之前的学生信息对学生的课堂出勤情况进行实时记录,同时将学生信息与对应课程信息存储到数据库中。实验结果表明,系统可以将学生课堂出勤信息在数据库中进行记录并且易于统计。该方法最终实现了记录学生的课堂出勤情况,从而达到学生课堂管理的目的。

    关键词: 人脸识别; MySQL; 学生出勤管理; 课程信息

    中图分类号: TN919.8⁃34; P391 文献标识码: A 文章编号: 1004⁃373X(2016)01⁃0081⁃04

    对于传统的课堂出勤记录都是由教师以点名方式进行记录,最终记录结果的准确性条理性不高,并且无法方便地进行最终的数据统计,因此本文提出了一种基于人脸识别结合数据库技术的方法,可以在识别出学生的同时,结合数据库操作,对学生信息以及当前的课程信息在数据库中进行记录,方便进行统计与查询。本文采用C++语言对数据库进行操作,结合开源视觉库OpenCV中的人脸识别模块,进行整个系统的开发。

    1 数据库整体设计

    1.1 课程信息处理

    为了可以正确获取当前时刻某间教室所上的课程,需要将所有课程信息存入数据库的课程信息表中,最后通过数据库查询语句获取当前时间。本文采用关键字段解析的方法对课程信息进行存储,对于汇总所有课程信息的Excel表格中的课程名称、上课地点以及上课时间等三个关键字段进行提取并且对上课时间字段进行解析,存储课程信息的数据表可以按照以下规则分为7个关键字段设计,如表1所示。从上到下的字段含义分别为课程名称、上课地点、课程起始时间、课程结束时间、课程起始周、课程结束周、本周几上课。例如某节课程的上课时间字段为:周1第9~11节{第1~16周},通过正则表达式"([1⁃9]\d*\.?\d*)|(0\.\d*[1⁃9])",将所有数字信息1,9,11,1,16进行提取,分别存储到动态数组中,并通过执行数据库插入语句将相应字段的信息写入到数据库中。例如某学期所有课程在数据表中的存储形式,这里选择了一些课程作为示例,如表2所示。

    通过对课程信息Excel的遍历,将所有课程信息存储到数据库中。

    对于上课地点的存储采用教室PC的MAC地址与教室号之间一一对应的映射关系进行存储,即通过获取每间教室PC的MAC地址,从而选择出相应的教室,也就是如表2所示的Location字段。

    1.2 当前课程信息获取

    在学生课堂出勤信息写入数据库的同时,系统需要获取到当前时刻和位置正在进行什么课程,确定当前时间正在进行的课程由四个关键信息来判断当天是周几,当前的时间,当天是本学期的第几周,以及当前所在的教室,通过判断以上四个关键字段信息,编写程序实现将对应信息转化为相关的数据库查询字符串,对四个字符串进行组合从而得到最终相应的数据库查询命令,对课程信息表进行查询。

    首先对于当前是本周几的获取可以通过C++中DateTime类的DayOfWeek属性进行获取,获取后用于匹配如表2所示课程信息表中的WeekDay字段,该部分程序返回结果,以当天是周一为例,返回字符串" WeekDay = ′1′;"。通过系统自带的system结构获取当前的时间,并将其转换为分钟,本文中的课程时间为每天上午课程起始时间8:00,下午课程起始时间为1:30,晚上课程起始时间为6:00,每节课程45 min,根据课程时间与当前时间进行比较,根据比较结果将当前时间转化为每节课程所在的时段,每天最多为12节课,所以通过分支判断结果可以分为12个时间段,进行判断的主要思想是若某节课程的起始时间段(Lesson_Time_min)小于等于当前时间段并且该课程的结束时间段(Lesson_Time_max)大于等于当前时间段,则在当前时间段必定正在进行该课程,再结合当前的日期和所在的教室就可以惟一地确定当前课程。

    以表2中C++程序设计基础为例,若当前时段为当天第10个时间段则程序返回数据表查询条件的字符串为 "Lesson_Time_min<=′10′and Lesson_Time_max>=′10′",该语句表示在课程信息表中查询包含了第10个时间段的所有课程,C++程序设计基础课程中Lesson_Time_min字段的值等于9,Lesson_Time_max字段等于11,则该课程满足查询条件。对于当天是本学期第几周的信息,需要通过当天日期与本学期的起始日期相减,通过模7取余的方法获取当前是本学期第几周,通过switch⁃case语句返回不同的字符串,例如当前是本学期第1周,则程序返回字符串:"Start_Week<=′1′ and End_Week >= ′1′",该查询命令查询了所有从第1周开始上的课程。最后对于当前所在的教室,通过教室与PC的MAC之间的对应关系表进行查询,得到当前学生所在的教室,即课程信息表中的Location字段。

    通过上述根据关键字段进行解析的查询方法,使用这6个字段的信息可以在当前时间和地点惟一的确定出当前所上的课程。下面给出通过四个字符串拼接而成的数据库查询命令,依旧以C++程序设计基础这节课为例,若当前时段和日期都满足这节课程则查询命令为:select Course_Name from 课程信息where Location = ′1教216′ and Lesson_Time_min<=′9′ and Lesson_Time_max>=′9′ and Start_Week<=′1′ and End_Week>=′1′ and WeekDay = ′1′;通过上述查询语句可以惟一确定当前时间以及教室所上的课程(Course_Name)为C++程序设计基础[1]。

    2 人脸识别模块设计

    2.1 人脸图像预处理

    在图像采集的过程中由于环境因素例如光照、采集设备和距离的影响使得采集后的图像会受到一定干扰,这会对后续的人脸特征提取以及人脸检测造成影响。因此,在进行人脸图像识别时需要先对图像进行预处理。图像预处理主要包括三部分:彩色图像转换为灰度图像,直方图均衡以及中值滤波。

    首先通过OpenCV库函数imageGray=cvCreateImage(cvGetSize(imageSrc),IPL_DEPTH_8U,1)创建一个单通道的图像容器imageGray,cvCvtColor(imageSrc,imageGray,CV_BGR2GRAY)函数将图像转换为灰度图像,如图1(a)所示。其中imageSrc为原始图像,imageGrey为转换之后的灰度图像,得到灰度图像之后,使用函数cvEqualizeHist(imageGrey,imageGrey)将灰度图像进行直方图均衡,如图1(b)所示,通过直方图均衡操作可以将图像的灰度范围进行扩展[2],从而体现出更多的细节信息。从图1中可以看出均衡之后的图1(b)显示出了均衡前图1(a)人脸周边的细节信息,最后为了去除图像中的噪声点,使用cvSmooth(imageGrey,imageGrey,CV_MEDIAN,3,3)函数将图像中的噪声点通过3×3的窗口进行中值滤波[3],得到最终处理之后的图像,图像处理结果如图1(c)所示。

    2.2 基于Adaboost算法的人脸检测

    2.2.1 算法简介

    Adaboost算法在1995年由Freund和Schapire提出,该算法是一种将弱分类器通过弱学习的结果反馈适应地调整假设错误率,经过训练将多级弱分类器按照加权投票机制,即让分类效果较好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重,将这些级联起来形成强分类器,最终将多个强分类器级联组成最终的分类器对待测样本进行种类的判别。

    如图2所示,每一个弱分类器通过权值的不断调整最终级联起来构成强分类器H(x),因为每一个强分类器对负样本的判别准确度非常高,所以如果检测到负样本,就不会继续调用下面的强分类器,直接判别为负样本,减少了很多的检测时间。因为图像中大部分区域都是负样本,因此级联分类器在分类的初期就抛弃了大多数负样本,所以级联分类器的速度非常快,只有通过上级分类器的样本才会送到下一个强分类器进行再次检验,这样就保证了最后输出的正样本的概率非常高。

    2.2.2 人脸检测的实现

    本系统使用OpenCV提供的正面人脸分类器haarcascade_frontalface_alt.xml作为区分人脸样本与非人脸样本的分类器,通过cascade=(CvHaarClassifierCascade*)cvLoad(haarcascade_frontalface_alt.xml,0,0,0)函数将人脸分类器读取进来,cascade就是最后指向分类器的指针变量,加载完分类器之后,通过目标检测函数CvSeq*cvHaarDetectObjects(const CvArr* image,CvHaarClassifierCascad* cascade,CvMemStorage*storage,double scale_factor,int min_neighbors,int flags,CvSize min_size)对待侧图像中的目标进行检测。其中image是待测图像,cascade就是之前加载好的分类器指针,storage是用来存储检测到的一系列候选目标矩形框的内存区域,scale_factor表示在前后两次相继的扫描中,搜索窗口的比例系数,本文中设定为1.1,flag参数设定了目标检测时的规则,这里为了提高检测速度并且满足单一人脸检测的要求将参数值设定为4,表示只返回检测到的最大目标。最后通过cvRectangle()函数将检测到的目标即人脸区域通过矩形框标记出来,达到人脸检测的目的[4]。检测结果如图3所示。

    2.3 基于PCA算法的人脸识别

    2.3.1 人脸库训练

    首先通过之前的人脸检测算法,对待测试的目标进行人脸图像截取,这里通过摄像头获取人脸图像,将图像转换为灰度图,并将图像进行归一化至92×112以便于后续识别,利用cvSaveImage()函数每隔2 s将图像进行截取并且每人保存5张图像进行训练,同时训练者个人信息要与其人脸对应,以便于后续识别时得到识别对象的信息。采集训练图片时的光照环境要尽量与之后进行识别时所在的光照环境相同,这样可以较为准确快速地进行识别。首先使用cvLoadImage()函数加载人脸数据库,之后调用人脸数据库进行PCA变换,PCA变换主要是将图像的特征值进行提取并且将特征降维后存储成特征平面[5],为之后新图像的识别做准备,OpenCV中通过函数cvCalcEigenObjects()进行PCA变换[6],求出特征空间,最后通过调用cvEigenDecomposite()函数将人脸库中的人脸图像在特征空间进行投影,将最终得到的特征向量保存到facedata.xml中。

    2.3.2 人脸识别

    识别过程首先要加载保存在facedata.xml中的训练结果,之后通过人脸检测程序将人脸图像进行提取,将截取的人脸灰度化之后进行归一化(归一化之后与人脸库中的尺寸相同),随后同样是通过cvEigenDecomposite()函数将待识别人脸投影到特征空间,获得待识别人脸图像最终的特征向量,计算待识别人脸的特征向量同训练部分的每一个训练样本的特征向量之间的欧式距离[7],将所有欧氏距离的大小进行比较得到最小的欧氏距离,这样就得到了和待识别人脸最为相似的人脸库中的人脸[8],通过计算5 s内被识别次数最多的目标作为最终识别结果,可以达到极高的准确率。通过cvPutText()函数将最终的识别结果输出到屏幕上,识别结果如图4所示。

    3 系统测试

    整个系统测试环境在教室中的PC机上搭建完成,通过USB摄像头与教室PC相连接来获取人脸图像。在程序中通过OpenCV中的摄像头控制函数开启摄像头并进行图像采集以及识别[9]。首先将系统时间调整为待测试的课程时间,这里还是以C++程序设计基础为例。将当前时间调整为2014年10月13日正好是周一,具体时间调整为第9~11个时段,将之前训练好的待测试同学的标识为学号与姓名的组合,例如本次测试采用的学生标识是以学号加姓名对应相应人脸进行训练,选取25名学生作为训练样本,每一个样本分别使用1,3,5张图像进行训练,测试结果如表3所示。

    测试结果表明,每人采用3~5张训练图片可以得到较好的识别结果。

    表3 识别测试结果

    [训练样本数量\&成功识别人数\&识别率 /%\&1\&15\&60\&3\&23\&92\&5\&24\&96\&]

    通过C++中string类的字符串操作函数分别将学号与姓名提取出来,分别存储成Stu_Num与Stu_Name,在数据库中提前创建了名为记录表的table用于存储最终的学生和课程信息,该表由学生编号,姓名,课程,教室号,日期等5个字段组成,每当识别出一名学生就执行数据库插入命令"INSERT INTO 主表(学生编号,姓名,课程,教室号,日期) select′"+ Stu_Num + "′,′" + Stu_Name + "′,′" + Course_Name + "′,′" + Class_Num + "′,′" + CurrentDate + "′ from dual where not exists (select学生编号,姓名,日期 from主表 where学生编号=

    ′"+Stu_Num+"′and姓名=′"+Stu_Name+"′and 日期=′"+CurrentDate+"′);";其中where not exists语句用于判断数据表中是否存在相同数据条目,从而防止重复插入。上述语句可以直接将当前识别出来的学生信息以及之前获取的课程信息插入到数据库中进行记录,截取部分数据库中的存储结果如表4所示。

    4 结 语

    本系统结合了当前流行的MySQL数据库技术与OpenCV中的人脸识别算法,可以较好地通过PC机上连接的摄像头完成学生身份识别,并通过数据库技术获取到当前的课程信息从而完成课堂出勤的学生信息的统计与记录,与此同时可以通过编写后续的数据库查询统计软件,可以方便地对最终数据进行排序统计以及数据导出,对于学生课堂出勤情况的管理具有较好的效果。

    参考文献

    [1] 黄缙华.MySQL入门很简单[M].北京:清华大学出版社,2014.

    [2] 秦小文,温志芳,乔维维.基于OpenCV的图像处理[J].电子测试,2011(7):39⁃41.

    [3] BRADSKI G.学习OpenCV[M].于仕琪,译.北京:清华大学出版社,2009.

    [4] 郭磊,王秋光.Adaboost人脸检测算法研究及OpenCV实现[J].哈尔滨理工大学学报,2009,14(5):123⁃126.

    [5] 王威,胡永忠.基于ARM9硬件平台的人脸识别系统设计与研究[D].成都:电子科技大学,2013.

    [6] 朱兴统,习洋洋.基于C++和OpenCV的人脸识别系统的设计与实现[J].自动化与仪器仪表,2014,10(8):127⁃128.

    [7] 周桐,牛夏牧.基于PCA的人脸识别系统的设计与实现[D].哈尔滨:哈尔滨工业大学,2007.

    [8] 陶颖军.基于OpenCV的人脸识别应用[J].计算机系统应用,2012,21(3):221⁃223.

    [9] 刘向东,吴建鑫,陈兆乾,等.人脸自动监测与识别技术的应用研究[J].计算机应用与软件,2004,21(5):17⁃18.

    [10] 陈磊.计算机视觉类库OpenCV在VC中的应用[J].微计算机信息,2007,23(4):209⁃210.

    相关热词搜索: 管理系统 出勤 识别 课程 学生

    • 生活居家
    • 情感人生
    • 社会财经
    • 文化
    • 职场
    • 教育
    • 电脑上网