Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集)

目录

Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集)

1.戴口罩识别的方法

(1)基于多类别目标检测的戴口罩识别方法

(2)基于人脸检测+戴口罩分类识别方法

2.戴口罩人脸数据集

3.戴口罩人脸检测

4.戴口罩识别模型训练

(1)准备数据

(2)戴口罩分类模型训练(Pytorch)

(3) 可视化训练过程

(4) 戴口罩识别效果

(5) 一些运行错误处理方法

5.项目源码下载(Python版)

6.项目源码下载(Android版)


当前疫情反反复复,而防控新冠病毒的最有效手段之一就是戴口罩,因此研究戴口罩检测和识别具有重大意义。疫情防控,人人有责,作为一名程序狗,分享一下鄙人开发的戴口罩人脸检测和戴口罩识别方法。项目开发基于深度学习框架Pytorch开发一套的戴口罩识别(face-mask recognition)识别系统,目前准确率还挺高的,在resnet50,可以高达99%的准确率,即使采用轻量化版本MobileNet-v2,准确率也可以高达98.18%左右。

【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/125428609

先展示一下,Python版本的戴口罩人脸检测和戴口罩识别Demo效果:


戴口罩人脸检测和戴口罩识别整套Python代码下载: Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集)

整套项目项,支持的主要内容主要有:

  1. 提供5个戴口罩人脸数据集:  facemask-train1,  facemask-train2,facemask-train3,  synthetic-train1,synthetic-train2 ,facemask-test ,总共约有50000+的数据:
  2. 提供生成戴口罩人脸代码: python create_facemask.py
  3. 提供戴口罩分类识别训练代码:train.py
  4. 提供戴口罩分类识别测试代码:demo.py
  5. demo支持戴口罩人脸检测,支持戴口罩识别:mask(戴口罩)和nomask(未佩戴口罩)
  6. 提供戴口罩识别Python Demo源码,在普通电脑CPU/GPU上可以实时检测和识别

如果你需要Android版本的戴口罩人脸检测和戴口罩识别,请参考《Android实现戴口罩人脸检测和戴口罩识别(附Android源码)》https://panjinquan.blog.csdn.net/article/details/128404379


1.戴口罩识别的方法

(1)基于多类别目标检测的戴口罩识别方法

基于多类别目标检测的戴口罩识别方法,一步到位,把未戴口罩(nomask)和戴口罩(mask)两个类别直接当成两个目标检测的类别进行训练

  • 优点:直接端到端训练,任务简单,速度快
  • 缺点:需要人工标注人脸框mask和nomask,时间花费比较大;训练数据不足的情况下,容易出现误检测的情况

(2)基于人脸检测+戴口罩分类识别方法

该方法,先采用通用的人脸检测模型,进行人脸检测,然后裁剪人脸区域,再训练一个戴口罩分类器,对人脸进行分类识别(未戴口罩和戴口罩)

  • 优点:不需要标注人脸框数据,可以自己合成戴口罩人脸数据,人工成本低;精度高,可针对分类模型进行轻量化
  • 缺点:需要部署两个模型(人脸检测模型和戴口罩分类模型),人脸越多,速度越慢

考虑到数据标注成本的问题,本项目采用第二种方法,即采用基于人脸检测+戴口罩分类识别方法


2.戴口罩人脸数据集

网上绝大部分人脸数据都是不戴口罩的人脸,不能直接用于戴口罩识别中。鉴于此,我们可以考虑自己合成/生成戴口罩的人脸数据,以下是鄙人收藏和整理的戴口罩人脸数据集和合成的数据集,总共约有50000+的数据:

原始图片 生成戴口罩人脸

关于戴口罩人脸数据和生成方法,详细使用说明请参考我的一篇博客《戴口罩人脸数据集和戴口罩人脸生成方法》

数据集 说明
facemask-train1
  • 从网上收集的戴口罩人脸数据集(如virus-mask-dataset),约7000+张图片,并清洗了部分标注错误的样本
  • 每张图片都被标注了mask(戴口罩)和nomask(未佩戴口罩)的检测框
  • 标注格式为标准的VOC xml格式,可用于人脸检测训练数据使用
  • 已经裁剪了人脸区域,并清洗了部分标注错误的样本;其中mask(戴口罩)人脸有3000+张,nomask(未佩戴口罩)人脸有10000+张,可作为分类训练数据集,
facemask-train2
  • 从网上收集的戴口罩人脸数据集,约3500+张图片,
  • 每张图片都被标注了mask(戴口罩)和nomask(未佩戴口罩)的检测框
  • 标注格式为标准的VOC格式,但标注的人脸框比较大,不建议用于人脸检测训练数据使用
  • 已经裁剪了人脸区域图像,并清洗了部分标注错误的样本;其中mask(戴口罩)人脸有2000+张,nomask(未佩戴口罩)人脸有6000+张,可作为分类训练数据集
facemask-train3
  • 从网上收集的戴口罩人脸数据集,其中mask(戴口罩)人脸有600+张,nomask(未佩戴口罩)人脸有1700+张,可作为分类训练数据集
  • 原始图片都被裁剪为人脸图像了,所以不合适用于人脸检测;可作为分类训练数据集
synthetic-train1
  • 这是合成的戴口罩人脸数据
  • 其中mask(戴口罩)人脸有7000+张,nomask(未佩戴口罩)人脸有7000+张,可作为分类训练数据集
synthetic-train2
  • 这是合成的戴口罩人脸数据
  • 其中mask(戴口罩)人脸有6000+张,nomask(未佩戴口罩)人脸有6000+张,可作为分类训练数据集
facemask-test
  • 这是戴口罩人脸测试集
  • 其中mask(戴口罩)人脸有300+张,nomask(未佩戴口罩)人脸有300+张,用于分类模型测试

3.戴口罩人脸检测

通常我们理解的人脸检测是指没有遮挡或者只有少许遮挡情况下的人脸检测,当人脸戴有口罩,其检测效果势必会变得比较差,而大量标注带有人脸口罩的人脸数据集还是比较耗时费力的。所以我的方法是:

先在WiderFace人脸数据集上,训练人脸检测;然后在facemask-train1数据集finetune人脸检测模型,经过这个方法训练后,其戴口罩检测效果会好很多。

当然,即使使用开源的人脸检测算法,在带有口罩人脸检测,其实效果也不会太差,比如使用FaceBox,MTCNN检测带有口罩的图片,效果也可以的,只不过会经常出现人脸检测框不完整,存在缺少等问题,对后续的戴口罩的识别有一定的影响。

关于人脸检测的方法,可以参考我的另一篇博客:《行人检测和人脸检测和人脸关键点检测(C++/Android源码)》


4.戴口罩识别模型训练

有了戴口罩人脸检测,接下来就可以开始训练戴口罩分类识别模型;考虑到后续我们需要将戴口罩识别模型部署到Android平台中,因此项目选择计算量比较小的轻量化模型(mobilenet_v2)

整套工程项目基本结构如下:

.
├── classifier                 # 训练模型相关工具
├── configs                    # 训练配置文件
├── data                       # 训练数据
├── libs
│   ├── convert                     # 将模型转换为ONNX工具
│   ├── facemask                    # 戴口罩人脸数据生成工具
│   ├── light_detector              # 人脸检测
│   ├── create_facemask.py          #  戴口罩人脸数据生成demo
│   ├── detector.py                 #  人脸检测demo
│   └── README.md
├── demo.py              # 戴口罩人脸识别demo
├── README.md            # 项目工程说明文档
├── requirements.txt     # 项目相关依赖包
└── train.py             # 训练文件

项目依赖python包请参考requirements.txt,使用pip安装即可:

numpy==1.16.3
matplotlib==3.1.0
Pillow==6.0.0
easydict==1.9
opencv-contrib-python==4.5.2.52
opencv-python==4.5.1.48
pandas==1.1.5
PyYAML==5.3.1
scikit-image==0.17.2
scikit-learn==0.24.0
scipy==1.5.4
seaborn==0.11.2
tensorboard==2.5.0
tensorboardX==2.1
torch==1.7.1+cu110
torchvision==0.8.2+cu110
tqdm==4.55.1
xmltodict==0.12.0
basetrainer
pybaseutils==0.6.5

(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)配置文件进行设置

训练参数说明如下:

# 设置训练数据集,支持多个训练数据集
train_data:- 'dataset/face_mask/facemask-train1/crops'- 'dataset/face_mask/facemask-train2/crops'- 'dataset/face_mask/facemask-train3/crops'- 'dataset/face_mask/synthetic-train1/crops'- 'dataset/face_mask/synthetic-train1/crops'# 设置测试数据集
test_data: 'dataset/face_mask/facemask-test/crops'
class_name: 'dataset/face_mask/class_name.txt' # 类别标签
train_transform: "train" # 训练使用的数据增强方法
test_transform: "val"    # 测试使用的数据增强方法
work_dir: "work_space/"  # 保存输出模型的目录
net_type: "mobilenet_v2" # 骨干网络,支持:resnet18,mobilenet_v2,googlenet
resample: True           # 进行样本均衡
width_mult: 1.0
input_size: [ 128,128 ]
rgb_mean: [ 0.5, 0.5, 0.5 ]  # for normalize inputs to [-1, 1],Sequence of means for each channel.
rgb_std: [ 0.5, 0.5, 0.5 ]   # for normalize,Sequence of standard deviations for each channel.
batch_size: 64
lr: 0.01 # 初始学习率
optim_type: "SGD"            # 选择优化器,SGD,Adam
loss_type: "LabelSmoothing"  # 选择损失函数:支持CrossEntropyLoss,LabelSmoothing
momentum: 0.9                # SGD momentum
num_epochs: 100              # 训练循环次数
num_warn_up: 3               # warn-up次数
num_workers: 8               # 加载数据工作进程数
weight_decay: 0.0005         # weight_decay,默认5e-4
scheduler: "multi-step"      # 学习率调整策略
milestones: [ 20,50,80 ]     # 下调学习率方式
gpu_id: [ 0 ]                # GPU ID
log_freq: 50                 # LOG打印频率
progress: True               # 是否显示进度条
pretrained: False            # 是否使用pretrained模型
finetune: False              # 是否进行finetune

开始训练:

python train.py -c configs/config.yaml

训练完成后,训练集的Accuracy在99%以上,测试集的Accuracy在98%左右

(3) 可视化训练过程

训练过程可视化工具是使用Tensorboard,使用方法:
# 基本方法
tensorboard --logdir=path/to/log/
# 例如
tensorboard --logdir=work_space/mobilenet_v2_1.0_CrossEntropyLoss/log

可视化效果

​​
​​ ​​
​​ ​​

(4) 戴口罩识别效果

  • 测试图片文件
# 测试图片
image_dir='data/test_image' # 测试图片的目录
model_file="data/pretrained/mobilenet_v2_1.0_CrossEntropyLoss/model/best_model_078_98.3498.pth" # 模型文件
out_dir="output/" # 保存检测结果
python demo.py --image_dir $image_dir --model_file $model_file --out_dir $out_dir
  • 测试视频文件
# 测试视频文件
video_file="data/video.mp4" # 测试视频文件,如*.mp4,*.avi等
model_file="data/pretrained/mobilenet_v2_1.0_CrossEntropyLoss/model/best_model_078_98.3498.pth" # 模型文件
out_dir="output/" # 保存检测结果
python demo.py --video_file $video_file --model_file $model_file --out_dir $out_dir
  • 测试摄像头
# 测试摄像头
video_file=0 # 测试摄像头ID
model_file="data/pretrained/mobilenet_v2_1.0_CrossEntropyLoss/model/best_model_078_98.3498.pth" # 模型文件
out_dir="output/" # 保存检测结果
python demo.py --video_file $video_file --model_file $model_file --out_dir $out_dir

(5) 一些运行错误处理方法

  • cannot import name 'load_state_dict_from_url' 

由于一些版本升级,会导致部分接口函数不能使用,请确保版本对应

torch==1.7.1

torchvision==0.8.2

或者将对应python文件将

from torchvision.models.resnet import model_urls, load_state_dict_from_url

修改为:

from torch.hub import load_state_dict_from_url
model_urls = {'mobilenet_v2': 'https://download.pytorch.org/models/mobilenet_v2-b0353104.pth','resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth','resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth','resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth','resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth','resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth','resnext50_32x4d': 'https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth','resnext101_32x8d': 'https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth','wide_resnet50_2': 'https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth','wide_resnet101_2': 'https://download.pytorch.org/models/wide_resnet101_2-32ee1156.pth',
}

5.项目源码下载(Python版)

整套项目源码内容包含:Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集)

  1. 提供5个戴口罩人脸数据集:  facemask-train1,  facemask-train2,facemask-train3,  synthetic-train1,synthetic-train2 ,facemask-test ,总共约有50000+的数据:
  2. 提供生成戴口罩人脸代码: python create_facemask.py
  3. 提供戴口罩分类识别训练代码:train.py
  4. 提供戴口罩分类识别测试代码:demo.py
  5. demo支持戴口罩人脸检测,支持戴口罩识别:mask(戴口罩)和nomask(未佩戴口罩)
  6. 提供戴口罩识别Python Demo源码,在普通电脑CPU/GPU上可以实时检测和识别

6.项目源码下载(Android版)

目前已经实现Android版本的戴口罩人脸检测和戴口罩识别,详细项目请参考《Android实现戴口罩人脸检测和戴口罩识别(附Android源码)》https://panjinquan.blog.csdn.net/article/details/128404379

戴口罩人脸检测和戴口罩识别Android Demo APP体检:https://pan.baidu.com/s/1meGv_J6xZiDvXzvXBzNnHA 提取码: 73e5 或者戴口罩人脸检测和戴口罩识别AndroidDemoAPP-Android文档类资源-CSDN下载

Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集)相关推荐

  1. Pytorch实现中药材(中草药)分类识别(含训练代码和数据集)

    Pytorch实现中药材(中草药)分类识别(含训练代码和数据集) 目录 Pytorch实现中药材(中草药)分类识别(含训练代码和数据集) 1. 前言 2. 中药材(中草药)数据集说明 (1)中药材(中 ...

  2. 家庭服务机器人的人脸检测、跟踪与识别研究

    摘要:本文介绍了一个用于家庭服务机器人完成人脸检测.跟踪.识别的双目视觉系统.该系统首先采用人脸肤色模型结合相似度来检测人脸:然后通过基于颜色信息的CAMSHIFT算法跟踪运动的人脸:最后利用嵌入式隐 ...

  3. 亚马逊Rekognition发布针对人脸检测、分析和识别功能的多项更新

    今天亚马逊Rekognition针对人脸检测.分析和识别功能推出了一系列更新.这些更新将为用户带来多项能力的改今,包括从图像中检测出更多人脸.执行更高精度的人脸匹配以及获得图像中的人脸得到更准确的年龄 ...

  4. 摄像头人脸检测的树莓派指纹识别系统

    摄像头人脸检测的树莓派指纹识别系统 前言:此项目主要用了摄像头.指纹识别.继电器.Led模块等设备.用于实现智能门锁功能,即摄像头检测到人来之后,打开继电器给指纹模块供电,led显示文字. 代码: i ...

  5. github优秀项目分享:基于yolov3的轻量级人脸检测、增值税发票OCR识别 等8大项目...

    点击上方"机器学习与生成对抗网络",关注"星标" 获取有趣.好玩的前沿干货! 文章来源:七月在线实验室 01  yolo-face-with-landmark ...

  6. 跳过人脸检测和关键点定位,Facebook等提出实时3D人脸姿态估计新方法

    本文转载自机器之心. 来自 Facebook AI 和美国圣母大学的研究者提出了一种 6 自由度的实时 3D 人脸姿态估计技术,可以不依赖人脸检测和人脸关键点定位独立运行. 人脸检测是给照片中的每个人 ...

  7. 用浏览器做人脸检测,竟然这么简单?(附代码)

    1.背景与场景 人脸检测(Face Detection)算是老生常谈的课题了,在诸多行业应用广泛,例如金融.安防.电子商务.智能手机.娱乐图片等行业.其中涉及的技术也在不断的演变,下面简要介绍几种思路 ...

  8. opencv-python 人脸检测,边缘检测,识别形状,图像分割,OCR,OMR,验证码识别,二维码识别,行人检测等应用解决思路

    opencv-python作为经典的计算机视觉,图片处理平台,可以用来开发很多基础应用,关于opencv-python里边函数的应用小结如下,欢迎讨论: 人脸检测 一般用 haarCascade 车牌 ...

  9. python人脸检测与微信小程序_微信小程序实现人脸检测功能

    本文为大家分享了微信小程序实现人脸检测的具体代码,供大家参考,具体内容如下 因为本文章的人脸检测技术运用的是百度云人工智能,首先要有百度云的账号. 近期,人脸识别已经升级到了V3,开启了测试,所以也依 ...

最新文章

  1. Nature综述:古菌的多样性、生态功能和进化史
  2. 数据库设计准则(第一、第二、第三范式说明)
  3. Android UI线程和非UI线程
  4. C++ 简单的语音合成(TTS,即文字转语音)类
  5. java 注解应用技巧_改善Java应用程序性能的快速技巧
  6. 指向二维数组的指针测试
  7. Python---爬虫案例
  8. 他们调查了3.9万名程序员,制作了这份开发者技能报告
  9. 大数据数据收集数据困难_工厂质量成本数据收集流程、方案
  10. Odoo10参考系列--Odoo指导方针
  11. 【EOS】2.3 深入理解ABI文件
  12. apache tomcat ajp协议安全限制绕过漏洞_【高危安全通告】Apache Tomcat 文件包含漏洞(CVE20201938)...
  13. 人工智能与心理学(人工智能最终方向)
  14. 安装和维护ImageJ
  15. Android Studio 工具栏添加图标
  16. 面试时,你会问面试官哪些问题?
  17. 处理器架构 (八) armv4v5v6 架构参考手册(4) Debug架构
  18. 左耳朵耗子:我做系统架构的一些原则
  19. 聊聊我在职场的至暗时刻!
  20. Java中变量声明使用,内存分析,数据类型常见码表详解

热门文章

  1. 【javaweb学习笔记】servlet-api,filter和Listener
  2. 自然语言处理-哈工大笔记
  3. 【html画板】网页画板绘画效果
  4. 程序员之天梯排行榜,谁是榜首?
  5. 商人的诀窍 结构体
  6. IDEA中,写代码在中间插入字符时会把后面的字符覆盖掉
  7. 2.1.6.6 漏洞利用-SSH安全防御
  8. 最新天气预报接口【2015-05-14改】
  9. WiFi Easy Connect简介
  10. 关于舵机的漂移与不听指挥乱动的问题