需求分析

AI+教育的模式是目前的主流,目前公司也在往这方面筹备,筹备的第一个项目就是实现学生的自动化考勤。公司属于双师课堂的在线教育模式,学生和老师通过直播的方式进行互动,这个模式的对刷脸考勤是有天然的优势的,即在间隔的时间内截取教室内的图像进行分析,如果在人脸库中匹配到提前录好的学生人脸信息即可对该学生进行考勤。

实现思路

针对这个需求,我的实现思路比较简单直接。即在双师视频中不断的截图,将图片存到数据库中,然后另写一个不断轮询的服务,它的主要工作就是不断的从数据库中读取数据,如果读到了就进行识别考勤逻辑,然后删除这条数据,如果没有读到则休息,然后进行下一次的轮询。在这个服务中会记录这堂课下已经考勤过的学生,如果识别匹配到学生则去查找是否已经考勤过,如果没有则会发送考勤请求进行考勤。

服务商调研

这里对市场主流的几家人脸识别公司做了调研,这里主要列出的是在搜索人脸部分的能力。

服务提供方 搜索解决方案 并发 价格 不足
face++ 在一个已有的 FaceSet 中找出与目标人脸最相似的一张或多张人脸,返回置信度和不同误识率下的阈值。支持传入图片或 face_token 进行人脸搜索。使用图片进行搜索时会选取图片中检测到人脸尺寸最大的一个人脸。 免费整组可提供20QPS 按量计费:0.01元/次 每次只能返回一个人脸尺寸最大的结果;价格较高
阿里云 可实现人脸查找1:N 20元/QPS/日 同样每次只可查找一人,免费额度较低,、不利于小规模测试
腾讯云 对一张待识别的人脸图片,在一个或多个人员库中识别出最相似的 TopN 人员,识别结果按照相似度从大到小排序。单次搜索的人员库人脸总数量最多可达100万张。可针对该图片中的一张或多张人脸进行搜索。 固定50QPS 人脸搜索每月有免费的10000次调用额度,超过后3100元可购买100万次 此方案是可以重点考虑的,只是测试时如果超过免费额度是要交3100元的
百度云 给定一张照片,对比人脸库中N张人脸,进行1:N检索,找出最相似的一张或多张人脸,并返回相似度分数。支持百万级人脸库管理,毫秒级识别响应,可满足身份核验、人脸考勤、刷脸通行等应用场景。如果一张图片中存在 M 张人脸,支持一次性在人脸库中搜索全部人脸,并返回每个人脸对应的用户和相似度 免费10QPS 人脸搜索调用量免费 并发较低

比较各个厂商提供的解决方案和价格,并结合自身的情况,最终我选择的时百度云的解决方案,主要出于以下原因:

  • 在考勤效果没有大面积证实之前,需要有一个稳定且低成本的测试方案,百度云调用量免费是有绝对优势的。
  • 对于百度云并发低的问题,可以在算法上用排队解决。
  • 百度云可以一次最多搜索10个人脸结果,相比其他效率更高,和我们的场景契合度更高。

创新点

1. 如何提高人脸识别准确率

这里我最开始的解决思路是将所有人的人脸信息都放在一个人脸集中,这样做也是比较简单且通用的做法,可是由于人脸集的增加,识别率肯定会打折扣,然后我开始思考有没有办法可以缩小人脸集合,根据每个人脸的属性进行分类,然后在识别时找到这节课相关的属性,只用寻找这个属性下的人脸即可。由于公司是全国性的,在各地区都有校区,那么校区这个属性就可以很好的做到区分作用,在录入人脸的时候根据校区创建人脸集,识别时每节课都是有专属的教室号的,然后根据教室号找到对应的校区,再在这个校区下识别人脸即做到了缩小人脸集的效果。

2. 如何充分的利用每一张考勤图片

现在校区一个教室的班容在25人左右,如果一节课有二十人是可以识别出来的,基于M:N搜索一次最多只能搜索到十个人,那么另外十个人如何才能搜索到呢?这里我的解决方案是对图片进行二次编辑,由于第一次识别时会将识别到人脸坐标都标出来,根据这个坐标,我将图片上第一识别到的人脸进行遮挡,然后再次进行识别,就可充分利用这张图片了,也避免了后排学生人脸永远较小时考不上勤的问题。
百度云返回的人脸坐标包括人脸矩形的走上角坐标、长、框、旋转角度,基于此可计算其余各角坐标,可参考以下图:坐标图.png

在设定为一张图最多考勤2人的情况下系统再编辑后的遮挡图效果为:
考勤剪裁.jpg

3.如何解决并发问题

百度云提供的免费QPS额度是10,这个并发量在实际业务中是很难满足的,但是公司的业务特性是上课的时间点是比较集中的,剩下的时间就可以利用起来,所以这里我做了一个排队算法,对于每次需要识别的图我会先存起来,每次只发10个请求,等这些请求回来了之后,会交给另外的线程做结果处理,这边识别的线程再发下一批10个请求。

具体实现

主要分为三个部分:

  1. 录入学生部分
    这部分出于方便校区操作和维护考虑而做在web端,在erp系统中除之前录入的学生基本信息外,会加录一个学生头像,这里可以调取摄像头直接录制或者选择文件录制,在这里实现的过程中对摄像头的调取花了不少时间,后续会写具体的坑及解决办法。
  2. 教室情况收集部分
    这部分是集成公司的双师视频软件中的。这部分的服务商是可以提供推流截图的,但是经过各种实验,推流截图的图片分辨率太低,对考勤的结果很不理想,经过和服务商的很多沟通均无法改善;然后我们的解决办法是自己截图,即通过代码对屏幕进行截图,后面证实此方法效果很好。拿到图之后向数据库中存储图片和这节课的教室号。
  3. 考勤部分
    这部分是用java写的一个轮询服务,它的作用是不断的从数据库中读取数据,如果读取到就将这个教室号和图片加入到待识别线程,识别线程将图片发送到百度云进行设别,再将设别结果放入考勤线程,如果识别到的人数等于设置的最大识别人数还要将这张图加入到剪裁线程,剪裁线程处理好图片后再放入到识别线程,考勤线程是将识别到的学生进行考勤。

版权声明:本文为bGpi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/bGpi/p/14404347.html