人脸考试签到系统的开发及应用

2021-09-22 06:13吴梓祺
电子技术与软件工程 2021年15期
关键词:欧氏人脸程序

吴梓祺

(华南师范大学 广东省广州市 510555)

1 引言

当今世界信息技术日新月异,人脸检测、人脸识别和人脸检索等领域技术发展迅速,创造出许多人脸业务的解决方案,以及各种稳定性好、泛化能力强、精度较高的模型,这让基于深度学习的人脸考试签到系统的开发成为了可能[1]。传统的人工考场签到方式存在效率低下和人工成本较高等诸多问题,而这一款微信小程序人脸考试签到系统可很好地解决上述问题。首先,考生可以免去携带学生证的麻烦,只需把人脸图片导入到系统,便可通过系统的人脸签到功能无障碍入场。其次,小程序比对成功并确认后,会自动把考生到场信息写入数据库,免去手动录入系统的麻烦。最后,监考人员只需一台智能手机且安装有微信,即可在登录确认监考员身份后,打开考场签到小程序进行人脸签到,小程序可以自动识别学生身份,无需监考员人工比对。

由此传统的人工考场签到方式完全可由基于深度学习进行自动考场签到的方式所取代。使用人脸考试签到系统中的人脸业务模型,不仅可提高考试签到效率,而且节约了大量的人工成本。

2 系统开发分析

2.1 设计原理

前端首先要打开微信小程序,通过手机摄像头采集人脸图片数据,并用TensorFlow.js框架实现的Blaze Face轻量级人脸检测模型进行实时人脸检测,然后对检测结果进行评估分析,把符合标准的图像发送到后端,Flask后端通过TensorFlow框架实现的高精度FaceNet人脸识别模型从人脸图像中提取出128维特征向量,该特征向量的欧氏距离作为人脸相似度的度量标准,然后通过Annoy算法快速查找于获取人脸图片相近的考生人脸,若相似度达到一定阈值,返回对应学生的考试信息,最后手机确认,完成签到。

2.2 系统前端设计

2.2.1 前端人脸检测技术

由于考虑到签到速度问题,把人脸检测通过前端框架tensorflow.js实现,采用BlazeFace[2]超轻量人脸检测模型,模型大小小于400kb,推理速度达到亚毫秒级别。

2.2.2 BlazeFaceAPI代码完善

对于BlazeFace模型,TensorFlow.js已经给出了预训练模型以及对应的API接口,只需要调用几个函数就可以完成人脸检测。但是在调用和解析BlazeFaceAPI源码的过程中,作者作者发现源码有以下几点不足:

(1)每次启动程序都要调用API从网上获取模型权重和结构等数据,对服务器造成不必要的负载。

(2)人脸预测框会随着输入图片长宽比的改变而改变。

对于以上缺陷,本文作出了以下几点优化:

(1)把API设计成第一次获取到模型权重和结构等数据后保存到微信小程序本地,这样之后就可以离线识别了。

(2)删除意义不明确的函数,把图片预处理封装为一个函数,对预测后结果的处理再封装为一个函数,提高代码可读性。

(3)删除微信小程序无法获取到的入参类型。

(4)把所有有关tensorflow.js的操作放到api内,外部调用应该完全不涉及对tfjs的任何操作,提高代码解耦性。

(5)对于输入做截取正方形处理,提高人脸预测框和关键点的预测精度。

(6)修改图片检测结果的解码函数,让预测框保持原来的正方形。

2.2.3 人脸检测质量评估

由于向后端上传人脸图片请求人脸识别服务比较消耗资源,前端需要考虑如何评估人脸检测质量,从而丢弃检测质量较差的图片,减少请求次数,达到减轻后端服务器压力的目的。为实现高效合理的人脸检测质量评估机制,需要权衡程序执行效率和评估准确度,通过把消耗计算资源较大的算法放到后面,可以较好的解决该问题。

微信小程序先通过摄像头采集图片并进行人脸检测,人脸检测模型会以数组的形式返回人脸预测框和人脸关键点,程序首先判断数组长度,如果长度大于一,则证明有多张人脸,如果长度为零代表没有检测到任何人脸,若数组长度为一,继续通过预测框检验人脸是否位于相机中间位置而不是位于采集图片的角落中,还需要检验预测框的大小,以避免离相机太远或太近的情况,接下来通过帧间关键点检测,确保人脸没有大幅度位移和转向,保证图片的清晰度,然后根据人脸检测框裁切出人脸图片,最后是曝光度和清晰度检查,值得注意的是程序会先裁切出人脸,然后再做以上两个检测,目的是只检查人脸部分的曝光度和清晰度,而不需要考虑背景。

2.3 系统后端设计

2.3.1 后端人脸识别技术

FaceNet是一个通用的系统,可以用于人脸验证、识别和聚类。FaceNet采用的方法是通过卷积神经网络学习将图像映射到欧几里得空间。空间距离直接和图片相似度相关:同一个人的不同图像在空间距离很小,不同人的图像在空间中有较大的距离。FaceNet使用TripletsLoss函数训练神经网络,使得网络直接输出128维度的特征向量,向量的欧氏距离即可用于度量人脸相似度。以下是模型的架构图。FaceNet在LFW数据集上,准确率为0.9963%,在YouTubeFacesDB数据集上,准确率为0.9512[3]。

2.3.2 人脸识别模型优化、训练与测试

虽然在GitHub上,davidsandberg提供了在CASIA WebFace和VGGFace2两个大型人脸数据库上训练出来的预训练模型,且在LFW数据集上准确度分别达到0.99和0.996,但是由于训练集和验证集都是外国人脸,在预测亚洲人脸上可能会有一定的精度丢失,所以作者在亚洲人脸数据集CASIA FaceV5中尝试了训练FaceNet模型,CASIA FaceV5数据集包含了来自500个人的2500张亚洲人脸图片。

为了验证训练的成果的有效性,作者做了如下测试:分别用以上两个模型对同一个亚洲人进行测试,然后比较得到的欧氏距离,如果我们训练的模型的欧氏距离比官方的模型要小,说明我们的训练是有效的。

作者找了两张本人不同时期的照片进行测试,运行train/compare.py比较图片相似度,结果发现作者训练的模型计算出欧氏距离为0.6545而官方预训练模型计算出欧氏距离为0.737,可见训练的成果还是不错的。

2.3.3 Annoy算法实现快速查找相近人脸

Annoy全称是Approximate Nearest Neighbors Oh Yeah[4],是通过建立一种二叉树索引结构,使得查询一个点的近邻点的时间复杂度为O(logn)。

假设需要建立索引的点在二维空间中。首先随机选择两个点,以这两个节点为初始中心节点,执行聚类数为2的Kmeans算法,最终产生收敛后两个聚类中心点。在两个聚类中心点之间连一条线段(灰色短线),建立这条灰线的垂直平分线(黑色粗线)。这条黑色粗线把数据空间分成两部分。在划分的子空间内进行不停的递归迭代继续划分,直到每个子空间最多只剩下K个数据节点。

最终原始数据会形成二叉树结构:二叉树底层是叶子节点记录原始数据节点,其他中间节点记录的是分割超平面的信息。我们通常会建立多个二叉搜索树,来提高Annoy搜索算法的准确度。

查找的过程就是不断判断查询点位于分割超平面的哪一边。从二叉树索引结构来看,就是从根节点不停的往叶子节点查询的过程。通过对查询点和每个节点(分割超平面相关信息)进行相关计算来确定往这个节点左孩子节点走还是右孩子节点走。如果分割超平面的两边都很相似,那将会两边都查询。直到查询到叶子节点,返回叶子节点。

3 成果应用

成果应用如图1-图4所示。

图1:监考员信息展示界面

图2:识别成功

图3:考试列表界面

图4:签到情况展示界面

4 小结

作者以微信小程序为前端和Flask为后端,设计出基于Tensor-Flow深度学习框架的人脸考试签到方案,并开发出一套完整的注册登录和查看学生签到情况的后台系统。人脸考试签到系统利用前沿的深度学习技术,在提高学校考试签到工作效率的同时,降低了人工签到成本,为学校实现教学信息化提供了新方案和参考依据。

猜你喜欢
欧氏人脸程序
有特点的人脸
试论我国未决羁押程序的立法完善
三国漫——人脸解锁
“程序猿”的生活什么样
英国与欧盟正式启动“离婚”程序程序
创卫暗访程序有待改进
马面部与人脸相似度惊人
基于多维欧氏空间相似度的激光点云分割方法
三维欧氏空间中的球面曲线
欧氏环中两元的最大公因式及其性质