热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

安全帽图像识别python_YOLOv5在建筑工地中安全帽佩戴检测的应用(已开源+数据集)...

前言随着人工智能的发展,现在越来越多的场景需要人工智能。在工厂的厂区中以安全为首,但工人普遍缺乏佩戴安全帽意识;工厂环境复杂,

前言

随着人工智能的发展,现在越来越多的场景需要人工智能。在工厂的厂区中以安全为首,但工人普遍缺乏佩戴安全帽意识;工厂环境复杂,有各种各样的禁止进入的区域,普通的图像识别算法很难实现;加上使用传统的人工监管存在诸多缺点。

基于计算机视觉的安全帽自动识别技术设计通过在施工现场布设视频监控设备或利用现有的施工监控设备,采用机器视觉的相关方法进行安全帽的自动识别,可以实现对作业人员安全帽佩戴情况信息的全程快速识别,在降低监管费用的同时提升了监管信息化水平。

项目链接:

https://github.com/PeterH0323/Smart_Construction

数据集链接:

https://github.com/njvisionpower/Safety-Helmet-Wearing-Dataset

Smart_Construction

该项目是使用 YOLOv5 来训练在智能工地安全领域中头盔目标检测的应用, 先来一波演示!

指标

yolov5s 为基础训练,epoch = 50

分类

P

R

mAP0.5

总体

0.884

0.899

0.888

人体

0.846

0.893

0.877

0.889

0.883

0.871

安全帽

0.917

0.921

0.917

对应的 yolov5s 权重文件:百度云:https://pan.baidu.com/s/1ELPhtW-Q4G8UqEr4YrV_5A,提取码: b981

yolov5m 为基础训练,epoch = 100

分类

P

R

mAP0.5

总体

0.886

0.915

0.901

人体

0.844

0.906

0.887

0.9

0.911

0.9

安全帽

0.913

0.929

0.916

对应的 yolov5m 权重文件:百度云:https://pan.baidu.com/s/10hlKrgpxVsw4d_vHnPHwEA,提取码: psst

yolov5l 为基础训练,epoch = 100

分类

P

R

mAP0.5

总体

0.892

0.919

0.906

人体

0.856

0.914

0.897

0.893

0.913

0.901

安全帽

0.927

0.929

0.919

对应的 yolov5l 权重文件:百度云:https://pan.baidu.com/s/1iMZkRNXY1fowpQCcapFDqw,提取码: a66e

1.YOLO v5训练自己数据集教程

使用的数据集:Safety-Helmet-Wearing-Dataset,感谢这位大神的开源数据集!

本文结合 YOLOv5官方教程 来写

环境准备

首先确保自己的环境:

Python >= 3.7

Pytorch == 1.5.x

训练自己的数据

提示:

关于增加数据集分类的方法,请看【5. 增加数据集的分类】

1.1 创建自己的数据集配置文件

因为我这里只是判断 【人没有带安全帽】、【人有带安全帽】、【人体】 3个类别 ,基于 data/coco128.yaml 文件,创建自己的数据集配置文件 custom_data.yaml

# 训练集和验证集的 labels 和 image 文件的位置

train: ./score/images/train

val: ./score/images/val

# number of classes

nc: 3

# class names

names: ['person', 'head', 'helmet']

1.2 创建每个图片对应的标签文件

使用标注工具类似于 Labelbox 、CVAT、精灵标注助手 标注之后,需要生成每个图片对应的 .txt 文件,其规范如下:

每一行都是一个目标

类别序号是零索引开始的(从

0开始)

每一行的坐标

class x_center y_center width height 格式

框坐标必须采用

归一化的 xywh格式(从

0到

1)。如果您的框以像素为单位,则将

x_center和

width除以图像宽度,将

y_center和

height除以图像高度。代码如下:

import numpy as np

def convert(size, box):

"""

将标注的 xml 文件生成的【左上角x,左上角y,右下角x,右下角y】标注转换为yolov5训练的坐标

:param size: 图片的尺寸: [w,h]

:param box: anchor box 的坐标 [左上角x,左上角y,右下角x,右下角y,]

:return: 转换后的 [x,y,w,h]

"""

x1 = int(box[0])

y1 = int(box[1])

x2 = int(box[2])

y2 = int(box[3])

dw = np.float32(1. / int(size[0]))

dh = np.float32(1. / int(size[1]))

w = x2 - x1

h = y2 - y1

x = x1 + (w / 2)

y = y1 + (h / 2)

x = x * dw

w = w * dw

y = y * dh

h = h * dh

return [x, y, w, h]

生成的 .txt 文件放置的名字是图片的名字,放置在 label 文件夹中,例如:

./score/images/train/00001.jpg # image

./score/labels/train/00001.txt # label

生成的 .txt 例子:

1 0.1830000086920336 0.1396396430209279 0.13400000636465847 0.15915916301310062

1 0.5240000248886645 0.29129129834473133 0.0800000037997961 0.16816817224025726

1 0.6060000287834555 0.29579580295830965 0.08400000398978591 0.1771771814674139

1 0.6760000321082771 0.25375375989824533 0.10000000474974513 0.21321321837604046

0 0.39300001866649836 0.2552552614361048 0.17800000845454633 0.2822822891175747

0 0.7200000341981649 0.5570570705458522 0.25200001196935773 0.4294294398277998

0 0.7720000366680324 0.2567567629739642 0.1520000072196126 0.23123123683035374

1.3 文件放置规范

文件树如下

在这里插入图片描述

1.4 聚类得出先验框(Yolov5 内部已做适配,可选)

使用代码 ./data/gen_anchors/clauculate_anchors.py ,修改数据集的路径

FILE_ROOT = r"xxx" # 根路径

ANNOTATION_ROOT = r"xxx"  # 数据集标签文件夹路径

ANNOTATION_PATH = FILE_ROOT + ANNOTATION_ROOT

跑完会生成一个文件 anchors.txt,里面有得出的建议先验框:

Best Accuracy = 79.72%

Best Anchors = [[14.74, 27.64], [23.48, 46.04], [28.88, 130.0], [39.33, 148.07], [52.62, 186.18], [62.33, 279.11], [85.19, 237.87], [88.0, 360.89], [145.33, 514.67]]

1.5 选择一个您需要的模型

在文件夹 ./models 下选择一个你需要的模型然后复制一份出来,将文件开头的 nc = 修改为数据集的分类数,下面是借鉴 ./models/yolov5s.yaml来修改的

# parameters

nc: 3  # number of classes     <&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61; 修改这里为数据集的分类数

depth_multiple: 0.33  # model depth multiple

width_multiple: 0.50  # layer channel multiple

# anchors

anchors: # <&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61; 根据 ./data/gen_anchors/anchors.txt 中的 Best Anchors 修改&#xff0c;需要取整(可选)

- [14,27, 23,46, 28,130]

- [39,148, 52,186, 62.,279]

- [85,237, 88,360, 145,514]

# YOLOv5 backbone

backbone:

# [from, number, module, args]

[[-1, 1, Focus, [64, 3]],  # 0-P1/2

[-1, 1, Conv, [128, 3, 2]],  # 1-P2/4

[-1, 3, BottleneckCSP, [128]],

[-1, 1, Conv, [256, 3, 2]],  # 3-P3/8

[-1, 9, BottleneckCSP, [256]],

[-1, 1, Conv, [512, 3, 2]],  # 5-P4/16

[-1, 9, BottleneckCSP, [512]],

[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32

[-1, 1, SPP, [1024, [5, 9, 13]]],

[-1, 3, BottleneckCSP, [1024, False]],  # 9

]

# YOLOv5 head

head:

[[-1, 1, Conv, [512, 1, 1]],

[-1, 1, nn.Upsample, [None, 2, &#39;nearest&#39;]],

[[-1, 6], 1, Concat, [1]],  # cat backbone P4

[-1, 3, BottleneckCSP, [512, False]],  # 13

[-1, 1, Conv, [256, 1, 1]],

[-1, 1, nn.Upsample, [None, 2, &#39;nearest&#39;]],

[[-1, 4], 1, Concat, [1]],  # cat backbone P3

[-1, 3, BottleneckCSP, [256, False]],  # 17

[-1, 1, Conv, [256, 3, 2]],

[[-1, 14], 1, Concat, [1]],  # cat head P4

[-1, 3, BottleneckCSP, [512, False]],  # 20

[-1, 1, Conv, [512, 3, 2]],

[[-1, 10], 1, Concat, [1]],  # cat head P5

[-1, 3, BottleneckCSP, [1024, False]],  # 23

[[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)

]

1.6 开始训练

这里选择了 yolov5s 模型进行训练&#xff0c;权重也是基于 yolov5s.pt 来训练

python train.py --img 640 --batch 16 --epochs 10 --data ./data/custom_data.yaml --cfg ./models/custom_yolov5.yaml --weights ./weights/yolov5s.pt

其中&#xff0c;yolov5s.pt 需要自行下载放在本工程的根目录即可&#xff0c;下载地址&#xff1a;https://drive.google.com/open?id&#61;1Drs_Aiu7xx6S-ix95f9kNsA6ueKRpN2J

1.7 看训练之后的结果

训练之后&#xff0c;权重会保存在 ./runs 文件夹里面的每个 exp 文件里面的 weights/best.py &#xff0c;里面还可以看到训练的效果

2. 侦测

侦测图片会保存在 ./inferenct/output/ 文件夹下

运行命令&#xff1a;

python detect.py --source   0  # webcam

file.jpg  # image

file.mp4  # video

path/  # directory

path/*.jpg  # glob

rtsp://170.93.143.139/rtplive/470011e600ef003a004ee33696235daa  # rtsp stream

http://112.50.243.8/PLTV/88888888/224/3221225900/1.m3u8  # http stream

例如使用我的 s 权重检测图片&#xff0c;可以运行以下命令&#xff0c;侦测图片会保存在 ./inferenct/output/ 文件夹下

python detect.py --source 图片路径 --weights ./weights/helmet_head_person_s.pt

3. 检测危险区域内是否有人

3.1 危险区域标注方式

我这里使用的是 精灵标注助手标注&#xff0c;生成了对应图片的 json 文件

3.2 执行侦测

侦测图片会保存在 ./inferenct/output/ 文件夹下

运行命令&#xff1a;

python area_detect.py --source ./area_dangerous --weights ./weights/helmet_head_person_s.pt

3.3 效果&#xff1a;在危险区域里面的人体会被 红色框 选出来

4. 生成 ONNX

4.1 安装 onnx 库

pip install onnx

4.2 执行生成

python ./models/export.py --weights ./weights/helmet_head_person_s.pt --img 640 --batch 1

onnx 和 torchscript 文件会生成在 ./weights 文件夹中

5. 增加数据集的分类

关于增加数据集分类的方法&#xff1a;

SHWD 数据集里面没有 person 的类别&#xff0c;先将现有的自己的数据集执行脚本生成 yolov5 需要的标签文件 .txt&#xff0c;之后再用 yolov5x.pt 加上 yolov5x.yaml &#xff0c;使用指令检测出人体

python detect.py --save-txt --source ./自己数据集的文件目录 --weights ./weights/yolov5x.pt

yolov5 会推理出所有的分类&#xff0c;并在 inference/output 中生成对应图片的 .txt 标签文件&#xff1b;

修改 ./data/gen_data/merge_data.py 中的自己数据集标签所在的路径&#xff0c;执行这个python脚本&#xff0c;会进行 person 类型的合并

总结

以上就是 YOLOv5 实现 智慧工地安全帽和危险区域检测系统 的全部内容。欢迎 star ✨✨✨

本文转载自csdn博客&#xff0c;文章链接&#xff1a;https://blog.csdn.net/hxj0323/article/details/109257255



推荐阅读
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
  • 语义分割系列3SegNet(pytorch实现)
    SegNet手稿最早是在2015年12月投出,和FCN属于同时期作品。稍晚于FCN,既然属于后来者,又是与FCN同属于语义分割网络 ... [详细]
  • 上一章讲了如何制作数据集,接下来我们使用mmcls来实现多标签分类。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
  • pytorch Dropout过拟合的操作
    这篇文章主要介绍了pytorchDropout过拟合的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完 ... [详细]
  • 都会|可能会_###haohaohao###图神经网络之神器——PyTorch Geometric 上手 & 实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了###haohaohao###图神经网络之神器——PyTorchGeometric上手&实战相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
雨舒紫_586
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有