人脸口罩佩戴识别监测系统是一款集口罩识别、体温检测、语音播报和门闸开合于一体的智能识别反馈系统,它利用yolov2神经网络训练生成的模型进行人脸识别,具有较高的准确性、较低的时延等特性。
该设备能够针对口罩佩戴情况进行不同的内容反馈,并且语音提示,如果符合通过条件,可以控制闸机进行人员分流,非常适合当前后疫情时代的公共场所的疫情防控需求。
注: 系统框图与最终实现有所差别
训练的数据集是来自互联网的公开数据集,链接如下:
https://github.com/cabani/MaskedFace-Net,里面有正确佩戴口罩和不正确佩戴口罩的数据集,各有20Gb左右。
https://github.com/balajisrinivas/Face-Mask-Detection/tree/master/dataset,里面有未佩戴口罩的数据集
我们用到的K210开发板在运行图像识别的时候,模型只能输入224*224大小的图片,所以需要先将数据集大小调整为224*224.
用到的标注软件为 labelImg,下载链接为:https://wwt.lanzoul.com/iAXAG05bnjxc,
或其他标注软件也可以,需要把标注结果导出为xml格式
下载链接如下,
pics: https://www.aliyundrive.com/s/cRFP1YaU9WM
labels: https://www.aliyundrive.com/s/uMY9xoWPovu
pics文件夹里存放图片,分为三类:with_correct_mask/with_incorrect_mask/without_mask
labels文件夹中存放标签,为xml格式
注: 用开发板的摄像头拍摄多张照片多为数据集的一部分可以提高模型的识别精度
由于K210开发板只支持YOLOV2和V3,我们采用YOLOV2框架来进行训练
环境配置及训练方法见链接:
Mx-yolov3+Maixpy+ K210进行本地模型训练和目标检测_我与nano的博客-CSDN博客_k210芯片
[人工智能]更新:Mx-yolov3 3.0版本 (qq.com)
K210开发板只能运行kmodel格式的模型文件,所以需要将训练好的tilite、pt、h5等格式的模型转换成kmodel格式的模型。我们采用的是NCC工具箱,上面的链接中有提到。
用到的开发板是K210开发板,详细介绍见稚晖君在知乎上的这篇文章:https://zhuanlan.zhihu.com/p/81969854 介绍的很详细
其中还有一个py文件叫 mlx90614,是红外测温模块的底层代码,需要复制到sd卡根目录,或者用maxpyide发送到开发板上 其中模型文件、音频文件和各种提示图片需要自己准备。将各种文件存到SD卡中,插在K210开发板上即可运行
解决办法:经过分析后可得在程序的循环中,测温模块一直在测量温度。将控制程序改为只有在识别到正确佩戴口罩后才会测量温度。设定[34.5 37.9]的温度区间,低于最低值是认为测得的是环境温度,测温失败;高于该区间的最大值后认为体温异常,播放声音提醒。并且在5秒内没有测得大于温度区间最小值的温度后,视为放弃测温,程序进入下一次循环。
解决办法:我们在发现这个问题后,认为模型对摄像头采集的每一帧进行预测并作出后续反应的话,会造成系统混乱,因为模型有小概率会识别不稳定。经过几天的仔细思考,发现可以利用模型识别的累积效果,引入状态列表和状态和变量,将模型识别10的结果存入状态列表中,并在状态列表长度为10时计算状态和。模型识别结果0为without_mask, 1为with_correct_mask, 2为with_incorrect_mask. 若状态和小于3,则认为这10次中多数都是without_mask,识别为正确佩戴口罩;若状态和在7到13之间,则认为10次中多数都是with_correct_mask,识别为正确佩戴口罩;若状态和大于17,则认为10次中多数是with_incorrect_mask,识别为口罩佩戴不正确。
经过这样的累计效果后,系统可以正常工作,识别精度也有提升,但是正确佩戴口罩和口罩佩戴不正确会识别错误,分析原因是,由于模型预测结果2被认为是with_incorrect_mask,所以10次中有少数的with_incorrect_mask和多数的with_correct_mask也会被判定为口罩配得不正确。将模型预测结果1改为with_incoeerct_mask,2改为with_correct_mask后,这个问题有很大改善,识别精度进一步提高。
解决方法:比较容易的解决方案是再买一个pybase拓展板来接舵机,但是由于财力有限,不能支付得起拓展板的钱。在深入研究测温模块的排线结构后发现测温模块可以不用全部接在K210开发板上,只需4条线接入即可,这样给舵机模块留下了接口。可以把测温模块固定到其他地方,用几根杜邦线就把测温模块和舵机模块接到K210开发板上。
解决方法: 在语音播报的测试程序中,播放完声音序列后加上100ms的短暂延时,使程序不要过快的结束掉,可以解决爆音问题
解决方法:经过排查,是测试程序中anchors值不对,anchors需要有训练时的数据集计算得到。在更改anchors值后,测试精度有了很大提高
受摄像头硬件性能限制,在弱光条件下摄像头采集的图像较模糊,使模型不能正确判断口罩佩戴情况,造成识别正确率下降和延迟上升。
-
更换拍摄质量更好、像素更高的摄像头
-
在摄像头附近增加补光灯和光敏传感器,在光敏传感器检测到光照条件低于一定阈值后,在识别口罩的时候打开补光灯补光;在光照良好的情况下不开补光灯。
受摄像头设置所限,在距离较远时采集的图像模糊,使模型不能正确判断口罩佩戴情况,造成识别正确率下降和延迟上升。
- 更换拍摄质量更好、像素更高的摄像头
- 财力有限,并且目前K210只能支持这样的测温模块,导致测温模块质量不好,精度不高,目前为 +- 0.3℃
- 有条件就更换精度更高的测温模块,
- 或者自己根据K210的引脚接口设计一款测温模块
- 《MicroPython从0到1》基于K210平台
- [固件及开发软件IDE下载](下载站 - Sipeed)
- [官方文档](MaixPy 文档简介 - Sipeed Wiki)
- Sipeed MaixHub – sipeed AI 模型平台