尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
YOLOv5工地安全帽识别实战:从源码拆解到训练推理全流程
简介本资源面向计算机视觉入门与进阶开发者提供一套基于YOLOv5的工地安全监控实战项目重点解决安全帽佩戴检测与禁入危险区域识别两类问题适合希望掌握目标检测落地流程、积累项目经验的学生与工程师。压缩包共61个文件约22.32MB以22个Python脚本为核心涵盖训练、验证、检测与可视化界面逻辑另有9个yaml模型与数据配置、11张jpg与5张png效果图、3个gif演示动图以及json、md、ui等辅助文件结构完整。目前已有806人学习下载。资源包含完整源码与超详细训练教程覆盖数据集标注与格式转换、模型配置与超参数调整、train.py训练、val.py评估、detect.py实时检测等环节并附带可视化工具与界面文件便于读者快速复现工地安全帽与危险区域识别系统理解从数据准备到部署应用的完整链路。1. 工地安全帽识别系统拆包YOLOv5 源码里到底藏了什么工地安全监控这件事真正落到代码层面核心就两个诉求一是实时判断工人有没有戴安全帽二是判断有没有人闯进危险区域。这套Smart_Construction-master就是围绕这两个诉求做的 YOLOv5 落地项目不是那种只跑个 demo 就完事的玩具。它把训练、推理、可视化界面、权重下载脚本都打包好了拿到手能直接跑通一条完整链路。我拆这个包的时候第一反应是目录结构比想象中完整。models/里放了 yolov5s 到 yolov5x 五档配置utils/里是数据加载、增强、torch 工具这些底层件data/下挂着custom_data.yaml和area_labels说明作者是认真做过自定义数据集适配的。visual_interface.py和UI/目录说明还配了个可视化界面不是纯命令行。适合谁适合手上有工地监控视频、想快速搭一套检测流水线的开发者也适合想拿一个真实场景练 YOLOv5 全流程的人。下面我按「能跑起来 → 能改 → 能避坑」的顺序拆。2. 环境搭建与权重获取从零把推理链路跑通2.1 依赖安装与目录结构确认拿到包先别急着python detect.py先把目录结构看清楚。这个项目的关键路径有这么几个路径作用models/YOLOv5 网络定义与五档 yaml 配置utils/数据加载、增强、通用工具函数data/数据集配置custom_data.yaml、区域标签weights/权重存放目录配合download_weights.shUI/可视化界面含main_window.py和.ui文件train.py/test.py/detect.py训练、验证、推理入口确认完结构装依赖。项目根目录有requirements.txt但 YOLOv5 这类项目的依赖版本比较敏感我一般不会直接pip install -r而是先看里面 torch 和 torchvision 的版本约束。# 建议先建虚拟环境避免和系统里的 torch 打架 python -m venv venv_smart source venv_smart/bin/activate # Windows 用 venv_smart\Scripts\activate # 查看 requirements 里的关键版本 cat requirements.txt | grep -E torch|torchvision|numpy|opencv # 按需安装torch 版本要和 CUDA 对齐 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt这里有个参数要留意--index-url后面的 cu118 要和你本机 CUDA 版本对应。如果你只有 CPU就去掉这个参数装 CPU 版 torch但推理速度会差一个量级工地实时监控场景基本不能接受。装完之后用一行代码验证import torch print(torch.__version__, torch.cuda.is_available()) # 期望输出类似 2.x.x True如果cuda.is_available()返回 False先别往下走回去查显卡驱动和 CUDA 版本匹配这是后面所有步骤的前提。2.2 权重下载与推理验证项目里给了download_weights.sh这是获取预训练权重的入口。我一般会先看脚本内容再执行确认它下载的是什么权重、放到哪个目录。# 先看脚本干了什么 cat download_weights.sh # 确认无误后执行 bash download_weights.sh # 检查权重是否落到 weights/ 目录 ls -lh weights/权重到位后用detect.py跑一张测试图验证链路。项目根目录有1.jpg、2.jpg这些样例图可以直接拿来用# 单图推理--weights 指定权重--source 指定输入 python detect.py --weights weights/yolov5s.pt --source 1.jpg --conf-thres 0.4 --device 0 # 批量推理整个目录 python detect.py --weights weights/yolov5s.pt --source data/images/ --conf-thres 0.4参数说明--conf-thres是置信度阈值工地场景我一般从 0.4 起步太低会误报一堆太高会漏掉远处的小目标安全帽。--device 0指定第一块 GPU没有 GPU 就写cpu。推理结果默认输出到runs/detect/exp目录下打开图片看框有没有画对。如果框的位置明显偏移或者类别标错大概率是权重和你的类别定义不匹配这时候要回到custom_data.yaml检查类别配置。3. 自定义数据集训练从标注到 train.py 跑通3.1 数据标注与 YOLO 格式转换工地安全帽检测的数据集核心是两个类别helmet戴安全帽和head未戴或者直接标person再细分。危险区域识别则是另一套逻辑项目里用area_labels和area_detect.py单独处理这个后面讲。先说安全帽这类目标检测的数据准备。标注工具常见的是 LabelImg导出格式选 YOLO 格式每张图对应一个.txt每行是class_id x_center y_center width height全部归一化到 0~1。这里有个血泪经验标注的时候框要贴紧目标边缘不要留太多背景否则模型学到的特征会偏。转换脚本我一般自己写一个因为不同标注工具导出的格式总有差异import os import xml.etree.ElementTree as ET # 把 VOC 格式的 xml 转成 YOLO 的 txt def voc_to_yolo(xml_path, classes, output_dir): tree ET.parse(xml_path) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) lines [] for obj in root.iter(object): cls_name obj.find(name).text if cls_name not in classes: continue cls_id classes.index(cls_name) bbox obj.find(bndbox) x1 float(bbox.find(xmin).text) y1 float(bbox.find(ymin).text) x2 float(bbox.find(xmax).text) y2 float(bbox.find(ymax).text) # 归一化并转成中心点宽高 x_center (x1 x2) / 2.0 / w y_center (y1 y2) / 2.0 / h bw (x2 - x1) / w bh (y2 - y1) / h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {bw:.6f} {bh:.6f}) # 写到同名 txt base os.path.splitext(os.path.basename(xml_path))[0] with open(os.path.join(output_dir, base .txt), w) as f: f.write(\n.join(lines)) classes [helmet, head] # 遍历你的 xml 目录逐个转换这段逻辑的关键在归一化那几步x_center和y_center是框中心点除以图宽高bw和bh是框宽高除以图宽高。YOLO 只认这种格式少一步归一化训练时 loss 会直接炸。转换完检查一下有没有空 txt 文件空文件会让 dataloader 报错。3.2 custom_data.yaml 配置与 train.py 启动数据准备好之后改data/custom_data.yaml。这个文件告诉 YOLOv5 去哪里找图、类别有几个、叫什么名字# custom_data.yaml train: ../datasets/train/images # 训练集图片路径 val: ../datasets/val/images # 验证集图片路径 nc: 2 # 类别数 names: [helmet, head] # 类别名称顺序要和标注时的 class_id 对应路径这块有个坑YOLOv5 里train和val的路径是相对于train.py所在目录解析的不是相对于 yaml 文件。我一般直接写绝对路径省事或者用path字段统一指定根目录。配置好之后启动训练# 用 yolov5s 预训练权重做迁移学习 python train.py \ --weights weights/yolov5s.pt \ --data data/custom_data.yaml \ --epochs 100 \ --batch-size 16 \ --img-size 640 \ --device 0 \ --workers 4参数逐个说--epochs 100是训练轮数工地数据集一般 5000 张图以内100 轮够收敛多了容易过拟合。--batch-size 16看显存8G 显存跑 yolov5s 加 640 分辨率16 差不多是上限爆显存就降到 8。--img-size 640是输入分辨率安全帽这种小目标可以提到 1280但显存和速度代价要自己权衡。--workers 4是 dataloader 线程数Windows 下有时候设高了会卡死设 0 或 2 更稳。训练过程中看runs/train/exp下的results.csv重点盯mAP0.5和box_loss。如果 loss 一直不降先查学习率YOLOv5 默认用余弦退火初始 lr 在data/hyp.scratch.yaml里一般不用动。如果 mAP 卡在低位大概率是数据集标注质量或者类别不平衡的问题回去看head类是不是样本太少。3.3 危险区域识别area_detect.py 的独立逻辑安全帽检测是目标检测危险区域识别是另一回事。项目里area_detect.py和area_labels是单独一套逻辑本质是在画面上画多边形区域然后判断检测框中心点有没有落进去。这个思路比训练一个「危险区域」类别要靠谱得多因为区域是人为定义的不需要模型去学。# area_detect.py 的核心逻辑简化版 import cv2 import numpy as np # 定义危险区域多边形顶点按实际画面坐标填 danger_zone np.array([[100, 200], [500, 200], [500, 600], [100, 600]], np.int32) def check_in_zone(center_x, center_y, zone): # 用 pointPolygonTest 判断点是否在多边形内 result cv2.pointPolygonTest(zone, (center_x, center_y), False) return result 0 # 0 表示在内部或边界上 # 假设 detections 是 [(x1,y1,x2,y2,cls_id), ...] for det in detections: cx (det[0] det[2]) / 2 cy (det[1] det[3]) / 2 if check_in_zone(cx, cy, danger_zone): print(警告有人进入危险区域)这里的关键参数是danger_zone的顶点坐标必须按你实际摄像头的画面分辨率来标。我一般会先截一帧画面用画图工具量好像素坐标再填进去。pointPolygonTest的第三个参数设 False 表示只返回正负判断设 True 会返回实际距离做预警分级的时候有用。4. 可视化界面与批量推理visual_interface.py 怎么用4.1 UI 目录结构与启动方式项目里UI/目录下有main_window.py和main_window.ui这是 PyQt 做的可视化界面。.ui文件是 Qt Designer 的设计稿main_window.py是逻辑代码。启动方式一般是# 先确认 PyQt5 装了 pip install PyQt5 # 启动界面 python visual_interface.py如果报No module named PyQt5就是依赖没装全。如果界面能打开但按钮没反应检查main_window.py里信号槽的连接常见问题是.ui文件路径写的是相对路径换个目录启动就找不到。我一般会把.ui文件路径改成基于__file__的绝对路径import os ui_path os.path.join(os.path.dirname(os.path.abspath(__file__)), main_window.ui)这个界面本质是把detect.py的推理逻辑包了一层壳方便不熟悉命令行的同事直接用。如果你要集成到自己的系统里直接调detect.py的函数比走 UI 更灵活。4.2 批量推理与结果导出工地场景经常要跑一整天的监控录像单张推理不够用。detect.py支持视频和目录输入# 跑视频文件 python detect.py --weights weights/best.pt --source test_video.mp4 --conf-thres 0.45 --save-txt # 跑整个图片目录保存带框结果 python detect.py --weights weights/best.pt --source data/test_images/ --save-txt --save-conf--save-txt会把检测结果存成 txt格式和标注格式一样方便后续做统计。--save-conf会在 txt 里多一列置信度。这两个参数配合用可以拿推理结果直接做二次分析比如统计一天内未戴安全帽的次数。输出目录默认在runs/detect/exp下递增跑多了记得清理不然磁盘会被塞满。5. 避坑与排查训练和推理里最容易翻车的几件事5.1 显存爆了但 batch-size 已经调到 1现象训练启动几秒后报CUDA out of memory把--batch-size降到 1 还是爆。 原因不一定是 batch 的问题可能是--img-size太大或者 dataloader 的--workers开太多导致内存泄漏。 解决先把--img-size从 640 降到 416 试再把--workers设成 0 排除多进程问题。如果还爆检查是不是同时跑了别的占显存的程序nvidia-smi看一眼。5.2 训练 loss 正常但 mAP 一直是 0现象box_loss在降但验证集mAP0.5始终是 0 或者极低。 原因最常见的是custom_data.yaml里names的顺序和标注时的class_id对不上模型学的是反的。 解决打开一个标注 txt看第一列的数字0 对应names里第一个类别1 对应第二个。如果标反了要么改 yaml要么批量改 txt 里的 class_id。5.3 推理时框的位置整体偏移现象检测框能出来但位置明显偏比如框在人的头顶上方。 原因训练时的--img-size和推理时的输入尺寸不一致YOLOv5 内部做了 letterbox 缩放尺寸不匹配会导致坐标还原出错。 解决训练和推理用同一个--img-size或者推理时不指定让它用默认 640。如果训练用了 1280推理也必须 1280。5.4 危险区域判断总是误报现象area_detect.py频繁报「有人进入危险区域」但画面里人明明在外面。 原因danger_zone的顶点坐标是按某个分辨率标的换了一个摄像头或者改了画面尺寸坐标就对不上了。 解决把区域顶点坐标存成配置文件按摄像头分辨率分别存一套。或者用归一化坐标0~1画的时候再乘回实际宽高。5.5 权重下载脚本执行失败现象download_weights.sh跑完weights/目录还是空的。 原因脚本里的下载链接需要网络能通或者脚本没有执行权限。 解决先chmod x download_weights.sh再bash download_weights.sh看报错信息。如果是链接问题手动去 YOLOv5 官方 release 页面下对应的.pt文件放到weights/下文件名要对上。6. 进阶技巧用 test.py 做模型验证与阈值调优训练完不是终点test.py才是决定这套模型能不能上工地的关键。我一般会在验证集上跑一遍完整评估拿到每个类别的 precision、recall 和 mAP再决定置信度阈值设多少。# 在验证集上评估输出每个类别的指标 python test.py \ --weights runs/train/exp/weights/best.pt \ --data data/custom_data.yaml \ --batch-size 16 \ --img-size 640 \ --task val \ --verbose跑完会输出一张表每个类别一行。重点看helmet和head两类的 recall。工地场景里漏检一个未戴安全帽的人比误报严重得多所以 recall 优先于 precision。如果head类的 recall 低于 0.8说明模型对未戴安全帽的样本学得不够要么加样本要么把--conf-thres调低到 0.3 左右用误报换漏报。调阈值这件事没有标准答案我一般会画一条 PR 曲线找 recall 和 precision 的平衡点。YOLOv5 的test.py跑完会在输出目录生成PR_curve.png和F1_curve.png直接看图比看数字直观。F1 曲线最高点对应的置信度就是理论最优阈值但实际部署时我会再往下调 0.05留一点安全余量。还有一个容易被忽略的点模型量化。如果最终要部署到 RK3568 或者树莓派这类边缘设备PyTorch 的.pt权重直接跑不动需要转 ONNX 再量化成 INT8。项目里models/export.py就是干这个的# 导出 ONNX python models/export.py --weights runs/train/exp/weights/best.pt --img-size 640 --batch-size 1 # 导出后会生成 best.onnx再用 onnxruntime 或 TensorRT 做量化导出 ONNX 的时候--batch-size设 1边缘设备推理基本都是单张。--img-size要和训练一致不然精度会掉。量化这一步坑很多INT8 量化后 mAP 掉 3~5 个点是正常的如果掉太多检查校准集是不是覆盖了足够多的场景。从那以后我每次训练完都会强制走一遍test.py看 PR 曲线再决定阈值和是否量化不靠感觉拍脑袋。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

RabbitMQ高级实战:一条消息不丢的全链路可靠性与高可用策略

RabbitMQ高级实战:一条消息不丢的全链路可靠性与高可用策略

曾有人问我,做消息中间件这么多年,RabbitMQ到底算不算“高级”?我通常会给一个反直觉的回答:在RabbitMQ里能把消息在任何一个环节不弄丢,才叫真正的高级。不是你会写个HelloWorld,不是你能在管理后台看到绿…

📅 2026/10/11 20:22:03
ANSYS有限元分析入门:模块选型、APDL命令流与网格无关性验证

ANSYS有限元分析入门:模块选型、APDL命令流与网格无关性验证

简介:这是一份面向CAE初学者及工科学生的ANSYS有限元分析软件入门介绍PPT。内容完整覆盖软件的主要应用领域,包括结构、热、电磁、流体及耦合场分析,并梳理了ANSYS家族产品如Mechanical、FLUENT、CFX、LS-DYNA等模块的适用场景。演示文稿还详…

📅 2026/10/11 20:22:03
双格式蜗牛数据集:VOC与YOLO标注转换及目标检测训练实战

双格式蜗牛数据集:VOC与YOLO标注转换及目标检测训练实战

简介:面向从事目标检测研究的开发者与学生,一套蜗牛目标检测数据集将真实场景图片与主流的Pascal VOC、YOLO两种标注格式打包在一起,无需再做格式转换,可直接用于YOLO系列、Faster R-CNN等模型的训练、验证与调参。整包仅设Snail一…

📅 2026/10/11 20:22:03
MORE NEWS

更多资讯

📰

从无标题文档到正式发布:先定内核再取标题的创作流程

很多人打开文档软件时,都会看到一个小尴尬:新文档默认名不是“未命名”,就是“无标题”。我自己电脑里,这种文件常年躺了一排,里面有的是灵感碎片,有的是写到一半的草稿,还有的干脆就是空白。但…

📰

斯纳克图书馆管理系统PHP版v6.0实战部署与优化指南

简介:斯纳克图书馆管理系统PHP版v6.0是一套面向中小型图书馆、高校院系资料室及数字资源管理场景的成熟Web应用系统,专为具备PHPMySQL开发基础的IT人员或信息化管理员设计,用于快速部署图书编目、借阅流通、标签打印与多终端认证一体化管理。…

📰

易支付运营版源码部署与支付通道轮询、投诉进件实战解析

简介:面向需要自建聚合支付平台的开发者与站长,这份运营版易支付系统源码提供支付宝、微信、QQ钱包、银联等多渠道免签约接入能力,支持PC扫码、H5、公众号等多种支付场景。系统基于PHP 7.4与MySQL开发,内置轮询投诉、进件管理等运…

📰

基于调频能力裕度的风电场一次调频策略解析

风电场参与电网一次调频这件事,这几年已经从不做不行,变成了怎么做得更稳、更准的问题。早些年并网要求宽松,风电场的态度基本是“有功发满就行,频率的事交给同步机”。现在新能源占比上来以后,电网对风电场调频能力的…

📰

HDFS存储优化实战:纠删码、压缩与小文件治理策略

大数据项目的存储层里,HDFS 通常是最先被塞满、却最后一个被优化的组件。大多数团队在容量告警触发之前,并不会认真考虑副本数、文件格式、冷数据沉降这些事,等磁盘真的快满了,第一反应往往是再加节点。这篇文章是我在生产环境里做…

📰

Oracle 12c SQL查询实战:从v$session到AWR追溯历史执行记录

刚接手一个Oracle 12c库,最常被问到的问题就是:“你帮我看看现在数据库里在跑什么SQL?”或者“这个SQL昨天跑了多少次?”说实话,这类需求我处理过太多回了,但每次在技术群里看到答案还是有人只会贴一个v$se…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬