(一)实现方法

  1. 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层与自底向上的特征金字塔进行结合,将所提取的语义特征与位置特征进行融合,同时将主干层与检测层进行特征融合,使模型获取更加丰富的特征信息。

输出端 输出一个向量,该向量具有目标对象的类别概率、对象得分和该对象边界框的位置。检测网络由三层检测层组成,不同尺寸的特征图用于检测不同尺寸的目标对象。每个检测层输出相应的向量,最后生成原图像中目标的预测边界框和类别并进行标记。

  1. 数据集介绍

本文数据集结构如图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确实性能更快,但其对于小目标的检测还是有一定的瓶颈,特别是大分辨率图像的小目标检测,如果采用直接对输入端输入高分辨率原图的方式,很多小目标都无法检测到。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐