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 曲线再决定阈值和是否量化不靠感觉拍脑袋。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

TensorFlow+OpenCV实战:人脸识别与表情识别CNN全流程

TensorFlow+OpenCV实战:人脸识别与表情识别CNN全流程

简介:本资源面向计算机视觉入门与进阶开发者,提供一套基于TensorFlow与OpenCV的人脸识别与表情识别完整项目方案,可用于安全监控、人机交互等场景的学习与二次开发。项目围绕人脸检测、特征提取与七类基本表情分类展开,涉及MTCNN、…

2026/10/11 20:27:15 阅读更多 →
MySQL实用基础:建表、索引、SQL、事务、备份与排查

MySQL实用基础:建表、索引、SQL、事务、备份与排查

做了这么多年数据相关工作,接触过的数据库不少,但兜兜转转,MySQL始终是绕不开的那个。后台服务、管理系统、中台业务、数据分析平台的底层存储,大半都能看到它的身影。网上讲MySQL的教程铺天盖地,但多数要么停留在安装…

2026/10/11 20:27:15 阅读更多 →
基于YOLOv8的基建裂缝检测系统:从环境搭建到模型调优的完整实战指南

基于YOLOv8的基建裂缝检测系统:从环境搭建到模型调优的完整实战指南

简介:这份资源是面向计算机、电子信息等专业学生与项目实战学习者的YOLOv8基建裂缝目标检测完整项目包,可直接用于毕业设计、课程设计或期末大作业。项目经导师指导并通过评审,获得98分,具备较高的参考与借鉴价值。压缩包共848个文…

2026/10/11 20:27:15 阅读更多 →

最新新闻

新浪Level2接口SDK接入实战:授权、协议解析与避坑指南

新浪Level2接口SDK接入实战:授权、协议解析与避坑指南

简介:新浪Level2接口SDK是一份面向量化开发与行情分析人员的Java工程,用于对接新浪Level2全推行情,获取股票、基金等品种的深度交易数据。相比普通免费接口,Level2数据在速度与深度上更适合机构级策略,适合有一定Java基…

2026/10/11 22:50:35 阅读更多 →
一个 Key 调用所有模型:2026 四大聚合平台价格、生态与稳定性横评

一个 Key 调用所有模型:2026 四大聚合平台价格、生态与稳定性横评

大模型 API 聚合平台的核心价值一句话就能说清:一个 Key 接入多家大模型,统一计费与访问管理,把供应商切换成本降到最低。市面上的主流玩家分三类——国际商业聚合、国内商业聚合、自托管开源方案,路线不同,取舍也不同…

2026/10/11 22:50:35 阅读更多 →
HOP上游升级SOP:pnpm upstream:update一键同步rhwp并全链路验证的完整流程

HOP上游升级SOP:pnpm upstream:update一键同步rhwp并全链路验证的完整流程

【免费下载链接】hop 项目地址: https://gitcode.com/gh_mirrors/hop22/hop 点击查看 免费下载 HOP 是一款开源的 HWP/HWPX 文档编辑器,桌面外壳由 HOP 团队维护,而文档解析与渲染引擎来自上游项目 rhwp。如何安全地跟随上游版本前进&#x…

2026/10/11 22:50:35 阅读更多 →
Android游戏逆向重构实战:从植物大战僵尸源码2到可运行工程

Android游戏逆向重构实战:从植物大战僵尸源码2到可运行工程

简介:本资源为《植物大战僵尸》Android平台开源实现的完整工程源码,面向Android游戏开发初学者与进阶者,聚焦塔防类游戏架构设计、图形渲染与状态管理等核心实践。压缩包共173个文件,含20个Java源文件(涵盖GameScene、…

2026/10/11 22:50:35 阅读更多 →
基于线性回归的PM2.5预测系统Python源码实战解析

基于线性回归的PM2.5预测系统Python源码实战解析

简介:基于线性回归的PM2.5预测系统源码,是一套面向Python学习者、机器学习入门者及大气环境数据分析场景的小型完整项目。代码以单文件Python脚本承载数据读取、特征构造、模型训练与结果预测等关键流程,配套原始训练/测试CSV表、处理后的特征…

2026/10/11 22:50:35 阅读更多 →
PgQue 监控实战:5 个必须告警的队列健康指标 + 如何揪出卡住的消费者

PgQue 监控实战:5 个必须告警的队列健康指标 + 如何揪出卡住的消费者

【免费下载链接】PgQue PgQue – Zero-bloat Postgres queue built on top of on battle-proven Skypes PgQ. One SQL file to install, pg_cron to tick https://pgque.dev 项目地址: https://gitcode.com/gh_mirrors/pg/PgQue 点击查看 免费下载 PgQue 是一个零膨…

2026/10/11 22:49:35 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →