赞
踩
AIZOO 数据集:https://github.com/AIZOOTech/FaceMaskDetection
RMFD 数据集 https://github.com/X-zhangyang/Real-World-Masked-Face-Dataset
自定义数据集:爬虫收集类似手捂脸等挡住脸的图片,并进行标注。
Windows10 + CUDA10.1 + OpenCV3.4.10 + python3.7 + VisualStudio2019
1) 输入端:Mosaic 数据增强,cmBN,SAT 自对抗训练。
Mosaic 数据增强
2)BackBone:CSPDarknet53,Mish激活函数,Dropblock
CSPDarknet53:
Mish激活函数:主干网络中使用Mish激活函数
Dropblock:缓解过拟合的一种正则化方式
3) Neck:SPP模块,FPN + PAN 结构
SPP:采用 1 × 1,5 × 5,9 × 9,13 × 13的最大池方式,进行多尺度融合,对任意尺寸的输入产生固定大小的输出
PAN:Path Aggregation Network for Instance Segmentation(以FPN为基准)
4) Prediction:训练时的损失函数 CIOU_Loss,预测框筛选的nms变为 DIOU_nms
CIOU Loss
DIOU_nms
CBM:Conv + BN + Mish,用于主干网络 BackBone
CBL:Conv + BN + Leaky relu
Res unit:Resnet 网络中的残差结构,可以构建更深的网络。
CSPX:每个CSP模块前面的卷积核大小都是 3 × 3,可以起到下采样的作用。
SPP:采用 1 × 1,5 × 5,9 × 9,13 × 13的最大池处理。
对数据集进行清洗筛选后,共有 110200张图片:AIZOO 数据集(8000 张),RMFD 数据集( 3000 张),自定义数据集(200张)。
使用 labelImg 工具对所有图片进行标注(mask 和 nomask),生成xml文件。
1)环境要求:
2)编译:
- git clone https://github.com/AlexeyAB/darknet.git
- cd darknet
.build.ps1
3)检查是否编译成功:
darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights data/dog.jpg
创建 VOCdevkit/VOC2007/Annotations
,存放 xml 文件。
创建 VOCdevkit/VOC2007/JPEImages
,存放图片文件。
VOCdevkit/VOC2007/JPEImages
里的图片。VOCdevkit/VOC2007/labels
中。1)cfg文件配置:复制 yolov4-custom.cfg
到 yolo-mask.cfg
,创建自己的模型配置文件。
模型配置
classes=80
--> classes=2
(根据需要预测的分类数设置)[filters=255]
--> [fiters=21]
(filter=(classes + 5) × 3)训练参数配置
batch=64
,subdivisions=16
(根据电脑配置而定)width=416
和 height=416
(任何32的倍数均可,由于训练是有GPU内存溢出问题,我选了比较小的数,值越高精度越高)max_batches=10000
(标准为 classes × 2000,想试看看训练10000次会出现什么效果)steps=8000, 9000
(这里是 max_batches 的 80% 和 90%)2)mask.names:data
目录中创建 mask.names
- nomask
- mask
3)mask.data:data
目录中创建 mask.data
- classes= 2
- train = mask_train.txt
- valid = mask_test.txt
- names = data/mask.names
- backup = backup/ # 训练保存权重的位置
4)下载预训练的权重
https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137
5)开始训练
darknet.exe detector train data/mask.data cfg/yolo-mask.cfg yolov4.conv.137
如需查看训练效果可以使用 mAP 计算进行训练。
darknet.exe detector train data/mask.data cfg/yolo-mask.cfg yolov4.conv.137 -map
迭代大概了4000步的效果图,mAP已经达到了91%(单个CPU:NVIDIA GeForce GTX 1050 Ti,训练了快24个小时)。
loss 值已经趋向平稳,再迭代下去应该也得不到多大的提升了,最终还是训练迭代了10000次(训练了55个小时),结果提升了1%的mAP。
yolov4-mask.cfg
到 yolo-mask-test.cfg
,并修改 batch=1
, subdivisions=1
yolov4-mask.cfg
程序也会自动修改 batch
和 subdivisions
的值,但为了保险起见,进行了手动修改。1)图片测试
darknet.exe detector test data/mask.data cfg/yolov4-mask-test.cfg backupyolov4-mask_best.weights testfiles/test.jpg
能够正确识别有除口罩外的遮挡物,如花、手机、手捂脸等。
能够正确识别有无佩戴口罩。
2)视频测试
darknet.exe detector demo data/mask.data cfg/yolov4-mask-test.cfg backupyolov4-mask_best.weights testfiles/test.mp4
在人数多的时候也能正确识别。
知乎视频www.zhihu.com统计 mAP@IoU=0.50:
darknet.exe detector map data/mask.data cfg/yolov4-mask-test.cfg backupyolov4-mask_best.weights
mAP@0.50 = 92.23%,得到了不错的效果。
统计 mAP@IoU=0.75:
darknet.exe detector map data/mask.data cfg/yolov4-mask-test.cfg backupyolov4-mask_best.weights -iou_thresh 0.75
默认的 anchors 为:
anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401
使用 K-means++ 聚类 获得自己数据集的先验框大小。
darknet.exe detector calc_anchors data/mask.data -num_of_clusters 9 -width 416 -height 416
结果存放在 anchors.txt 文件中:
anchors = 7, 13, 18, 29, 35, 49, 65, 61, 49, 101, 96, 102, 96, 168, 157, 197, 223, 270
修改 cfg/yolo-mask.cfg 文件中的先验框大小。
重新训练和测试,查看性能是否有所提升。
传统的NMS方法:Greedynms,YoloV4 的NMS方法:Diounms。
本文先采用传统的 Greedynms 进行训练,后用 Diounms 进行训练,看性能是否能得到提升。
修改 cfg/yolo-mask.cfg 文件中的 nms_kind 值:
nms_kind = diounms
重新训练和测试,查看性能是否有所提升。
本文在理想状态下(假设口罩佩戴规范)对有无戴口罩进行检测,并未考虑口罩佩戴不规范的情况:如佩戴口罩是否完全包住鼻子、是否戴反或是上下颠倒等情况。
错误检测人脸:将其他类似人脸的情况错误检测为人脸。
可针对口罩佩戴不规范的情况,增加这一类型的数据集,分为三类结果(mask,badmask, nomask),重新修改模型进行训练。
针对错误检测人脸的情况,检查检测错误的图片,统计分类错误率高的类型,增加该类型场景的数据,对模型进行微调或重新进行训练。
YOLOV4论文:https://arxiv.org/abs/2004.10934
Mish激活函数:https://arxiv.org/abs/1908.08681
Dropblock:https://arxiv.org/abs/1810.12890
FPN:https://arxiv.org/abs/1612.03144
PAN:https://arxiv.org/abs/11803.01534
SSP:https://arxiv.org/abs/1406.4729
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。