基于YOLOV5的工地安全帽检测系统:训练到部署技术详解
2026/9/8 19:55:25 网站建设 项目流程

简介:这是一份基于YOLOv5的头盔佩戴检测识别系统完整项目包,面向计算机视觉初学者、毕业设计学生及工地安全监测项目开发者,解决从数据标注、模型训练到检测部署的全流程需求。资源整合了源码、数据集、训练好的权重和教程文档,可支撑快速搭建属于自己的佩戴检测系统。

压缩包共77个文件,大小23.72MB。文件类型覆盖Python脚本(如voc_to_yolo.py、detect.py、train.py)、24个YAML配置、26张样例图片、Shell权重下载脚本、Dockerfile、Jupyter教程以及docx介绍文档。其中py脚本负责数据格式转换、模型训练与推理,yaml用于配置模型结构和数据集路径,图片可查看检测效果,ipynb提供交互式操作演示。数据集按VOC格式组织,含训练验证划分,可直接复用或扩充。

资源已有608人学习下载。整体内容提供YOLOv5核心代码、预训练权重与完整tutorial,能快速跑通检测流程,理解图像预处理、推理到结果展示的完整链路,适合作为毕业设计或工程项目的起点。 工地安全帽检测这个场景,我接触过不少同行都在做。YOLOV5 头盔佩戴检测识别系统,说白了就是用目标检测模型判断画面里的人有没有戴安全帽,属于典型的计算机视觉落地项目。我拿到过一个比较完整的资源包,里面带源码、数据集、训练好的权重和教程,正好借这个机会把整个系统的技术细节和实操要点拆开讲讲。

这个包适合谁?一类是做毕业设计的在校生,另一类是想快速验证工地安全巡检方案的开发者。压缩包里已经把训练到推理的完整链路打包好了,拿到手要做的不是重新造轮子,而是搞清楚每一层文件的作用、模型是怎么训练的、换到自己的场景要怎么微调。我下面会从目录结构、模型选型、数据组织、训练调参、推理部署这几个维度挨个说透。

1. 解压之后,先搞清楚这个项目包的真实结构

拿到一个“源码+数据集+训练好的数据+教程”的压缩包,第一件事不是急着双击运行,而是先把目录结构摸清楚。很多同学上来就运行python detect.py,结果各种报错,多半是不知道每个文件夹是干嘛的、路径怎么组织的。

1.1 典型目录结构与核心文件解读

一个标准的 YOLOV5 项目目录大致会包含这些内容:

├── data/ # 数据集配置文件和类别定义 │ ├── helmet.yaml # 数据集路径、类别数量、类别名称 │ └── images/ # 图像数据(train/val 子目录) ├── models/ # 模型结构定义(yolov5s.yaml、yolov5m.yaml 等) ├── runs/ # 训练输出目录(权重、日志、曲线图) │ └── train/exp/weights/ │ ├── best.pt # 验证集效果最好的权重 │ └── last.pt # 最后一轮的权重 ├── detect.py # 推理脚本 ├── train.py # 训练脚本 ├── val.py # 验证脚本 └── requirements.txt # 依赖环境

重点看几个关键文件。helmet.yaml是数据集配置中心,里面写死了训练集和验证集的路径、类别数nc、类别名names。如果要在自己的数据上训练,最核心的改动就在这里。best.pt是整个项目包最有价值的部分,它是已经训练好的权重,直接拿来做推理完全够用。last.pt是训练中断时恢复用的,正常推理一般选best.pt

1.2 快速跑通推理的正确姿势

拿到包先跑一次推理,验证环境通不通。我用一张未戴头盔的工地照片测试,命令大概是:

python detect.py --weights runs/train/exp/weights/best.pt --source data/images/test.jpg --conf-thres 0.5

执行后会在runs/detect/exp下生成标注好的图片。如果这一步能顺利跑通,说明 PyTorch、OpenCV 这些核心依赖没问题。如果报ModuleNotFoundError: No module named 'torch',那就是环境没装好,先按照requirements.txt补依赖。

注意:我遇到过解压后路径带中文导致读取失败的情况。如果项目放在D:\下载\安全帽检测系统\这类路径下,很容易出问题,最稳妥的做法是把整个项目放到纯英文路径,比如D:\helmet_detection\

2. 为什么这个项目选 YOLOV5 而不是 YOLOV8

项目选型时很多人纠结:现在 YOLOV8、YOLOV9 都出来了,为什么还有大量项目用 YOLOV5?我用了这么久,说点真实感受。

2.1 YOLOV5 的核心优势:生态成熟与部署便利

YOLOV5 在 2020 年发布之后,社区生态已经非常成熟。无论是 GitHub 的 issue 解答、博客教程、还是各种部署案例,数量都远超后续版本。对于毕业设计和中小型项目来说,遇到问题能搜到答案比模型性能多一两个点重要得多。而且 YOLOV5 提供了 s/m/l/x 四个尺寸的模型,从几兆到几十兆的权重都有,部署在 Jetson、树莓派、手机端都有成熟的转换方案。

另外 YOLOV5 对硬件要求相对友好。头盔检测这个任务比较简单,类别就两类(戴了和没戴),用最小的yolov5s模型在 GTX 1660 这种老显卡上训几百轮完全没压力。相比之下 YOLOV8 虽然精度稍高,但对显存和推理设备的要求也水涨船高,很多实际工地的边缘设备根本带不动。

2.2 YOLOV5 网络结构速览:一次搞懂 Backbone/Neck/Head

YOLOV5 为什么检测又快又准?这里我快速拆一下结构,不求逐层精读,但至少要明白大框架:

组成部分名称作用
BackboneCSPDarknet提取图像特征,相当于人的眼睛,负责“看”
NeckPANet融合不同尺寸的特征图,负责“汇总”信息
HeadDetect Head输出目标的类别和位置,负责“判断”和“定位”

YOLOV5 的检测不是只看整张图,而是把图片划分成网格,每个网格负责预测中心点落在自己区域内的目标。再加上 Anchor(锚框)机制,相当于预先设定了一些“理想框”的尺寸比例,模型只需要在这些预设框的基础上做微调,所以收敛快、定位准。

2.3 这个项目里选 s 还是 m 模型?

压缩包里一般会有多个配置文件,我拿到的这个项目默认用的是yolov5s.yaml。头盔检测场景目标是大目标,人要占画面一定比例,s模型完全够用。实测下来yolov5s在 1080Ti 上单张图片推理只要 6 到 8 毫秒,在树莓派 4B 上也能跑到每秒 5 帧左右,这个性能对工地闸机、巡检机器人场景绰绰有余。除非要检测的目标特别小(比如远处的人头),否则没必要上更大的模型。

3. 数据集:头盔检测项目最容易翻车的地方

我在帮别人排查训练问题时发现,超过一半的失败案例不是模型问题,而是数据集组织得不对。YOLOV5 对数据格式有硬性要求,差一个斜杠、一个空格都会报错或者导致训练效果稀烂。

3.1 YOLO 标签格式的底层逻辑

YOLOV5 的标注不是用 XML,而是用纯文本的 txt 文件,每一行代表一个目标:

class_id x_center y_center width height

注意这五个值都是归一化后的坐标,范围在 0 到 1 之间,用目标框的绝对像素坐标除以图片宽高得到。比如一张 1280x720 的图片里,一个头盔框的左上角在 (320, 180),右下角在 (640, 540),那么对应的标签就是:

  • x_center = (320 + 640) / 2 / 1280 = 0.375
  • y_center = (180 + 540) / 2 / 720 = 0.5
  • width = (640 - 320) / 1280 = 0.25
  • height = (540 - 180) / 720 = 0.5

所以标签文件里这行是0 0.375 0.5 0.25 0.5(假设戴头盔是类别 0)。这个逻辑一定要亲手算一次,不然很容易在标注转换环节出问题。

3.2 数据集目录到底怎么组织

这个项目包里数据集的目录结构很规整,我建议你完全照搬:

data/ ├── images/ │ ├── train/ # 训练图片(比如 4000 张) │ └── val/ # 验证图片(比如 800 张) ├── labels/ │ ├── train/ # 训练图片对应的 txt 标签 │ └── val/ # 验证图片对应的 txt 标签 └── helmet.yaml # 配置文件

一个关键点:图片和标签必须同名同前缀,比如img_001.jpg对应img_001.txt,否则训练时No labels found的报错分分钟让你崩溃。压缩包里还带了一个标注好的头盔数据集,我大概统计过,如果训练集图片在 3000 张以上,类别均衡的情况下,这个基础模型已经能达到 90% 以上的 mAP。

3.3 用脚本检查标签文件是否合法

别等到训练跑了一半才发现标签有问题,我建议先跑一段检查脚本。这个包附带的数据集正常情况下不会有问题,但如果你想加自己的图片进去,就一定要验证:

import os from PIL import Image def check_labels(img_dir, label_dir): img_names = os.listdir(img_dir) for img_name in img_names: # 读取图片尺寸 img = Image.open(os.path.join(img_dir, img_name)) w, h = img.size # 对应的标签文件 label_path = os.path.join(label_dir, img_name.replace('.jpg', '.txt')) if not os.path.exists(label_path): print(f"标签缺失: {img_name}") continue with open(label_path, 'r') as f: lines = f.readlines() for line in lines: parts = line.split() if len(parts) != 5: print(f"标签格式错误: {img_name} -> {line}") # 检查归一化坐标是否有越界 x_c, y_c, w_b, h_b = map(float, parts[1:]) if x_c > 1 or y_c > 1 or w_b > 1 or h_b > 1: print(f"坐标越界: {img_name} -> {line}") check_labels('data/images/train', 'data/labels/train')

这段脚本能快速识别三类问题:标签缺失、格式错误、坐标越界。坐标越界是标注工具转换过程中最容易出现的,比如用 LabelImg 导出时选错格式,或者在缩放图片后没有同步更新标签。

4. 环境配置与训练:从零跑通整个流程

拿到压缩包后,你自己重新训练一遍是很有价值的。只有亲手跑过一次训练,你才能体会 loss 曲线怎么算健康、batch size 怎么影响显存、数据集质量怎么影响最终效果。

4.1 用 Anaconda 搭建独立环境

我强烈建议用 Anaconda 建一个独立的 Python 环境,不要直接装在系统环境里。依赖冲突是 Python 项目最折磨人的问题,独立环境能让你随时推倒重来。

conda create -n yolov5 python=3.8 conda activate yolov5 cd 项目目录 pip install -r requirements.txt

requirements.txt会装好 torch、torchvision、opencv-python、matplotlib 这些核心依赖。如果你有 NVIDIA 显卡,建议提前确认 CUDA 版本和 PyTorch 是否匹配,直接在命令行跑python -c "import torch; print(torch.cuda.is_available())",返回True就说明 GPU 环境没问题。没有 GPU 的话也能训练,只是速度会慢不少,头盔检测数据量小的话 CPU 硬扛也不是不行。

4.2 三个必须改的配置:data、model、超参数

训练前要改的核心文件是helmet.yaml。这个项目的类别只有两类,nc: 2names: ['helmet', 'head'],如果你的业务里要多一类“未佩戴”,就得改成nc: 3并补充类别名。特别注意trainval路径,推荐写绝对路径或者相对data/目录的路径,我在 Windows 上遇到的路径报错有一半是反斜杠引起的。

模型配置文件如果不动网络结构,用默认的yolov5s.yaml就行。但你可以调整输入尺寸img,YOLOV5 支持 320 到 1280 的多种尺寸。头盔检测我一般选 640,兼顾速度和精度。短边太长会拖慢训练,短边太短小目标容易漏检,640 是个折中方案。

4.3 训练命令与关键参数解读

训练命令基本是这个套路:

python train.py --data data/helmet.yaml --weights yolov5s.pt --img 640 --batch 16 --epochs 100 --device 0

几个参数我要多解释几句:

  • --weights用预训练权重做迁移学习,别用--weights ''从零开始训,收敛慢且精度差。这里用的是 COCO 预训练模型,前几层学到的通用特征(边缘、纹理)可以直接复用。
  • --batch受显存限制。16G 显存跑yolov5s开 16 没问题,如果爆显存(CUDA out of memory),先降到 8 或者 4。
  • --epochs头盔检测这种简单任务,100 轮足够,数据量少的话 60 轮就已经收敛了。跑 300 轮反而容易过拟合。
  • --device 0指定用第一张 GPU。多卡可以写0,1,但我建议新手先单卡跑通再考虑分布式。

训练开始后日志会显示每轮的 box_loss、obj_loss、cls_loss 和 mAP。你会看到 mAP 在前几十轮快速上升,然后在 90 左右波动,这是正常现象。如果训练了 50 轮 mAP 还在 50 以下,优先检查数据而不是调参——大概率是标签类别标错了、数据集类别不平衡、或者有大量空标签图片。

4.4 训练输出的产物怎么用

训练结束后有三个东西值得关注:runs/train/exp/weights/best.ptlast.ptresults.pngbest.pt是在验证集上 mAP 最高的权重,推理首选它。last.pt是最后一轮权重,如果训练后期过拟合了,你甚至会发现best.ptlast.pt早了好几十轮。results.png包含 loss 曲线和 P/R/mAP 曲线,是判断模型是否健康的关键证据。正常的 loss 曲线应该是平滑下降、没有明显反弹;反弹说明学习率太大或者数据有噪声。

5. 推理部署与效果调优:从能跑到好用

模型训练完之后,核心工作从“让模型跑起来”变成“让模型跑得好”。我见过很多人模型训练完了,一部署到实际视频流里效果立马拉胯,原因基本都出在阈值设置和推理脚本参数上。

5.1 detect.py 推理参数实战

我用这个系统对一段工地实时视频做检测,命令是这样的:

python detect.py --weights runs/train/exp/weights/best.pt --source test.mp4 --conf-thres 0.4 --iou-thres 0.45 --save-txt --save-conf

参数选择有讲究。--conf-thres是置信度阈值,低于这个值的目标会被过滤掉。实际场景里如果漏检多,就把阈值调低到 0.25 或 0.3;如果误检多(比如把其他圆形物体识别成头盔),就往高了调,我最高调到过 0.7。注意这是从预测结果里做筛选,和 NMS 的--iou-thres是两码事。--save-conf会在 txt 里保存置信度,方便后续做告警联动——比如置信度大于 0.8 且类别为“未戴头盔”时,触发语音报警。

如果用摄像头实时检测,把--source改成0就行:

python detect.py --weights runs/train/exp/weights/best.pt --source 0

5.2 模型效果不理想,先看数据再动结构

头盔检测如果出现大量误检或漏检,我总结了几个排查方向:

第一,检查数据集的场景分布。如果训练集里全是清晰大头照,部署到雨天、逆光、远距离的工地场景,效果一定打折。解决办法是尽量用与部署场景相近的数据重新训练或 fine-tune。

第二,加数据增强。YOLOV5 内置了 Mosaic、随机翻转、HSV 扰动、旋转等增强策略,如果你用的是默认超参数,可以试着手动加大hsv_hhsv_s的扰动范围。对头盔检测来说,不同颜色的头盔在 HSV 空间差异很大,增强后能有效提升泛化能力。

第三,调整 Anchor。YOLOV5 在训练时会自动学习 Anchor,日志里有个autoanchor的过程。如果检测目标尺寸分布比较特殊(比如全是小目标),可以手动运行:

python train.py --data data/helmet.yaml --weights yolov5s.pt --img 640 --epochs 1 --noautoanchor

先跑一轮,让模型在数据集上重新聚类 Anchor,然后再正常训练。这个操作短期内看不出效果,但对小目标检测的提升比较明显。

5.3 从检测到告警:扩展思路

很多同学装好系统后就停留在“能检测”这一步,其实再往下走一步就是完整的告警系统。用一个简单的 Python 脚本循环读视频帧,检测到未戴头盔的目标就调用playsound或者接入消息通知,整个系统就闭环了。包里的detect.py--save-txt参数,就是方便做这类逻辑对接的。

6. 高频问题与排查速查表

我把实际使用过程中踩过、以及帮别人排查过的坑整理成了一张速查表。新手遇到问题先对着这个表排查,能省不少时间。

问题现象可能原因解决方法
运行 detect.py 报No module named 'torch'环境没装好或没激活pip install -r requirements.txt,检查 conda 环境
训练时报No labels found in data/helmet.yaml标签路径错误或标签文件为空检查helmet.yaml路径,确认labels/train下 txt 文件存在
CUDA out of memorybatch size 太大调小--batch,或--img从 640 降到 512
训练正常但 mAP 低(<70)标签类别错误或数据不平衡可视化标签看是否错标,检查ncnames是否匹配
推理时误检多置信度阈值太低调高--conf-thres到 0.6 或 0.7
训练 loss 曲线剧烈震荡学习率太大或 batch size 太小调小学习率(默认是 0.01 起),增大 batch size
新场景效果差但实验室数据好数据分布不一致收集目标场景数据,增强或迁移学习
CPU 推理速度只有 0.5s/张太慢模型太重或没 GPUyolov5n/yolov5s,或模型导出 ONNX 用 OpenVINO 推理

6.1 为什么换了数据集就要重新训练

有些同学拿着best.pt直接去检测别的工地的图,效果不好就问是不是模型坏了。其实不是模型坏了,而是数据集和部署场景不匹配。best.pt是在这个包自带的数据集上训出来的,对高质量、近距离、光照良好的图片表现很好,但一到远距离、雨天、逆光场景就可能掉点。这种情况不用重新训练整个模型,用少量新场景数据在预训练权重上继续微调几轮,效果提升会非常明显。

6.2 数据集的“脏”比模型结构更致命

我见过一个案例:某同学训练时 mAP 一直在 85 左右上不去,数据检查才发现,标注工具在导出时把 class_id 弄混了,戴头盔变成了类别 1,未戴变成类别 0。这种情况对 loss 的影响很大,模型会因为类别语义矛盾而无法收敛到最优。所以每次用新数据集训练之前,一定要随机抽 20 张图片可视化验证。

7. 我的一些实操体会和建议

如果你打算把这个项目拿来做毕设或者简历项目,我建议不要停留在“我会跑通代码”这个层面,公开可复现的项目太多了,重要的是你能讲清楚每个环节的取舍。比如问你为什么用yolov5s而不是yolov5l?答案应该是:头盔检测目标属于中等大目标,s模型速度快、部署方便、精度足够,在边缘设备上优势明显。这就是懂和不懂的区别。

最后分享一个我觉得很实用的技巧:训练的时候不要把 100 轮全部跑完才看结果。YOLOV5 每隔一定轮次会输出验证集指标,我一般在 30 轮左右去看一次results.png,如果 mAP@0.5 还在 50 以下,会中断训练回去检查数据,而不是傻傻等 100 轮跑完。训练使用的迭代策略可以更灵活,利用早停(比如连续 20 轮 mAP 不升就停),既省时间又避免过拟合。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询