基于YOLOv5的口罩检测方法
(一)实现方法
- Yolo v5模型结构
YOLOv5 的网络结构分为输入端、Backbone、Neck、输出端四个部分。如图1所示。

图1 YOLOv5网络结构
输入端主要包括 Mosaic 数据增强、图片尺寸处理以及自适应锚框计算三部分。Mosaic 数据增强将四张图片进行组合,达到丰富图片背景的效果;图片尺寸处理对不同长宽的原始图像自适应的添加最少的黑边,统一缩放为标准尺寸;自适应锚框计算在初始锚框的基础上,将输出预测框与真实框进行比对,计算差距后再反向更新,不断迭代参数来获取最合适的锚框值。
Backbone主要包含CSP 和Focus 模块。CSP模块前面的卷积核的大小都是3*3,stride=2,因此可以起到下采样的作用,采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。Focus 模块对图片进行切片操作,将输入通道扩充为原来的4倍,并经过一次卷积得到下采样特征图,在实现下采样的同时减少了计算量并提升了速度。
Neck 采用了FPN与PAN结合的结构,将常规的FPN层与自底向上的特征金字塔进行结合,将所提取的语义特征与位置特征进行融合,同时将主干层与检测层进行特征融合,使模型获取更加丰富的特征信息。
输出端 输出一个向量,该向量具有目标对象的类别概率、对象得分和该对象边界框的位置。检测网络由三层检测层组成,不同尺寸的特征图用于检测不同尺寸的目标对象。每个检测层输出相应的向量,最后生成原图像中目标的预测边界框和类别并进行标记。
- 数据集介绍
本文数据集结构如图2所示。

图2 数据集整体结构
其中,验证集300张,使用labelimg来为图片人工加上标签,有口罩为mask,没有则为face,一共标注300张图片。如图2所示。

图3 验证集图片标注
训练集1000张,测试集则从训练集中随机选出300张。以上三类数据集比例大致为2:6:2,符合yolo模型学习的规律。通过labelimg标注处理过的图片,会生成与图片对应的label(标签,txt文件),如图3所示。

图4 标注后的图片及对应的label
其中,txt中的1与0表示戴或不戴口罩,后面4个数值表示标签的x,y坐标与长,宽。
训练过程
(1)在models 文件夹下建立一个mask_yolov5s.yaml的模型配置文件,设nc =2表示这次训练的分类有两类:face和mask。在mask_data.yaml设定训练集和验证集数据的地址路径(images和 labels 文件夹一一对应),设定好训练的类数(两类),类名(mask,face)。如图4,图5所示。

图4 mask_yolov5s.yaml模型配置文件

图5 mask_data.yaml模型配置文件
(2)在终端输入以下指令:python train.py --data mask_data.yaml --cfg mask_yolov5s.yaml --weights pretrained/yolov5s.pt --epoch 50 --batch-size 4,表示读取扫描 mask_data.yaml的路径的数据集,借助yolo v5的预训练文件yolov5s.pt训练,设定训练参数(batch size)大小为4,训练50轮。
(3)训练成功后,权重文件和验证准确率的结果被存储在exp8文件夹,且输出所有类别(总共,face-人脸,mask-口罩)训练过程的各个指标(Precision,Recall,mAP0.5,mAP0.5:0.95)。如图6所示。

图6 模型训练过程结果
(4)yolov5每次训练完成(如果没有中途退出)都会在run目录下生成expX目录(X代表生成结果次数第一次训练完成生成exp0 第二次生成exp1......以此类推)。expX目录下会保存训练生成weights以及指标图。图7是ex8中模型训练过程中生成的一些指标图。

图7 模型训练过程中生成的指标图
(5)Loss曲线变化
模型训练(train)和验证(val)过程中的loss变化曲线如图8所示。

图8 模型训练过程中Loss曲线图
其中,从上到下,从左到右依次是:
box_loss:YOLOV5使用CIOULoss作为boundingbox的损失,Box为CIoU损失函数均值,方框越小识别越准。
val box:验证集bounding box损失。
object_loss:目标检测loss均值,越小目标检测越准。
val object_loss:验证集目标检测loss均值。
cls_loss:推测为分类loss均值,越小分类越准。
val cls_loss:验证集分类loss均值。
precision:精度(找对的正类/ 所有找到的正类)。
mAP_0.5:表示阈值大于0.5的平均mAP。
recall:真实为positive的准确率,即正样本有多少被找出来。
mAP0.5:0.95:表示在不同IoU阈值(从0.5到0.95,步长0.05)上的平均mAP
综上所述,模型在训练和验证过程中,loss不断变小趋近于0,精度不断变大趋近于1。
(二)实验结果
1,测试结果
以下为训练过程中产生的示例,8张合成一新图(上为labels表示打上标签,下为pred表示预测概率),实验部分结果如图9,图10,图11,图12所示。

图9 示例1(打标签)

图10 示例1(正确识别概率)

图11 示例2(打标签)

图12 示例2(正确识别概率)
(三)实验评价
本文采用混淆矩阵、F1分数(F1-score)和准确率precision作为本实验的评价指标。模型训练生成的混淆矩阵如图13所示。

图13 混淆矩阵结果
图13表示该模型在类别判断上的精度,左上的“face”为0.95,表示人脸检测精度在0.95左右,中间的mask为“0.99”,表示口罩检测精度在0.99左右。
F1分数(F1-score)是分类问题的一个衡量指标,是精确率precision和召回率recall的调和平均数,最大为1,最小为0,1是最好,0是最差。如下图14可知F1-score平均在0.96。

图14 模型F1分数
准确率precision和置信度confidence的关系曲线变化如图15所示,模型识别准确率趋近于1。

图14 precision-confidence变化曲线
(四)结论分析
根据模型输出的各项评价指标,本文所设计的基于YOLOv5的口罩检测模型的识别准确度还是比较理想的,基本上能够达到较为精确识别口罩与人脸的要求。
但是该方法还存在着一些问题:
(1)目前对数据集的训练要求需要有标签的数据图片,单纯使用labelimg对图片进行手工标签来区分face和mask确实有些麻烦,为了方便目前只能从网上下载特定的有标签图片,而且生成的标签必须符合 yolo 格式。
(2)Yolo v5确实性能更快,但其对于小目标的检测还是有一定的瓶颈,特别是大分辨率图像的小目标检测,如果采用直接对输入端输入高分辨率原图的方式,很多小目标都无法检测到。
更多推荐



所有评论(0)