及时排查安全帽佩戴的规范性并给予提醒,可以大大降低施工安全隐患。通过使用PaddleX中目标检测算法PP-YOLOV2进行视频分析,监控安全帽佩戴,可以提升施工安全系数,辅助实现施工现场智能化建设。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

在该项目中,主要向大家介绍如何使用目标检测来实现对安全帽的检测,涉及代码以及优化过程亦可用于其它目标检测任务等。
在施工现场,对于来往人员,以及工作人员而言,安全问题至关重要。而安全帽更是保障施工现场在场人员安全的第一防线,因此需要对场地中的人员进行安全提醒。当人员未佩戴安全帽进入施工场所时,人为监管耗时耗力,而且不易实时监管,过程繁琐、消耗人力且实时性较差。针对上述问题,希望通过视频监控->目标检测->智能督导的方式智能、高效的完成此任务。
5月12日晚19:00,我们将在线分享安全帽检测方案详解和避坑指南,30分钟直达产业项目落地! 欢迎大家扫码报名直播课,如有更多技术交流与合作,也欢迎大家扫码进群。

业务难点:

数据集中包含了5000张已经标注好的数据。该项目采用目标检测的标注方式,在本文档中提供了VOC数据集格式。
解压项目提供的数据:
!unzip /home/aistudio/data/data50329/HelmetDetection.zip -d /home/aistudio/work/dataset
更改一下命名:
dataset/ dataset/ ├── annotations/ --> ├── Annotations/ ├── images/ ├── JPEGImages/
%cd /home/aistudio/work/dataset %mv annotations Annotations %mv images JPEGImages
数据集分类情况: head , helmet, person.
更多数据格式信息请参考数据标注说明文档
安装PaddleX:
!pip install paddlex
!paddlex --split_dataset --format voc --dataset_dir /home/aistudio/work/dataset --val_value 0.15
dataset/ dataset/
├── Annotations/ --> ├── Annotations/
├── JPEGImages/ ├── JPEGImages/
├── labels.txt
├── train_list.txt
├── val_list.txtPaddleX提供了丰富的视觉模型,在目标检测中提供了RCNN和YOLO系列模型。在本项目中采用YOLO作为检测模型进行安全帽检测。
# 单卡训练%cd /home/aistudio/ !python /home/aistudio/code/train.py
# 四卡训练%cd /home/aistudio/ !export CUDA_VISIBLE_DEVICES=0,1,2,3!python -m paddle.distributed.launch --gpus 0,1,2,3 /home/aistudio/code/train.py

本小节侧重展示在模型迭代过程中优化精度的思路,在本案例中,有些优化策略获得了精度收益,而有些没有。在其他场景中,可根据实际情况尝试这些优化策略。
相较于二阶段检测模型,单阶段检测模型的精度略低但是速度更快。考虑到是部署到GPU端,本案例选择单阶段检测模型YOLOV3作为基线模型,其骨干网络选择DarkNet53。训练完成后,模型在验证集上的精度如下:
| 模型 | 推理时间 (ms/image) | map(Iou-0.5) | (coco)mmap | 安全帽AP(Iou-0.5) |
|---|---|---|---|---|
| baseline: YOLOv3 + DarkNet53 + cluster_yolo_anchor + img_size(480) | 50.34 | 61.6 | 39.2 | 94.58 |
使用PaddleX提供的paddlex.det.coco_error_analysis接口对模型在验证集上预测错误的原因进行分析,分析结果以图表的形式展示如下:
| allclass | head | person | helmet |
|---|---|---|---|
| @@##@@ | @@##@@ | @@##@@ | @@##@@ |
分析图表展示了7条Precision-Recall(PR)曲线,每一条曲线表示的Average Precision (AP)比它左边那条高,原因是逐步放宽了评估要求。以helmet类为例,各条PR曲线的评估要求解释如下:
从分析图表中可以看出,head、helmet两类检测效果较好,但仍然存在漏检的情况,特别是person存在很大的漏检问题;此外,通过helmet中C75指标可以看出,其相对于C50的0.946而言有些差了,因此定位性能有待进一步提高。为进一步理解造成这些问题的原因,将验证集上的预测结果进行了可视化,然后发现数据集标注存在以下问题:
考虑到漏检问题,一般是特征学习不够,无法识别出物体,因此基于这个方向,尝试替换backbone: DarkNet53 --> ResNet50_vd_dcn,在指标上的提升如下:
| 模型 | 推理时间 (ms/image) | map(Iou-0.5) | (coco)mmap | 安全帽AP(Iou-0.5) |
|---|---|---|---|---|
| YOLOv3 + ResNet50_vd_dcn + cluster_yolo_anchor+img_size(480) | 53.81 | 61.7 | 39.1 | 95.35 |
考虑到定位问题,通过尝试放大图片,不同的网络结构以及定位的优化策略: 利用cluster_yolo_anchor生成聚类的anchor或开启iou_aware。最终得到上线模型PPYOLOV2的精度如下:
| 模型 | 推理时间 (ms/image) | map(Iou-0.5) | (coco)mmap | 安全帽AP(Iou-0.5) |
|---|---|---|---|---|
| PPYOLOV2 + ResNet50_vd_dcn + img_size(608) | 81.52 | 61.6 | 41.3 | 95.32 |
其中helmet类误差分析如下图:

从分析表中可以看出:
本项目优化整体分析可归纳为以下几点:
| 训练预处理1(a1) | 验证预处理 |
|---|---|
| MixupImage(mixup_epoch=-1) | Resize(target_size=480, interp='CUBIC') |
| RandomDistort() | Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) |
| RandomExpand(im_padding_value=[123.675, 116.28, 103.53]) | |
| RandomCrop() | |
| RandomHorizontalFlip() | |
| BatchRandomResize(target_sizes=[320, 352, 384, 416, 448, 480, 512, 544, 576, 608],interp='RANDOM') | |
| Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) |
在加入了RandomHorizontalFlip、RandomDistort、RandomCrop、RandomExpand、BatchRandomResize、MixupImage这几种数据增强方法后,对模型的优化是有一定的积极作用了,在取消这些预处理后,模型性能会有一定的下降。
PS:建议在训练初期都加上这些预处理方法,到后期模型超参数以及相关结构确定最优之后,再进行数据方面的再优化: 比如数据清洗,数据预处理方法筛选等。
采用PaddleX在Tesla V100上测试模型的推理时间(输入数据拷贝至GPU的时间、计算时间、数据拷贝至CPU的时间),推理时间如下表所示:(十次推理取平均耗时)
| 模型 | 推理时间 (ms/image) | map(Iou-0.5) | (coco)mmap | 安全帽AP(Iou-0.5) |
|---|---|---|---|---|
| baseline: YOLOv3 + DarkNet53 + cluster_yolo_anchor + img_size(480) | 50.34 | 61.6 | 39.2 | 94.58 |
| YOLOv3 + ResNet50_vd_dcn + cluster_yolo_anchor+img_size(480) | 53.81 | 61.7 | 39.1 | 95.35 |
| PPYOLO + ResNet50_vd_dcn + iou_aware + img_size(480) | 72.88 | 62.4 | 37.7 | 95.73 |
| PPYOLO + ResNet50_vd_dcn + label_smooth=True + iou_aware + img_size(480) | 72.76 | 63.5 | 40.6 | 96.83 |
| PPYOLO + ResNet50_vd_dcn + cluster_yolo_anchor + img_size(480) | 67.14 | 61.8 | 39.8 | 95.08 |
| PPYOLOV2 + ResNet50_vd_dcn + img_size(608) | 81.52 | 61.6 | 41.3 | 95.32 |
| PPYOLOV2 + ResNet101_vd_dcn + img_size(608) | 106.62 | 61.3 | 40.6 | 95.15 |
注意:
anchors = train_dataset.cluster_yolo_anchor(num_anchors=9, image_size=480) anchor_masks = [[6, 7, 8], [3, 4, 5], [0, 1, 2]]
优化进展说明:
1.通过选择更好的backbone作为特征提取的骨干网络可以提高识别率、降低漏检率。<DarkNet53 到 ResNet50_vd_dcn>
2.通过选择更好的检测架构可以提高检测的mmap值——即Neck,Head部分的优化可以提高ap。<YOLOV3 到 PPYOLOV2>
3.缩放适当的图像大小可以提高模型的识别率,但是存在一定的阈值——当图像大小到某一个阈值时会导致精度下降。
<480到608>
4.通过cluster_yolo_anchor生成当前网络输入图像大小下拟合数据集的预置anchors,利用新生成的anchors替换原来的默认anchor,使得模型预测定位上框选位置更准确。
5.通过PPYOLO两个实验,一个使用iou_aware,一个不是使用iou_aware而采用聚类得到的anchor提高定位能力;分析数据发现在定位信息优化上,iou_aware在当前数据集上表现更好,但推理时间也有所提升。
6.通过PPYOLO两个实验,一个使用label_smooth,一个不使用,分析出使用label_smooth可以让模型在验证集上表现更好了。
通过以上的简单优化方式,获取了两个较好的模型结果:
| 模型 | 推理时间 (ms/image) | map(Iou-0.5) | (coco)mmap | 安全帽AP(Iou-0.5) |
|---|---|---|---|---|
| PPYOLO + ResNet50_vd_dcn + label_smooth=True + iou_aware + img_size(480) | 72.76 | 63.5 | 40.6 | 96.83 |
| PPYOLOV2 + ResNet50_vd_dcn + img_size(608) | 81.52 | 61.6 | 41.3 | 95.32 |
运行如下代码:
!python code/infer.py
则可生成result.txt文件并显示预测结果图片,result.txt文件中会显示图片中每个检测框的位置、类别及置信度, 从而实现了安全帽的自动检测。
预测结果如下:

模型训练后保存在output文件夹,如果要使用PaddleInference进行部署需要导出成静态图的模型,运行如下命令,会自动在output文件夹下创建一个inference_model的文件夹,用来存放导出后的模型。
!paddlex --export_inference --model_dir=/home/aistudio/models/yolov3_darknet53 \
--save_dir=output/inference_model --fixed_input_shape=[480,480]基于导出的模型,在单张图像上做推理:
import paddlex as pdx
predictor = pdx.deploy.Predictor('/home/aistudio/output/inference_model/inference_model')
img_path = '/home/aistudio/work/97ce96584315ba13a4927c8a0.jpg'result = predictor.predict(img_file=img_path)print(result)可视化:
%matplotlib inlineimport matplotlib.pyplot as plt # plt 用于显示图片import numpy as npimport cv2import os
save_dir='/home/aistudio/'pdx.det.visualize(img_path, result, save_dir=save_dir)
path,filename = os.path.split(img_path)
output_path = os.path.join(save_dir,"visualize_"+filename)
pic = cv2.imread(output_path)
pic = cv2.cvtColor(pic, cv2.COLOR_BGR2RGB)
plt.imshow(pic)
plt.axis('off') # 不显示坐标轴plt.show()2022-05-11 11:11:49 [INFO] The visualized result is saved at /home/aistudio/visualize_97ce96584315ba13a4927c8a0.jpg
<Figure size 432x288 with 1 Axes>
对视频数据抽帧进行检测:
import cv2import paddlex as pdximport numpy as npimport colorsysimport os
predictor = pdx.deploy.Predictor('/home/aistudio/output/inference_model/inference_model')
cap = cv2.VideoCapture('/home/aistudio/work/Industry.mp4')
save_dir='/home/aistudio/frames'if not os.path.exists(save_dir):
os.makedirs(save_dir)
i = 1det_rate = 20save_dir = "/home/aistudio/frames/"while cap.isOpened():
ret, frame = cap.read() if ret : if i%det_rate==0:
result = predictor.predict(frame) print(i)
vis_img = pdx.det.visualize(frame, result, save_dir=save_dir)
# 本地环境可以实时查看安全帽检测效果
# cv2.imshow('hatdet', vis_img)
if cv2.waitKey(1) & 0xFF == ord('q'): break
i += 1
else: breakcap.release()注意:设定 fixed_input_shape 的数值需与 eval_transforms 中设置的 target_size 数值上保持一致。
本案例面向GPU端的最终方案是选择一阶段检测模型PPYOLOV2,其骨干网络选择加入了可变形卷积(DCN)的ResNet50_vd,训练阶段数据增强策略采用RandomHorizontalFlip、RandomDistort、RandomCrop等。
在Tesla V100的Linux系统下,模型的推理时间大约为81.52ms/image,包括transform、输入数据拷贝至GPU的时间、计算时间、数据拷贝至CPU的时间。
| 模型 | 推理时间 (ms/image) | map(Iou-0.5) | (coco)mmap | 安全帽AP(Iou-0.5) |
|---|---|---|---|---|
| PPYOLOV2 + ResNet50_vd_dcn + img_size(608) | 81.52 | 61.6 | 41.3 | 95.32 |
上线模型的PR曲线:

在本项目中的安全帽检测数据中,标注信息本身存在一定的缺漏,导致部分类别学习失效。但针对本项目的安全帽检测问题而言,person(人)这一类别影响不大,因此可以在mmap较大的基础上主要看helmet(安全帽)的精度即可。通过COCO的评估指标,可以使多类别的检测模型的评估更加符合实际应用;虽然我们可以看出在该数据集中,有一个类别对整体的map与mmap有较大影响,但是通过COCO指标能够取得一个相对数据集更综合表现(不同Iou尺度下)的一个模型。
注意: 通过VOC指标也许能够取得更好的Iou-0.5指标下更好的数据,但是却会使得对多Iou尺度的一个评估,使得得到该评估指标下最好的模型未必在其它Iou尺度下也有最好的表现。
模型部署采用了PaddleX提供的C++ inference部署方案,在该方案中提供了在端侧设备Jetson部署Demo,用户可根据实际情况自行参考。

借助PaddleHub-Serving,可以将PaddleX的Inference Model进行快速部署,以提供在线预测的能力。参考链接:https://paddlex.readthedocs.io/zh_CN/release-1.3/deploy/hub_serving.html。
更新PaddleHub版本:``
!pip install --upgrade paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple
将PaddleX的Inference Model转换成PaddleHub的预训练模型,使用命令hub convert即可一键转换:
!hub convert --model_dir /home/aistudio/output/inference_model/inference_model --module_name helmet_hub
The converted module is stored in `helmet_hub_1652238760.0615911`.
模型转换后,得到helmet_hub.tar.gz压缩包,在进行部署之前需要先安装到本机,使用命令hub install即可一键安装:
!hub install helmet_hub_1652166294.6532774/helmet_hub.tar.gz
接下来,只需要使用hub serving命令即可完成模型的一键部署:
!hub serving start -m helmet_hub
客户端请求:
# coding: utf8import requestsimport jsonimport cv2import base64def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1] return base64.b64encode(data.tostring()).decode('utf8')if __name__ == '__main__': # 获取图片的base64编码格式
img1 = cv2_to_base64(cv2.imread("/home/aistudio/work/97ce96584315ba13a4927c8a0.jpg"))
data = {'images': [img1]} # 指定content-type
headers = {"Content-type": "application/json"} # 发送HTTP请求
url = "http://127.0.0.1:8866/predict/helmet_hub"
r = requests.post(url=url, headers=headers, data=json.dumps(data)) # 打印预测结果
print(r.json()["results"])



以上就是轻松上手安全帽检测的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号