目录
- 1. 作者介绍
- 2. YOLOv7网络模型
- 2.1 算法简介
- 2.2 数据集介绍
- 2.3 YOLO格式数据集制作
- 3. 代码实现
- 3.1 分割数据集
- 3.2 修改数据配置文件
- 3.3 修改训练代码,进行训练
- 3.4 修改测试代码,进行测试
- 3.5 检测结果
1. 作者介绍
曹宇欢,女,西安工程大学电子信息学院,2023级研究生
研究方向:模式识别与人工智能
电子邮件:1472644890@qq.com
张思怡,女,西安工程大学电子信息学院,2022级研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:981664791@qq.com
2. YOLOv7网络模型
2.1 算法简介
YOLOv7是一种面向对象检测算法,它利用单次神经网络前向传播实现高效检测并且通过将检测任务分解为多个子任务来完成,从而显著提高了检测的速度和精度。
注意:YOLOv7官方给出了相关论文及源码,地址如下
论文地址:https://arxiv.org/abs/2207.02696
论文代码下载地址:https://github.com/WongKinYiu/yolov7
上图展示了YOLOv7目标检测算法的整体网络结构。从图中可看出yolov7网络由三个部分组成:input,backbone和head,与yolov5不同的是,将neck层与head层合称为head层,实际上的功能的一样的。对各个部分的功能和yolov5相同,如backbone用于提取特征,head用于预测。
输入层主要是对输入的图片进行预处理,主要包括 Mosaic数据增强、自适应锚框计算、自适应图片缩放等操作。
主干网络主要功能是特征提取,主要包括CBS模块、ELAN模块和MP模块。CBS模块是由1个卷积层、1个归一化层和1个Silu激活函数层构成。ELAN模块由多个CBS模块构成,它通过控制最短和最长的梯度路径,使一个更深的网络同样可以有效地进行学习和收敛。MP模块的主要作用是进行下采样。
头部网络主要包括SPPCSPC模块、UP模块、ELAN-H模块和REP模块。SPP模块的作用是通过最大池化来增大感受野,提升模型精度。CSP模块的主要作用是减小计算量。它将特征分为两部分,其中一部分进行常规处理,另一部分进行SPP结构处理,最后再将两部分合并在一起。这样做可以减少计算量,而且还可以提升模型的精度。UP模块的主要作用是通过最近邻插值的方式进行上采样。ELAN-H模块与ELAN模块非常相似,不同的是ELAN-H模块选取的输出数量比ELAN模块多。REP模块在训练时将1个用于特征提取的3x3卷积、1个用于平滑特征的1x1卷积和1个无卷积操作融合在1个卷积层中,在推理时则重参数化1个3x3的卷积。
2.2 数据集介绍
在疫情期间,佩戴口罩是防止病毒传播的有效措施之一。基于YOLOv7的口罩检测可以帮助政府和公共卫生机构实时监控公共场所人员是否正确佩戴口罩,从而提高防疫措施的有效性。将口罩检测系统集成到现有的监控摄像头中,可以在公共场所(如车站、机场、商场、学校等)实时检测和提醒未佩戴口罩的人员,有助于提高公众卫生意识,减少传染病传播风险。因此,研究佩戴口罩的检测算法,具有重大的意义和广泛的应用价值。
使用网络上的工口罩检测数据集,该数据集共标注2个类别(‘mask’,‘no-mask’),下面给出该数据集下载链接:
口罩数据集百度网盘下载链接:https://pan.baidu.com/s/1Gud8jemSCdjG00TYA74WpQ
提取码:sv74
2.3 YOLO格式数据集制作
本文使用labelimg标注工具,标注了1000张左右作为训练集和验证,分了2个类别:mask,no-mask。
- 安装数据集制作工具
执行如下命令进行数据集制作工具的安装:pip install labelimg - 运行数据集制作工具
在Terminal执行如下命令打开labelimg、
Labelimg界面如下:
- 制作数据集
点击Open Dir打开待制作的图片文件(尽量将图片放在images目录下,以便进行数据集的分割),点击左侧的模式切换,将PascalVOC切换到YOLO模式
绘制box框,并指明标签,点击Create RectBox按钮绘制矩形边框并设置标签文本(no-mask),点击save保存样本标签信息(可以将标签文件存放在labels文件夹下,以便后续进行数据集的分割)
3. 代码实现
完整代码已打包到百度网盘:
链接:https://pan.baidu.com/s/1BsPmILw-Nnwn9ZT2anwQ3g
提取码:ddll
3.1 分割数据集
将数据集分割成训练集和验证集,同时可以根据RAIN_RATIO=80来调整训练集和验证集数据比例。
3.2 修改数据配置文件
将coco.yaml复制到新建的mask.yaml中,该步骤主要进行修改训练集、验证集、测试集的地址以及类别和名称。
修改cfg配置文件,主要将nc:修改为自己数据集的类别数。
3.3 修改训练代码,进行训练
修改预训练模型权重(在训练时使用的权重可以在yolov7的readme文档中自行下载用来进行模型的训练)、cfg路径、数据集路径
修改模型输出路径
训练轮数,默认为300,训练时间比较久,在这里可以将其修改成100;batch-size用来调整每批处理的图片数量,如果电脑显存较小,可以将其修改为2或4。
修改完成即可进行模型训练,生成的best.pt即为最佳模型参数。
3.4 修改测试代码,进行测试
修改模型参数文件(这里使用的权重即为训练时产生的最佳的权重best.pt),数据集路径。
检测文件参数修改,将source里边的default值改为0也可调用自己的摄像头进行实时检测。
3.5 检测结果
在训练阶段,使用YOLOv7算法对数据集进行训练,总计训练了300个epochs。从下图可以看出,随着训练次数的增加,模型的训练损失和验证损失都逐渐降低,说明模型不断地学习到更加精准的特征。在训练结束后,我们使用模型在数据集的验证集上进行了评估,得到了以下结果。
通过分析下述曲线,可以了解到模型在不同置信度下的性能表现。
下图则是输入指定图片进行检测的结果,也可根据上述代码的修改调用自己的摄像头进行实时检测。