点击上方“计算机视觉cv”即可“进入公众号”
重磅干货第一时间送达
前言
随着人工智能的发展,现在越来越多的场景需要人工智能。在工厂的厂区中以安全为首,但工人普遍缺乏佩戴安全帽意识;工厂环境复杂,有各种各样的禁止进入的区域,普通的图像识别算法很难实现;加上使用传统的人工监管存在诸多缺点。
基于计算机视觉的安全帽自动识别技术设计通过在施工现场布设视频监控设备或利用现有的施工监控设备,采用机器视觉的相关方法进行安全帽的自动识别,可以实现对作业人员安全帽佩戴情况信息的全程快速识别,在降低监管费用的同时提升了监管信息化水平。
项目链接:
/PeterH0323/Smart_Construction
数据集链接:
/njvisionpower/Safety-Helmet-Wearing-Dataset
Smart_Construction
该项目是使用YOLOv5
来训练在智能工地安全领域中头盔目标检测的应用, 先来一波演示!
指标
yolov5s 为基础训练,epoch = 50
对应的yolov5s 权重文件:百度云:/s/1ELPhtW-Q4G8UqEr4YrV_5A,提取码:b981
yolov5m 为基础训练,epoch = 100
对应的yolov5m 权重文件:百度云:/s/10hlKrgpxVsw4d_vHnPHwEA,提取码:psst
yolov5l 为基础训练,epoch = 100
对应的yolov5l 权重文件:百度云:/s/1iMZkRNXY1fowpQCcapFDqw,提取码:a66e
1.YOLO v5训练自己数据集教程
使用的数据集:Safety-Helmet-Wearing-Dataset,感谢这位大神的开源数据集!
本文结合 YOLOv5官方教程 来写
环境准备
首先确保自己的环境:
Pytorch == 1.5.xPython >= 3.7
训练自己的数据
提示:
关于增加数据集分类的方法,请看【5. 增加数据集的分类】
1.1 创建自己的数据集配置文件
因为我这里只是判断 【人没有带安全帽】、【人有带安全帽】、【人体】 3个类别 ,基于data/coco128.yaml
文件,创建自己的数据集配置文件custom_data.yaml
#训练集和验证集的labels和image文件的位置 train:./score/images/train val:./score/images/val #numberofclasses nc:3 #classnames 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
除以图像高度。代码如下:
defconvert(size,box): """ 将标注的xml文件生成的【左上角x,左上角y,右下角x,右下角y】标注转换为yolov5训练的坐标 :param size:图片的尺寸:[w,h] :parambox:anchorbox的坐标[左上角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]importnumpyasnp
生成的.txt
文件放置的名字是图片的名字,放置在 label 文件夹中,例如:
./score/labels/train/00001.txt # label./score/images/train/00001.jpg # image
生成的.txt
例子:
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.231231236830353741 0.1830000086920336 0.1396396430209279 0.13400000636465847 0.15915916301310062
1.3 文件放置规范
文件树如下
1.4 聚类得出先验框(Yolov5 内部已做适配,可选)
使用代码./data/gen_anchors/clauculate_anchors.py
,修改数据集的路径
ANNOTATION_ROOT=r"xxx"#数据集标签文件夹路径 ANNOTATION_PATH=FILE_ROOT+ANNOTATION_ROOTFILE_ROOT=r"xxx"#根路径
跑完会生成一个文件anchors.txt
,里面有得出的建议先验框:
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]]Best Accuracy = 79.72%
1.5 选择一个您需要的模型
在文件夹./models
下选择一个你需要的模型然后复制一份出来,将文件开头的nc =
修改为数据集的分类数,下面是借鉴./models/yolov5s.yaml
来修改的
nc:3#numberofclasses<============修改这里为数据集的分类数 depth_multiple:0.33#modeldepthmultiple width_multiple:0.50#layerchannelmultiple #anchors anchors:#<============根据./data/gen_anchors/anchors.txt中的BestAnchors修改,需要取整(可选) -[14,27,23,46,28,130] -[39,148,52,186,62.,279] -[85,237,88,360,145,514] #YOLOv5backbone 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 ] #YOLOv5head head: [[-1,1,Conv,[512,1,1]], [-1,1,nn.Upsample,[None,2,'nearest']], [[-1,6],1,Concat,[1]],#catbackboneP4 [-1,3,BottleneckCSP,[512,False]],#13 [-1,1,Conv,[256,1,1]], [-1,1,nn.Upsample,[None,2,'nearest']], [[-1,4],1,Concat,[1]],#catbackboneP3 [-1,3,BottleneckCSP,[256,False]],#17 [-1,1,Conv,[256,3,2]], [[-1,14],1,Concat,[1]],#catheadP4 [-1,3,BottleneckCSP,[512,False]],#20 [-1,1,Conv,[512,3,2]], [[-1,10],1,Concat,[1]],#catheadP5 [-1,3,BottleneckCSP,[1024,False]],#23 [[17,20,23],1,Detect,[nc,anchors]],#Detect(P3,P4,P5) ]#parameters
1.6 开始训练
这里选择了yolov5s
模型进行训练,权重也是基于yolov5s.pt
来训练
pythontrain.py--img640--batch16--epochs10--data./data/custom_data.yaml--cfg./models/custom_yolov5.yaml--weights./weights/yolov5s.pt
其中,yolov5s.pt
需要自行下载放在本工程的根目录即可,下载地址:/open?id=1Drs_Aiu7xx6S-ix95f9kNsA6ueKRpN2J
1.7 看训练之后的结果
训练之后,权重会保存在./runs
文件夹里面的每个exp
文件里面的weights/best.py
,里面还可以看到训练的效果
2. 侦测
侦测图片会保存在./inferenct/output/
文件夹下
运行命令:
file.jpg#image file.mp4#video path/#directory path/*.jpg#glob rtsp://170.93.143.139/rtplive/470011e600ef003a004ee33696235daa#rtspstream http://112.50.243.8/PLTV/88888888/224/3221225900/1.m3u8#httpstreampythondetect.py--source0#webcam
例如使用我的s
权重检测图片,可以运行以下命令,侦测图片会保存在./inferenct/output/
文件夹下
pythondetect.py--source图片路径--weights./weights/helmet_head_person_s.pt
3. 检测危险区域内是否有人
3.1 危险区域标注方式
我这里使用的是 精灵标注助手标注,生成了对应图片的 json 文件
3.2 执行侦测
侦测图片会保存在./inferenct/output/
文件夹下
运行命令:
pythonarea_detect.py--source./area_dangerous--weights./weights/helmet_head_person_s.pt
3.3 效果:在危险区域里面的人体会被红色框选出来
4. 生成 ONNX
4.1 安装onnx
库
pipinstallonnx
4.2 执行生成
python./models/export.py--weights./weights/helmet_head_person_s.pt--img640--batch1
onnx
和torchscript
文件会生成在./weights
文件夹中
5. 增加数据集的分类
关于增加数据集分类的方法:
SHWD
数据集里面没有person
的类别,先将现有的自己的数据集执行脚本生成 yolov5 需要的标签文件.txt
,之后再用yolov5x.pt
加上yolov5x.yaml
,使用指令检测出人体
pythondetect.py--save-txt--source./自己数据集的文件目录--weights./weights/yolov5x.pt
yolov5
会推理出所有的分类,并在inference/output
中生成对应图片的.txt
标签文件;
修改./data/gen_data/merge_data.py
中的自己数据集标签所在的路径,执行这个python脚本,会进行person
类型的合并
总结
以上就是 YOLOv5 实现 智慧工地安全帽和危险区域检测系统 的全部内容。欢迎 star ✨✨✨
本文转载自csdn博客,文章链接:/hxj0323/article/details/109257255