基于YOLOv5实现安全帽检测识别

1、作者介绍

陈梦丹,女,西安工程大学电子信息学院,2022级研究生
研究方向:机器视觉与人工智能
电子邮件:[email protected]

2、YOLOv5网络模型

2.1 算法简介

YOLOv5是一种单阶段、有监督目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使其速度与精度都得到了极大的性能提升。主要的改进思路如下所示:

  • 输入端:在模型训练阶段,提出了一些改进思路,主要包括Mosaic数据增强、自适应锚框计算、自适应图片缩放
  • 基准网络:融合其它检测算法中的一些新思路,主要包括:Focus结构与CSP结构
  • Neck网络:目标检测网络在BackBone与最后的Head输出层之间往往会插入一些层,Yolov5中添加了FPN+PAN结构
  • Head输出层:输出层的锚框机制与YOLOv4相同,主要改进的是训练时的损失函数GIOU_Loss,以及预测框筛选的DIOU_nms

注意:YOLOv5官方未给出相关论文,但是公开了源码。
源码下载地址:
YOLOv5官方源码:https://github.com/ultralytics/yolov5

在这里插入图片描述
上图展示了YOLOv5目标检测算法的整体框图。对于一个目标检测算法而言,我们通常可以将其划分为4个通用的模块,具体包括:输入端、基准网络、Neck网络与Head输出端,对应于上图中的4个红色模块:

  • 输入端表示输入的图片。该网络的输入图像大小为608*608,该阶段通常包含一个图像预处理阶段,即将输入图像缩放到网络的输入大小,并进行归一化等操作。在网络训练阶段,YOLOv5使用Mosaic数据增强操作提升模型的训练速度和网络的精度;并提出了一种自适应锚框计算与自适应图片缩放方法。
  • 基准网络通常是一些性能优异的分类器种类的网络,该模块用来提取一些通用的特征表示。YOLOv5中不仅使用了CSPDarknet53结构,而且使用了Focus结构作为基准网络。
  • Neck网络通常位于基准网络和头网络的中间位置,利用它可以进一步提升特征的多样性及鲁棒性。虽然YOLOv5同样用到了SPP模块、FPN+PAN模块,但是实现的细节有些不同。
  • Head输出端用来完成目标检测结果的输出。针对不同的检测算法,输出端的分支个数不尽相同,通常包含一个分类分支和一个回归分支。YOLOv4利用GIOU_Loss来代替Smooth L1 Loss函数,从而进一步提升算法的检测精度。

2.2 数据集介绍

安全帽是作业场所作业时头部防护所用的头部防护用品,它对使用者的头部在受坠落物或小型飞溅物体等其他因素引起的伤害起到防护作用。因此,研究佩戴安全帽的监测算法,具有重大的意义和广泛的应用价值。

使用网络上开源工地安防数据集,共计照片:1200张,该数据集共标注6个类别(‘person’,‘vest’,‘blue helmet’,‘red helmet’,‘white helmet’,‘yellow helmet’),下面给出该数据集下载链接:

安全帽数据集百度网盘下载链接:
https://pan.baidu.com/s/1CQxAY5dcrsWzYfvjJ7wHAw
提取码:zhao

2.2.1 VOC数据集准备

本文使用labelimg标注工具,标注了300张左右作为训练集和验证,分了7个类别:red、yellow、blue、white、orange、black、person,该数据集及包含训练完的权重best.pt的项目完整代码获取方式如下:

百度网盘链接:
https://pan.baidu.com/s/1sZBfSdfEqE3ftnsklj7L5A
提取码:chmd

VOC2007数据集准备大概流程:
在这里插入图片描述
一、使用PASCAL VOC数据集的目录结构:

  • 文件夹层次为 yolov5 / VOCdevkit / VOC2007
  • VOC2007下面建立两个文件夹:Annotations和JPEGImages
  • JPEGImages放所有的训练和测试图片;Annotations放所有的xml标记文件

在这里插入图片描述
二、 使用标注工具labelimg,对目标进行拉框标注。
首先通过Anaconda安装labelimg,在Anaconda命令行窗口中依次输入下列代码,安装labelimg依赖的第三方库。

# 进入自己创建的虚拟环境
conda activate mytorch

# 安装相关的库
pip install PyQt5 -i https://pypi.douban.com/simple
pip install pyqt5-tools -i https://pypi.douban.com/simple 
pip install lxml -i https://pypi.douban.com/simple 
pip install labelimg -i https://pypi.douban.com/simple 

安装完成截图如下:
在这里插入图片描述
然后在Anaconda Prompt终端输入labelimg指令进入到labelimg标注界面,labelimg的标注模式分为VOC和YOLO两种,两种模式下生成的标注文件分别为.xml文件和.txt文件,因此在进行标注前需要优先选择好标注的模式。进入labelimg标注工具的初始化界面如下图所示。
在这里插入图片描述
标注完以后,生成一系列的.xml文件:
在这里插入图片描述
三、 划分训练集和验证集:运行prepare_data.py在yolov5项目文件夹下生成yolov5_train.txtyolov5_val.txt,在VOCdevkit / VOC2007目录下可以看到生成了YOLOLabels文件夹 ;另外,在VOCdevkit目录下生成了imageslabels文件夹。
注意:yolov5_train.txt和yolov5_val.txt分别给出了训练图片文件和验证图片文件的列表,含有每个图片的路径和文件名。
在这里插入图片描述
在这里插入图片描述
四、修改配置文件:data/voc_hat.yamlmodels/yolov5s_hat.yaml参数——训练集和验证集数据加载路径、标注的类别数、标签类别名称
在这里插入图片描述

2.2.2 YOLOv5算法检测流程

首先判断每个预测框的预测置信度是否超过设定阈值,若超过则认为该预测框内存在目标,从而得到目标的大致位置。

接着根据非极大值抑制算法对存在目标的预测框进行筛选,剔除对应同一目标的重复矩形框(非极大值抑制算法我们后续再详细讲)。

最后根据筛选后预测框的分类概率,取最大概率对应的索引,即为目标的分类索引号,从而得到目标的类别。

3、代码实现

整个完整代码已打包到百度网盘:

百度网盘链接:
https://pan.baidu.com/s/1sZBfSdfEqE3ftnsklj7L5A
提取码:chmd

3.1 数据集划分部分代码

1、定义类别列表和训练集比例

 定义类别列表和训练集比例
classes=['red','yellow','blue','white','orange','black','person']
TRAIN_RATIO = 80

2、创建用于存储训练集和测试集图片路径的文件

# 创建用于存储训练集和测试集图片路径的文件
train_file = open(os.path.join(wd, "yolov5_train.txt"), 'w')
test_file = open(os.path.join(wd, "yolov5_val.txt"), 'w')
train_file.close()
test_file.close()
train_file = open(os.path.join(wd, "yolov5_train.txt"), 'a')
test_file = open(os.path.join(wd, "yolov5_val.txt"), 'a')

3、划分训练集和验证集

prob = random.randint(1, 100)  # 生成新的随机概率值
    print("Probability: %d" % prob)

    if(prob < TRAIN_RATIO): # train dataset   如果概率小于训练集比例,将图片添加到训练集中
        if os.path.exists(annotation_path):
            train_file.write(image_path + '\n')  #将图片路径写入训练集文件
            convert_annotation(nameWithoutExtention) # convert label  转换注释为YOLO格式
            copyfile(image_path, yolov5_images_train_dir + voc_path)     # 复制图片文件到YOLOv5训练图片目录
            copyfile(label_path, yolov5_labels_train_dir + label_name)   # 复制标签文件到YOLOv5训练标签目录
    else: # test dataset      如果概率大于等于训练集比例,将图片添加到测试集中
        if os.path.exists(annotation_path):    
            test_file.write(image_path + '\n')    # 将图片路径写入测试集文件
            convert_annotation(nameWithoutExtention) # convert label   转换注释为YOLO格式
            copyfile(image_path, yolov5_images_test_dir + voc_path)     # 复制图片文件到YOLOv5测试图片目录
            copyfile(label_path, yolov5_labels_test_dir + label_name)   # 复制标签文件到YOLOv5测试标签目录
train_file.close()
test_file.close()

3.2 训练阶段

修改相应的参数,下图红色框部分所示
在这里插入图片描述
训练完成截图,会打印出每个标签的数目、类别,以及训练完成以后的权重保存路径:
在这里插入图片描述
混淆矩阵:横坐标是标签,纵坐标是预测值,如果预测对了,就是在对角线上。从上图中可以看出,大部分类别都能够准确预测,个别类的预测较低,原因是该类别标签数据样本太少,从而导致训练时特征学习不充分,影响后续检测效果。在这里插入图片描述
损失函数主要包括矩形框损失、置信度损失、分类概率损失,从下图可以看到,当epoch=250左右时,loss曲线逐渐区域收敛。
在这里插入图片描述

3.3 测试阶段

修改相应的参数,下图红色框部分所示
在这里插入图片描述

3.4 检测结果

综合下面两幅图片可以看出,该算法能够准确检测识别到图片中的安全帽,并且检测终端能够返回相应的统计量以及结果保存路径。
在这里插入图片描述在这里插入图片描述

4、问题与分析

(1)问题一:找不到voc_hat.yaml文件
在这里插入图片描述
报错原因1:在初次调试时,定义了nc=5,但在names中,实际只有3类,后面的三个类别缺少逗号(英文状态下)隔开会被默认成只有一个类。
在这里插入图片描述
解决办法:修改names定义的类别,各个标签类别之间用英文逗号(英文状态下)隔开即可。

报错原因2:训练集和验证集的路径加载的还是本地绝对路径,部署到服务器上无法加载到这个路径。
在这里插入图片描述
解决办法1:修改正确的加载路径,即上面红色框所示。
解决办法2:使用相对路径,但相对路径在使用Visio Studio Code进行debug时,会有无法识别的情况,此时通过在需要debug的.py文件开头添加以下两行代码即可解决。

import os,sys
os.chdir(sys.path[0]) #使用文件所在目录

(2)库的版本不对应
在这里插入图片描述
解决办法:根据 readme文件提示,使用源码提供的 requirements文件进行安装。

#安装完成截图:
在这里插入图片描述

参考链接

[1] YOLOv5算法详解: https://blog.csdn.net/WZZ18191171661/article/details/113789486
[2] YOLOv5实现佩戴安全帽检测和识别:https://blog.csdn.net/guyuealian/article/details/127250780
[3] yolov5目标检测神经网络——损失函数计算原理:https://zhuanlan.zhihu.com/p/458597638
[4] 标注工具Labelimg的安装与使用:https://zhuanlan.zhihu.com/p/550021453

猜你喜欢

转载自blog.csdn.net/m0_37758063/article/details/131310687