简介:面向深度学习入门者与毕业设计学生,这是一套基于YOLOv5的头盔佩戴检测识别完整项目,覆盖数据标注、模型训练、推理部署与结果展示全流程,可直接用于工地安全帽佩戴检测场景。资源共77个文件、约23.72MB,包含13个Python源码(涵盖数据转换、训练、检测等模块)、24个YAML配置文件(含多种数据集与超参配置)、26张JPEG示例图像、6个Shell脚本、说明文档及教学视频,并已提供训练好的权重文件,免去长时间训练成本。已有608人学习下载。项目配套教程从数据收集整理、VOC格式转换到YOLOv5训练调参均有说明,同时给出Dockerfile与依赖清单,便于环境复现;ipynb交互式笔记可逐步演示运行过程。对于需要完成课程设计或毕业设计的同学,这套资源能提供清晰的代码框架和可直接运行的基础模型,帮助理解目标检测落地的关键环节。 最近好多做毕设和在工地做安全管理的朋友问我头盔检测怎么做,市面上相关的项目资料不少,但真正能跑通的却不多。我手上有一套“基于YOLOV5的头盔佩戴检测识别系统”的完整资源包,里面源码、数据集、训练好的权重、教程全都有,我整理了一下,把整个项目从拆解到复现的过程写成这篇分享,适合正在做毕业设计的学生、安全智能化的从业者,以及想入门YOLOV5目标检测的学习者参考。
这套系统的核心任务很明确:从监控画面或图片中识别工人头部区域,判断是否佩戴了安全头盔。模型本质上是一个单阶段目标检测器,基于YOLOV5实现,把“戴了头盔的头部”和“没戴头盔的头部”分别作为独立类别检出。相比人工巡检,这套方案能7x24小时工作,而且部署成本不高,一台普通办公电脑就能训练和推理。
1. 项目全貌拆解与核心价值
1.1 这套资源包里到底装了什么
拿到压缩包先别急着解压跑代码,先看清楚目录结构,搞清楚每个文件是干什么用的。一个正规的头盔检测项目资源包通常包含以下四类东西。
第一是源码。里面会有完整的YOLOv5工程目录,包括detect.py(推理脚本)、train.py(训练脚本)、val.py(验证评估脚本)等核心文件。注意,YOLOv5官方仓库是持续更新的,资源包里打包的往往是某个稳定版本,比如v5.0或v6.0,这个版本号在配置文件yolov5s.yaml里能看到。
第二是数据集。常见的开源安全头盔数据集有SHWD,包含7581张图像,标注了head(未佩戴)和helmet(佩戴)两类目标。资源包中的数据集一般也是这个格式的整理版,目录结构如下:
dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ ├── train.txt └── val.txt标签文件是YOLO格式的txt文件,每行代表一个目标,格式为“类别id 中心点x坐标 中心点y坐标 宽度 高度”,坐标值全部归一化到0到1之间。
第三是训练好的权重文件。正常情况下在runs/train/exp/weights/目录下,里面会有best.pt和last.pt两个文件。best.pt是验证集上效果最好的模型,last.pt是最后一轮训练的结果。实操时推理、部署都用best.pt。
第四是教程文档。一般是PDF或Markdown格式,内容包括环境搭建、数据配置、训练命令、推理命令。教程的价值在于把你从零带到能跑通,但实际训练中很多细节还是需要自己摸索,我下面补充的这些内容正好能弥补教程里没写透的部分。
1.2 为什么头盔检测任务选择YOLOv5
目标检测领域的模型很多,两阶段的Faster R-CNN精度高但速度慢,单阶段的SSD速度尚可但小目标效果一般。YOLOv5能在头盔检测这个场景里成为“默认选项”,是因为它在精度、速度、易用性之间取得了很好的平衡。
具体来说,YOLOv5s模型只有7.2M左右的参数量,在GTX 1660这种入门级显卡上,推理一张640x640的图片只需要十几毫秒,实测能跑到60到90帧。在SHWD这类中小规模数据集上训练,只要数据质量正常,mAP@0.5达到90%以上是大概率事件。
另外一个很现实的原因是生态。YOLOv5出世早、用户多,基于它的二次开发和部署方案非常成熟,OnnxRuntime、NCNN、TensorRT这些推理框架都支持它。对做毕设的学生来说,资源丰富意味着遇到问题更容易搜到解决方案;对实际项目来说,落地技术路线成熟稳定。头盔检测这种任务,模型结构不需要多复杂,重点在数据集质量和工程化能力,用YOLOv5是效率最高的选择。
2. 训练前必须理清的三个关键点
2.1 数据集的构成与组织方式
很多同学上来就python train.py直接跑,结果报错找不到标签文件,或者训练出来的模型检测效果一塌糊涂。问题往往出在数据集上。
头盔检测数据集的标注类别有讲究。标准做法是设两个类别:类别0是helmet(戴了安全帽的头部),类别1是head(没戴的头部)。检测模型其实只负责找出这两种目标,至于“戴没戴”是后续逻辑判断的事——只要在画面中检出head,就意味着该位置有人且未佩戴。
也有做法是只标注一个类别,把所有佩戴的头部框出来,用helmet单类别检测。这种做法的问题是,如果一个工人完全没戴帽子,模型根本不会输出任何目标,你没法判断“是没有人”还是“有人但没戴”。所以在实际工程中,强烈建议用双类别方案。
拿到数据集后,第一件事是检查标签文件跟图片能不能对得上。我一般写个脚本统计数据集情况:
import os def check_dataset(labels_dir, images_dir): label_files = os.listdir(labels_dir) image_files = os.listdir(images_dir) print(f"标注文件数量: {len(label_files)}") print(f"图片文件数量: {len(image_files)}") empty_labels = 0 for f in label_files: path = os.path.join(labels_dir, f) if os.path.getsize(path) == 0: empty_labels += 1 print(f"空标注文件数量: {empty_labels}") check_dataset("dataset/labels/train", "dataset/images/train")检查重点有两个:一是图片和标签数量是否匹配,二是是否存在空的标签文件。空标签对应的是没有目标的背景图,这类图片可以保留,但数量太多会让模型偏向“什么都不检”。
2.2 配置文件与超参数怎么改
YOLOv5训练前需要修改两个配置文件。第一个是模型配置文件,比如models/yolov5s.yaml,核心是nc(类别数)字段,头盔检测改成nc: 2。第二个是数据集配置文件,比如data/helmet.yaml,内容如下:
train: dataset/images/train val: dataset/images/val nc: 2 names: ['helmet', 'head']这里特别要注意train和val的路径写法。YOLOv5支持绝对路径和相对路径,但相对路径是相对于你执行训练命令时所在的目录。建议直接用绝对路径,省得来回排查路径报错问题。
超参数文件data/hyps/hyp.scratch-low.yaml一般不用大改,默认参数适用于大多数场景。训练时batch-size、img-size、epochs这些值在命令行传入即可。初次实验建议用batch-size 16、img-size 640、epochs 100。如果显卡显存不够,batch-size降到8或4,img-size降到416,但要注意输入分辨率降低后,小目标的检测效果会变差。
还有一点很多人容易忽略:预训练权重yolov5s.pt要不要带上?要从头训练就得用--weights yolov5s.pt,这个文件会在首次训练时自动下载;想清空权重从头训练就加--weights ''。实操中几乎总是用预训练权重做迁移学习,因为COCO数据集上学到的特征对头盔检测很有帮助,能加快收敛,提高最终精度。
2.3 模型选型:s、m、l还是x
YOLOv5提供n、s、m、l、x五个规格,从n到x网络深度和宽度依次增加,精度更高但速度更慢。头盔检测属于目标较大、背景相对单一的任务,不需要用到l或x这种重模型,YOLOv5s足够。如果你的硬件条件很差,只有CPU没有GPU,可以考虑YOLOv5n,但训练时间依然会比较煎熬。
我实际测试过在同样数据集和参数下,YOLOv5s和YOLOv5m的效果,m比s的mAP@0.5能高1到2个百分点,但推理速度慢了将近一倍。对于视频实时监控场景,帧率很关键,所以综合取舍下来,s是性价比最高的选择。
3. 从零跑通完整训练流程
3.1 环境准备与安装避坑
先把环境搞定。我用的环境是Python 3.8 + PyTorch 1.8.1 + CUDA 11.1,这是经过大量用户验证的组合,稳定不容易翻车。安装PyTorch时要特别注意版本和CUDA版本要匹配,用官方命令安装:
pip install torch==1.8.1 torchvision==0.9.1 --extra-index-url https://download.pytorch.org/whl/cu111装完验证一下GPU是否可用:
python -c "import torch; print(torch.cuda.is_available(), torch.__version__)"输出True说明CUDA环境正常。很多小白在第一步就卡住,运行后输出False,这是因为CUDA驱动和PyTorch编译时的CUDA接口版本不对应。建议直接用更新的版本,比如Python 3.9 + PyTorch 2.0以上,配合CUDA 11.8,兼容性更好。
然后安装YOLOv5依赖,在项目根目录下执行:
pip install -r requirements.txt如果下载速度慢,可以使用国内镜像源:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple这里有个坑:YOLOv5官方requirements.txt里没有锁定每个库的版本,有些库版本更新后API变了,会导致运行报错。比如最近numpy更新到2.x后,旧版YOLOv5里有不少报错。解决办法是把依赖手动指定成经过验证的版本,我常用的版本组合是numpy==1.23.5、opencv-python==4.8.0.76、matplotlib==3.7.0。
3.2 训练执行与过程监控
环境没问题后,在项目根目录执行训练命令:
python train.py --data helmet.yaml --cfg yolov5s.yaml --weights yolov5s.pt --epochs 100 --batch-size 16 --img 640 --device 0训练过程中,YOLOv5会在终端每隔一段时间打印一次日志,包括当前epoch数、GPU显存占用、分类损失、边界框回归损失、mAP等指标。同时在runs/train/exp目录下生成results.png和results.txt,前者绘制了训练过程各种指标的变化曲线,后者是纯文本数据。
观察训练是否正常的几个经验值:正常情况下一开始的box_loss大约在0.08到0.12之间,随着训练进行缓慢下降并最终平稳;mAP@0.5如果数据质量好,一般到第50个epoch左右就能达到85%以上。如果曲线忽高忽低、震荡剧烈,通常说明学习率过大,可以在训练命令中降低--lr0这个参数。
还有一个经常被忽略的点:YOLOv5每轮的训练日志会显示Class Images Instances P R mAP50,注意看Instances一列,如果某一类的样本数特别少,模型的P和R值会明显偏低。这说明你的数据集类别不均衡,要么补充样本,要么调整权重。
3.3 模型评估与推理验证
训练完成后,先看验证集效果。YOLOv5的val.py默认会对最后一次训练的权重进行评估:
python val.py --data helmet.yaml --weights runs/train/exp/weights/best.pt --img 640验证结果会打印出每个类别对应的精确率P、召回率R和mAP。对头盔检测来说,我更看重召回率R,也就是“该检出的没戴头盔目标有没有漏掉”。R达不到90%以上,在安全场景里意味着有大量漏检,后果很严重。如果R偏低,优先考虑的是数据不够、标注不准,而不是调模型结构。
推理验证用detect.py:
python detect.py --weights runs/train/exp/weights/best.pt --source test.jpg --conf-thres 0.5输出图片会保存到runs/detect/exp,画面上会显示类别名称和置信度。把几张没戴头盔的测试图丢进去跑一遍,心里就有底了。
4. 常见问题排查与实战经验
4.1 训练报错与显存问题速查表
跑项目的过程难免遇到各种问题,我把头盔检测项目里最容易碰到的坑整理成表格,按故障现象、原因排查、解决方案三个维度来写:
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
CUDA out of memory | batch-size过大或输入分辨率过高 | 降低--batch-size到8或4,或降低--img到416 |
FileNotFoundError: .../train.txt | 数据路径配置错误 | 检查helmet.yaml中的路径是否与实际目录一致,改用绝对路径 |
| 训练时loss直接为NaN | 学习率过大或数据中存在异常标签 | 检查标签文件坐标是否超出0到1范围,降低--lr0为0.001 |
模型对所有图片都输出helmet | 数据集类别严重不均衡 | 补充head类别的样本,或做数据增强 |
| mAP一直为0 | 配置文件中nc类别数与标签文件类别id不匹配 | 检查helmet.yaml中nc是否等于2,标签文件里类别id是否只有0和1 |
| 推理时框的位置完全错误 | 使用了COCO预训练权重但没有覆盖类别数 | 训练前确认已经修改了yolov5s.yaml中的nc字段 |
显存不足是新手遇到最多的报错,也是最容易解决的。除了降低batch-size,还可以开启梯度累积,在训练命令中加--cache-ram把数据缓存到内存,能减少磁盘IO。显存型显卡只有4G以下的话,建议直接换yolov5n而不是yolov5s,省显存效果也不错。
4.2 检测效果不佳的优化手段
模型训练出来了但检测效果不理想,先别急着换模型结构,依照下面优先级处理。
第一步是扩充数据。数据量太少是一切问题的根源。头盔检测的数据集如果能到5000张以上,效果会有明显的提升空间。可以做简单的数据增强:随机旋转、左右翻转、亮度调整、添加噪声。YOLOv5自带增强策略,默认的hyp文件里已经配置了hsv_h、hsv_s、fliplr等参数,训练时始终会生效,但补充真实场景的数据仍然是最有效的办法。
第二步是检查标注质量。我遇到过一种情况:标注框比实际头盔大一圈,或者漏标了远处的目标,这都会让模型训练时学歪。用python utils/plots.py可视化检查一批标签,把标注框画到图片上看一眼,比自己瞎猜强得多。
第三步是调整置信度阈值和NMS参数。推理时--conf-thres默认是0.25,如果误检太多就调到0.5;如果漏检多,可以降到0.1。NMS阈值--iou-thres默认是0.45,目标重叠严重可以调低到0.3。这些参数对最终效果的影响远大于调几层卷积网络结构。
4.3 部署到实际场景的几点体会
训练完的模型最终要部署到实际场景,比如工地实时监控。这里有几个经验可以分享。
第一个经验是导出ONNX格式。YOLOv5官方提供export.py,一条命令就能把.pt转成.onnx:
python export.py --weights runs/train/exp/weights/best.pt --include onnx --img 640ONNX格式的模型可以脱离PyTorch环境运行,用OnnxRuntime推理速度比PyTorch原生推理快不少,也更方便嵌入到其他平台。
第二个经验是实际场景的模型需要更新。工地场景和白天的照片训练出来的模型,在夜间或者逆光环境下效果大概率会打折扣。所以数据采集时要有意识地覆盖不同光照、不同角度、不同距离的样本,而不是只收集“好看”的正面样本。
第三个经验是预警机制需要加工。模型输出的是每个目标的类别和位置,实际安全系统里要做的逻辑判断包括:如果同时检测到head,立即上报告警;结合目标框中心点和跟踪算法判断人员是否进入了危险区域。这部分业务逻辑是关键,把模型集成进业务系统能发挥真正的价值。
最后分享一个我实测过的小技巧,训练完模型之后,用那些漏检的图片做一次“难例挖掘”,把漏检图片加入训练集重新微调。两个epoch就能显著提高模型在困难样本上的表现。我在跑头盔项目时,仅做了三轮难例补充,漏检率就下降了一半。这个项目非常适合作为目标检测实战入门的第一课,从数据处理到训练部署,链路完整、任务落地、坑也不算太深。上手的时候遇到问题,欢迎对照我上面的这些排查方法来处理。
本文还有配套的精品资源,点击获取