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

news2024/11/24 16:56:38

目录

  • 1、作者介绍
  • 2、YOLOv5网络模型
    • 2.1 算法简介
    • 2.2 数据集介绍
      • 2.2.1 VOC数据集准备
      • 2.2.2 YOLOv5算法检测流程
  • 3、代码实现
    • 3.1 数据集划分部分代码
    • 3.2 训练阶段
    • 3.3 测试阶段
    • 3.4 检测结果
  • 4、问题与分析
  • 参考链接

1、作者介绍

陈梦丹,女,西安工程大学电子信息学院,2022级研究生
研究方向:机器视觉与人工智能
电子邮件:1169738496@qq.com

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/668343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【6.20】sleep()和wait()的区别

sleep()和wait()的区别 1、wait()方法 1.1使用场景 当某个线程获取到锁后&#xff0c;却还是不满足执行的条件&#xff0c;就可以调用对象锁的wait方法&#xff0c;进入等待状态。 直到外在条件满足了&#xff0c;就可以由其它线程调用notify或者notifyAll方法&#xff0c;…

在软件研发排期中要求“倒推时间”,项目结束后悲剧了……

有没有遇到某个项目任务的研发周期已被各路boss定下&#xff0c;研发团队都觉得时间不合理&#xff0c;反馈给上级无果&#xff0c;而要求“倒推时间”进行任务排期的情况&#xff1f; 什么是“倒推时间”&#xff1f; 目标倒推法&#xff0c;从剩下的时间反推算出每天该做的事…

【Java】死锁问题及ThreadLocal

什么是死锁分析过程发生死锁的原因避免死锁ThreadLocal 什么是死锁 多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。这是一个最严重的BUG之一。 分析过程 1.一个线程一把锁 一个线…

深入理解TDD(测试驱动开发):提升代码质量的利器

在日常的软件开发工作中&#xff0c;我们常常会遇到这样的问题&#xff1a;如何在繁忙的项目进度中&#xff0c;保证我们的代码质量&#xff1f;如何在不断的迭代更新中&#xff0c;避免引入新的错误&#xff1f;对此&#xff0c;有一种有效的开发方式能帮助我们解决这些问题&a…

14.处理大数据集

14.1 随机梯度下降 假设你正在使用梯度下降来训练一个线性回归模型 当m个样本的m很大时&#xff0c;求和计算量太大了。这种梯度下降算法有另外一个名字叫做批量梯度下降&#xff08;batch gradient desent&#xff09;。这种算法每次迭代需要使用全量训练集&#xff0c;直到算…

【代码阅读软件】Source Insight 4 使用教程 | 很详细——适合新手

目录 一、概述二、常用的几个窗口&#x1f449;2.1 符号窗口&#xff08;Symbol Window&#xff09;&#x1f449;2.2 项目文件窗口&#xff08;Project Window&#xff09;&#x1f449;2.3 关系窗口&#xff08;Relation Window&#xff09;&#x1f449;2.4 上下文窗口&…

STM32--基于固件库(Library Faction)的led灯点亮

目录 一、STM32芯片的简单介绍 二、基于固件库&#xff08;Library Faction&#xff09;的led灯点亮 这是一个学习stm32的开端&#xff0c;我们由简入难&#xff0c;之前学过C51/52或是其他型号的一般都是从led开始&#xff0c;也就是简单的输入输出端口的应用。&#xff08;想…

SpringBoot整合模板引擎Thymeleaf(1)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Thymeleaf概述 Thymeleaf是一种用于Web和独立环境的现代服务器端的Java模板引擎&#xff0c;主要目标是将优雅的自然模板带到开发工作流程中&#xff0c;并将HTML在浏览器中…

【kubernetes】Etcd集群部署与验证

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

吐血整理,性能测试Jmeter分布式压测遇坑总结+解决

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 为什么要使用分布…

JSON.parse() 全面用法介绍

JSON 通常用于与服务端交换数据。在接收服务器数据时一般是字符串。我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。 语法 JSON.parse(text[, reviver]) text:必需&#xff0c; 一个有效的 JSON 字符串。 reviver: 可选&#xff0c;一个转换结果的函数&#xf…

SPI协议解析

SPI协议介绍 引言介绍SPI简介物理层协议层通讯的起始和停止信号SPI 模式 优缺点优点缺点 使用例程基于STM32的SPI通信准备硬件连接 软件实现 总结 引言 SPI是串行外设接口的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。由于SPI高速和同步的特…

vite环境变量与模式

环境变量 Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。这里有一些在所有情况下都可以使用的内建变量&#xff1a; import.meta.env.MODE: {string} 应用运行的模式。 import.meta.env.BASE_URL: {string} 部署应用时的基本 URL。他由base 配置项决定。 import.m…

【ESP8266】使用MQTT协议 连接华为云iotDA,实现设备属性上报

相关资料&#xff1a;https://github.com/CQUPTLei/ESP8266 往期文章&#xff1a;【ESP8266】基础AT指令和常用WIF指令 【MQTT 5.0】协议 ——发布订阅模式、Qos、keepalive、连接认证、消息结构 一、华为云iotDA1.1 什么是iotDA1.2 创建 iotDA 产品 二、使用ESP8266上报设备…

【杂谈理解】STM32F10X标准库工程模板

前言 基于STM官网的STM32F10x标准外设库V3.6.0版本&#xff0c;文件的操作流程是参考江科大的。记录下此文方便学习和回忆。文章后也会放置完整的工程文件和意法官网下载STM32F10x标准外设库的压缩包。 流程 到意法官网下载STM32F10x标准外设库的压缩包。先找到压缩包的地址&a…

CMake详解

file文件操作 cmake的file命令_cmake file_物随心转的博客-CSDN博客 set指令 CMake中的set指令详解_cmake set_guanguanboy的博客-CSDN博客 include_directories指令 Cmake命令之include_directories介绍 - 简书 add_subdirectory Cmake命令之add_subdirectory介绍 - 简书…

两台电脑用网线传输文件的一些问题解决

两台电脑用网线传输文件 步骤如下&#xff1a; 一、两台电脑插上网线 网线568A和568B可能没什么影响 二、 ipv4地址配置 两个网线插上电脑会自动生成一个ipv4地址 cmd里使用ipconfig查看 用这个就行了如果不想用自动生成的ip地址 也可以自己配置ipv4地址和网关&#xff08…

升级Nginx

目录 前言 一、升级Nginx 1&#xff09;首先在官网下载一个新版本的Nginx 2&#xff09;首先将下载的压缩包进行解包 3&#xff09;进入已解包的目录中 4&#xff09;配置安装路径 5&#xff09;make 6&#xff09;备份原来Nginx的资源 7&#xff09;重启Nginx服务 8&#…

面向对象程序设计|运算符重载

题目一&#xff1a;分数的加减乘除&#xff08;运算符重载&#xff09; 题目描述&#xff1a; Fraction类的基本形式如下&#xff1a; 要求如下&#xff1a; 1.实现Fraction类&#xff1b;common_divisor()和contracted()函数体可为空&#xff0c;不实现具体功能。 2.编写m…

Qt QPainterPath

作用 为painter设置好绘画路径 成员函数 painter.drawPath() 1,使用当前笔画轮廓; 2,填充path指定的路径绘画出来的图形。 xxx.to() lineTo() moveTo() 使用path作画&#xff0c;一定要先将path的启动移动到需要开始绘画的点&#xff0c;否则默认从 &#xff08;0&…