梁薪弛,彭睿杰,刘欢,张亚楠
(哈尔滨理工大学计算机科学与技术学院,黑龙 江哈尔滨 150080)
随着我国教育水平的普遍提高和新生数量的大量增加,高校学生的课堂出勤率和课堂纪律问题给任课教师和遵守纪律认真学习的学生带来了困扰。合理高效地进行点名和控制学生在课堂使用手机成为学校重点关心的问题。目前,传统的方法需要浪费大量的时间进行人工点名,不仅浪费时间,而且点名次数少让逃课的学生有机可乘,代签的现象也屡禁不止。
为了节约时间,提高点名效率,保证课堂纪律,故分析、设计并实现基于人脸识别的智能教学辅助平台。本项目应用人脸识别技术,将学生的手机利用起来,在学生端可同时进行人脸识别,节约了课堂中在点名上花费的时间;在课堂中教师也可锁定学生的手机,将其限制在APP 的界面,以达到让学生认真听课的目的;并可随时将本学期的点名情况在WEB 端导出、汇总,在节约课堂时间的同时减轻教师的工作压力,同时服务于师生。该平台的主要功能包括:人脸识别签到、学生端设备锁定、教师端快速计分、教师端快速发布信息及计分结果快速导出等。
人脸识别方法包含以下相关技术及步骤:利用用户的手机终端获取人脸图片,进行人脸图片预处理、人脸五官定位、人脸特征值提取以及最后的人脸数据比对。
人脸照片获取主要通过摄像头拍摄获得。由于环境光线随着时间的变化具有不确定性。当处于黑暗环境的时候,通过手机屏幕展示白色画面并提高亮度补光,再进行利用摄像头拍摄人脸图片,从而获取清晰的面部轮廓,方便进行下一步图片预处理并获取脸部特征值。预处理步骤包含:图像灰度化、高斯平滑处理、图像对比度增强、图像二值化处理和图像均衡直方图处理。人脸定位步骤包含:眼睛识别并定位、鼻子定位进而进行鼻尖的定位和嘴唇定位。定位完毕后可进行人脸特征参数的提取,人脸特征参数提取主要工作:确定双眼之间的距离、双眼的倾斜角度、嘴巴的重心等。将这些提取到的参数用矩阵表述,进行主成分分析、特征值分解等工作,为下一步识别比对做准备。比对过程中用特征向量进行比对,如果比对结果在范围内则确定相同,如果不相同则将人脸数据加入训练集中。
1.1.1 光线补偿
人脸识别应用的场景越来越多,但由于光线会随着时间发生变化,加之用于人脸识别的摄像头的性能限制,会导致获取的人脸图片出现不清晰、模糊、跑焦等现象。鉴于此,为了更好地捕捉人脸信息,有必要在摄像头位置加装补光灯。摄像头安装高度一般根据环境不同,选择不同的高度。人脸识别摄像头安装高度一般在1.6~2.0 m,做到几乎与人脸持平。
(1)补光灯一般要安装在摄像头的下方或左右位置,也可以安装与人脸持平的位置。
(2)补光灯要根据人脸位置倾斜角来做具体调整。
(3)安装补光灯现场模拟具体光线是否太强或者太弱,如果太强会造成过曝现象,人脸会出现一片白的情况,不利于进一步对图像进行预处理及特征点提取。
1.1.2 灰度化
通常看到的彩色照片都是包含R、G、B 3 种颜色通道的图片。图像灰度化是本次人脸图像预处理的第一步。简单来说就是将彩色照片转换为黑白色图像,经过灰度化处理的图像不包含彩色信息只包含亮度信息。图像将更加具体,使得图像方便存储,提高处理效率。灰度化的具体公式:
注意这里的2.2 次方和2.2 次方根,RGB 颜色值不能简单直接相加,而是必须用2.2 次方换算成物理光功率。因为RGB 值与功率并非简单的线性关系,而是幂函数关系,这个函数的指数称为Gamma 值,一般为2.2,而这个换算过程,称为Gamma 校正。
OpenCV 中我们直接使用cv2.cvtColor(img,flag)函数将彩色RGB 图转换为灰度图。
具体代码:
img gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
处理后的图像效果如图1 所示。
图1 图像灰度化效果
1.1.3 高斯平滑处理
图像在采集、传输和转换过程中均容易受环境的影响,这种影响在图像中就表现为噪声,这些噪声会致使图像质量降低或者干扰我们提取原本想要的图像信息,所以需要通过滤波技术来去除这些图像中的噪声干扰。
高斯平滑处理(Gaussian Smoothing)后的图像虽然肉眼上看会模糊,但是图像处理时有去除高频噪声的功能。
图像平滑是局部图像预处理的一种技术。图像经过灰度化、二值处理之后,可能有噪声,或者图像的不平稳性导致图像处理过程中有干扰对图像本质理解的频率信息,我们将这些噪声、频率信息等干扰处理掉,就需要用到平滑处理。高斯平滑是对图片应用一个高斯滤波器(Gaussian Filter),起到模糊图片和消除噪声的效果。
图2(a)的噪点就是图片中的高频部分,通过高斯滤波器抑制图片中的高频部分让低频部分顺利通过,处理为图2(b)中的效果。
图2 图像高斯平滑处理效果
Opencv 中,利用高斯平滑去除高频噪点:
blur_gray =cv2.GaussianBlur(gray,(blur_ksize,blur_ksize),0,0)
高斯平滑处理后效果如图3 所示。
图3 灰度化进行高斯平滑处理效果
1.1.4 对比度增强
对比度增强就是将图片的灰度范围拉宽,例如将范围分布在[50,150]之间,将其拉升到[0,256]。对比度增强有几种不同的方法,如:线性变换,直方图正规化,伽马变换,全局直方图均衡化及限制对比度自适应直方图均衡化等算法。使用直方图正规化的算法。有如下计算公式:
OpenCV 中提供了normalize()函数来实现灰度正规化:
img_norm=cv.normalize(img,dst=None,alpha=350,beta=10,norm_type=cv.NORM_MINMAX)
通过以上方法进行对比度增强效果如图4 所示。
图4 图像对比度增强效果
1.1.5 二值化处理
通常来说,彩色图像就是具有三通道0-255,0-255,0-255,有2^24 位空间。灰度图像就是只有一个通道0-255,有256 种颜色。而二值图像就是只有2 种图像,黑和白,1 白色,0 黑色,可以为后续人脸定位和比对减少运算量。通过1 个阈值改变图像中的颜色。在OpenCV 中获取阈值的方法:cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV、cv2.THRESH_TRUNC、cv2.THRESH_TOZERO、cv2.THRESH_TOZERO_INV。根据不同方法得到的图像区别进行分析,在此使用THRESH_TOZERO 较为合适:
ret,thresh4 =cv2.threshold(grayImage,127,255,cv2.THRESH_TOZERO)
图像二值化处理效果如图5 所示。
图5 图像二值化处理效果
1.1.6 均衡直方图
直方图是图像中像素强度分布的图形表达方式。如图6 所示,它统计了每一个强度值所具有的像素个数。
图6 图像处理前直方图
直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法。以上面的直方图为例,可以看到像素主要集中在中间的一些强度值上。直方图均衡化要做的就是拉伸这个范围。如图7(a)所示: 圈出了少有像素分布其上的强度值。对其应用均衡化后,得到了图7(b)所示的直方图。均衡化后的图像如图7(c)所示。
图7 图像直方图均衡化效果
均衡化指的是把1 个分布(给定的直方图)映射到另1 个分布(1 个更宽更统一的强度值分布),所以强度值分布会在整个范围内展开。
要想实现均衡化的效果,映射函数应该是一个累积分布函数。对于直方图H(i),它的累积分布H^'(i)是
要使用其作为映射函数,我们必须对最大值为255(或者用图像的最大强度值)的累积分布H^'(i)进行归一化。最后,我们使用一个简单的映射过程来获得均衡化后像素的强度值:
equalized(x,y)=H'(src(x,y))。
使用OpenCV 函数EqualizeHist 对直方图均衡化:equalizeHist(src,dst)。
在进行人脸五官定位的时候首先进行肤色筛选,眼睛以及鼻子都处于非人类肤色区域。这样可以加快鼻子以及鼻尖的定位速度。确定眼睛位置后,确定鼻子的位置就比较简单了。以瞳孔之间的直线为例,其二分之一的位置大致就是鼻子位置。然后在鼻子的二分之一往下就是鼻尖的位置。确定鼻尖后,附近搜索颜色较深的即为鼻孔位置。
在此处,使用OpenCV 中的Dlib 库进行人脸特征点位置定位。加载Dlib 中人脸检测和关键点定位:
最后将关键点描绘出来即得到如图8 所示的关键点定位信息。
图8 人脸关键点定位
在此我们使用OpenCV 关键点特征提取算法GFTTDetector:
gftt=cv.GFTTDetector_create(100,0.01,1,3,False,0.04)
kp1=gftt.detect(image,None)
result=cv.drawKeypoints(image,kp1,None,(0,255,0),
cv.DrawMatchesFlags
通过该算法得到如图9 所示的人脸关键点特征。
图9 人脸关键点特征提取
该方法是基于shi-tomas 角点检测变化而来的一种特征提取方法,缺点是无法提取人脸描述,但是对于本次项目来说已经足够。
提取人脸数据后,我们使用计算余弦距离的方法来进行相似度计算,从而进行判断摄像头提取的人脸是否与数据库的人脸一致,从而完成打卡功能。余弦距离,也称为余弦相似度,是用向量空间中2 个向量夹角的余弦值作为衡量2 个个体间差异的大小的度量。当2 个向量直接的夹角theta 趋向0 时,2 个向量越接近,差异就越小。越接近1 值时,说明人脸越相似。具体对比过程如图10 所示。
图10 通过欧氏距离判断相似度
本次基于人脸识别的智能教学辅助平台系统,由基于以上算法实现的1 个跨平台JavaScript 算法库作为底层实现,其具体功能为传入1 张用户的人脸图片后,自动对图片进行预处理,对人脸进行定位、裁切后生成1 个人脸特征值和人脸特征的集合并返回给上层的调用者。上层调用者可以对返回的人脸特征值做对比操作以判断是否是对应的签到者。
平台同时支持iOS、Android 这2 个平台,UI 界面分别采用对应平台的语言、工具链编写,iOS 平台采用SwiftUI& Swift,Android 平台采用Jetpack Compose&Kotlin。而对于JavaScript 库的调用则通过iOS 平台的WKWebView 提供的JavaScriptCore 引擎以及Android 平台的WebView 提供的V8 引擎来运行,并自行实现1 个JSBridge(如图11 所示),以实现移动端UI 层与JavaScript库的通信,以实现传递人脸图片与计算后的人脸特征值。
图11 JSBridge 架构
该平台的接入与使用十分简便,只需要在教师与学生手机终端上安装本平台提供的APP 即可。不需要学校采购相关的考勤设备,也不需要学生集中在某一时段参与考勤而造成教室内的拥堵。
平台通过APP 的形式将每一位学生拥有的手机变成了考勤终端,解决了考勤终端少的问题,并通过人脸识别技术保证了考勤的真实性。
考勤的流程大致如下:首先教师在APP 内先创建好,并让班内学生事先加入的频道发起1 次签到,可以选择是否开启人脸识别以及位置检测来确保签到的学生在教室内并且是学生本人。学生在教师发起签到后,只需要打开APP,点击签到按钮并进行人脸识别即可签到成功。
本平台将人脸识别算法集成于APP 内,也缓解了服务器的压力、减少服务器设备的投入并节约了用户的网络流量。
整个流程耗时不会超过半分钟,相对于传统的点名方式动辄几分钟的耗时,节约了大量的课堂有效时间。平台为实现考勤管理的信息化提供了可靠保障,有效地促进了智慧校园的建设。