基于YOLOV5的工地安全帽检测系统:训练到部署技术详解
简介这是一份基于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/HeadYOLOV5 为什么检测又快又准这里我快速拆一下结构不求逐层精读但至少要明白大框架组成部分名称作用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.375y_center (180 540) / 2 / 720 0.5width (640 - 320) / 1280 0.25height (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 python3.8 conda activate yolov5 cd 项目目录 pip install -r requirements.txtrequirements.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并补充类别名。特别注意train和val路径推荐写绝对路径或者相对data/目录的路径我在 Windows 上遇到的路径报错有一半是反斜杠引起的。模型配置文件如果不动网络结构用默认的yolov5s.yaml就行。但你可以调整输入尺寸imgYOLOV5 支持 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.pt、last.pt和results.png。best.pt是在验证集上 mAP 最高的权重推理首选它。last.pt是最后一轮权重如果训练后期过拟合了你甚至会发现best.pt比last.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 05.2 模型效果不理想先看数据再动结构头盔检测如果出现大量误检或漏检我总结了几个排查方向第一检查数据集的场景分布。如果训练集里全是清晰大头照部署到雨天、逆光、远距离的工地场景效果一定打折。解决办法是尽量用与部署场景相近的数据重新训练或 fine-tune。第二加数据增强。YOLOV5 内置了 Mosaic、随机翻转、HSV 扰动、旋转等增强策略如果你用的是默认超参数可以试着手动加大hsv_h、hsv_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标签类别错误或数据不平衡可视化标签看是否错标检查nc和names是否匹配推理时误检多置信度阈值太低调高--conf-thres到 0.6 或 0.7训练 loss 曲线剧烈震荡学习率太大或 batch size 太小调小学习率默认是 0.01 起增大 batch size新场景效果差但实验室数据好数据分布不一致收集目标场景数据增强或迁移学习CPU 推理速度只有 0.5s/张太慢模型太重或没 GPU换yolov5n/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如果 mAP0.5 还在 50 以下会中断训练回去检查数据而不是傻傻等 100 轮跑完。训练使用的迭代策略可以更灵活利用早停比如连续 20 轮 mAP 不升就停既省时间又避免过拟合。本文还有配套的精品资源点击获取