戴口罩人脸检测和戴口罩识别(含Python Android源码)
目录
戴口罩人脸检测和戴口罩识别(含Python Android源码)
1.戴口罩识别的方法
(1)基于多类别目标检测的戴口罩识别方法
(2)基于人脸检测+戴口罩分类识别方法
2.戴口罩人脸数据集
3.戴口罩人脸检测
4.戴口罩识别模型训练
(1)准备数据
(2)戴口罩分类模型训练(Pytorch)
(3) 可视化训练过程
(4) 戴口罩识别效果
5.戴口罩识别模型Android部署
(1) 将Pytorch模型转换ONNX模型
(2) 将ONNX模型转换为TNN模型
(3) Android端上部署戴口罩识别
6.项目源码下载
当前疫情反反复复,而防控新冠病毒的最有效手段之一就是戴口罩,因此研究戴口罩检测和识别具有重大意义。疫情防控,人人有责,作为一名程序狗,分享一下鄙人开发的戴口罩人脸检测和戴口罩识别方法。目前项目开发的戴口罩识别(face-mask recognition)的准确率还挺高的,在resnet50,可以高达99%的准确率,即使采用轻量化版本MobileNet-v2,准确率也可以高达98.18%左右。
本项目将手把手教你训练一个戴口罩分类识别模型,包括如何转为ONNX,TNN模型,并移植到Android上进行部署,实现一个戴口罩识别的Android Demo APP 。数据和源码都已备好了,准备好上船吧~
Demo效果展示:
图片测试 | 视频测试 |
- 戴口罩人脸检测和戴口罩识别Android Demo APP免费体检
- 戴口罩人脸检测和戴口罩识别整套项目(含数据,训练代码,Android源码):戴口罩人脸检测和戴口罩识别(含Python Android源码)
整套项目项目,支持的主要内容主要有:
- 包含5个数据集: facemask-train1, facemask-train2,facemask-train3, synthetic-train1,synthetic-train2 ,facemask-test ,总共约有50000+的数据:
- 生成戴口罩人脸代码: python create_facemask.py
- 支持戴口罩人脸检测
- 支持戴口罩识别:mask(戴口罩)和nomask(未佩戴口罩)
- 提供戴口罩识别Python Demo源码,在普通电脑CPU/GPU上可以实时检测和识别
- 提供戴口罩识别Android Demo源码,在普通手机CPU/GPU上可以实时检测和识别,约30ms左右
1.戴口罩识别的方法
(1)基于多类别目标检测的戴口罩识别方法
基于多类别目标检测的戴口罩识别方法,一步到位,把未戴口罩(nomask)和戴口罩(mask)两个类别直接当成两个目标检测的类别进行训练
- 优点:直接端到端训练,任务简单,速度快
- 缺点:需要人工标注人脸框mask和nomask,时间花费比较大;训练数据不足的情况下,容易出现误检测的情况
(2)基于人脸检测+戴口罩分类识别方法
该方法,先采用通用的人脸检测模型,进行人脸检测,然后裁剪人脸区域,再训练一个戴口罩分类器,对人脸进行分类识别(未戴口罩和戴口罩)
- 优点:不需要标注人脸框数据,可以自己合成戴口罩人脸数据,人工成本低;精度高,可针对分类模型进行轻量化
- 缺点:需要部署两个模型(人脸检测模型和戴口罩分类模型),人脸越多,速度越慢
考虑到数据标注成本的问题,本项目采用第二种方法,即采用基于人脸检测+戴口罩分类识别方法
2.戴口罩人脸数据集
网上绝大部分人脸数据都是不戴口罩的人脸,不能直接用于戴口罩识别中。鉴于此,我们可以考虑自己合成/生成戴口罩的人脸数据,以下是鄙人收藏和整理的戴口罩人脸数据集和合成的数据集,总共约有50000+的数据:
原始图片 | 生成戴口罩人脸 |
关于戴口罩人脸数据和生成方法,详细使用说明请参考我的一篇博客《戴口罩人脸数据集和戴口罩人脸生成方法》
数据集 | 说明 |
facemask-train1 |
|
facemask-train2 |
|
facemask-train3 |
|
synthetic-train1 |
|
synthetic-train2 |
|
facemask-test |
|
3.戴口罩人脸检测
通常我们理解的人脸检测是指没有遮挡或者只有少许遮挡情况下的人脸检测,当人脸戴有口罩,其检测效果势必会变得比较差,而大量标注带有人脸口罩的人脸数据集还是比较耗时费力的。所以我的方法是:
先在WiderFace人脸数据集上,训练人脸检测;然后在facemask-train1数据集finetune人脸检测模型,经过这个方法训练后,其戴口罩检测效果会好很多。
当然,即使使用开源的人脸检测算法,在带有口罩人脸检测,其实效果也不会太差,比如使用FaceBox,MTCNN检测带有口罩的图片,效果也可以的,只不过会经常出现人脸检测框不完整,存在缺少等问题,对后续的戴口罩的识别有一定的影响。
关于人脸检测的方法,可以参考我的另一篇博客
4.戴口罩识别模型训练
本项目将手把手教你训练一个戴口罩分类识别模型,包括如何转为ONNX,TNN模型,并移植到
Android上进行部署,实现一个戴口罩识别的Android APP Demo
整套工程项目基本结构如下:
(1)准备数据
总共有5个数据集,包括 facemask-train1, facemask-train2,facemask-train3,synthetic-train1,synthetic-train2 ,facemask-test ,总共约有50000+的数据。
当然,你也可以使用自己的数据集,数据结构如下,其中mask目录存放戴口罩的人脸图片,而nomask目录存放未戴口罩的人脸图像。
(2)戴口罩分类模型训练(Pytorch)
鄙人在《Pytorch基础训练库Pytorch-Base-Trainer(支持模型剪枝 分布式训练)》基础上实现了戴口罩和未佩戴口罩二分类识别训练和测试,整套训练代码非常简单操作,用户只需要将相同类别的数据放在同一个目录下,并填写好对应的数据路径,即可开始训练了。
训练框架采用Pytorch,整套训练代码支持的内容主要有:
- 目前支持的backbone有:googlenet,resnet[18,34,50], ,mobilenet_v2等, 其他backbone可以自定义添加
- 训练参数可以通过(configs/config.yaml)配置文件进行设置
训练参数说明如下:
开始训练:
训练完成后,训练集的Accuracy在99%以上,测试集的Accuracy在98%左右
(3) 可视化训练过程
训练过程可视化工具是使用Tensorboard,使用方法:
可视化效果
(4) 戴口罩识别效果
5.戴口罩识别模型Android部署
(1) 将Pytorch模型转换ONNX模型
训练好Pytorch模型后,你可以将模型转换为ONNX模型,方便后续模型部署
(2) 将ONNX模型转换为TNN模型
目前CNN模型有多种部署方式,可以采用TNN,MNN,NCNN,以及TensorRT等部署工具,鄙人采用TNN进行Android端上部署:
将ONNX模型转换为TNN模型,请参考TNN官方说明:
(3) Android端上部署戴口罩识别
项目实现了Android版本的戴口罩识别Demo,部署框架采用TNN,支持多线程CPU和GPU加速推理,在普通手机上可以实时处理。戴口罩识别Android源码,核心算法均采用C++实现,上层通过JNI接口调用.
如果你想在这个Android Demo部署你自己训练的分类模型,你可将训练好的Pytorch模型转换ONNX ,再转换成TNN模型,然后把TNN模型代替你模型即可。
6.项目源码下载
整套项目源码内容包含:
- 包含5个数据集: facemask-train1, facemask-train2,facemask-train3, synthetic-train1,synthetic-train2 ,facemask-test ,总共约有50000+的数据:
- 生成戴口罩人脸代码: python create_facemask.py
- 戴口罩分类模型训练和测试代码 Pytorch版本,测试Demo在普通电脑CPU/GPU上可以实时检测和识别
- 戴口罩识别Android Demo源码,支持CPU和GPU,在普通手机上可以实时检测和识别,约30ms左右
- 戴口罩人脸检测和戴口罩识别Android Demo APP免费体检
- 戴口罩人脸检测和戴口罩识别整套项目(含数据,训练代码,Android源码):戴口罩人脸检测和戴口罩识别(含Python Android源码)