ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

YOLOv5反光衣安全帽检测实战:数据集、训练权重与边缘部署全流程

YOLOv5反光衣安全帽检测实战:数据集、训练权重与边缘部署全流程 简介这份资源是面向计算机相关专业学生与项目实战学习者的YOLOv5目标检测完整方案聚焦反光衣与安全帽两类工地安全穿戴目标的识别可直接用于毕业设计、课程设计或期末大作业。压缩包共1131个文件约47.93MB以475个py源码、233个pyc编译文件、96个txt说明、35个yaml配置、27个ipynb笔记及60个png、22个jpg图像为主另含npy权重数据、md文档与少量音视频素材覆盖训练、推理与部署各环节。资源内含训练好的权重与配套数据集省去自行采集标注与长时间训练的成本便于快速复现检测效果并在此基础上调整模型结构、优化参数或迁移到其他穿戴检测场景。目前已有344人学习下载适合希望以完整项目串联深度学习知识、积累工程经验的中高级学习者参考。1. 反光衣安全帽检测为什么总在工地实拍里翻车工地出入口的监控画面里安全帽和反光衣这两类目标有个共同特点它们都靠颜色形状被人眼瞬间识别但换成模型就未必。我最早拿通用 COCO 预训练权重直接推理白天顺光画面里安全帽召回还行一到逆光、扬尘、夜间补光偏黄的场景黄色安全帽和反光衣的荧光条就开始互相打架漏检率肉眼可见地往上走。这也是为什么YOLOv5反光衣安全帽检测这类项目一直有人做——它不是拿现成权重跑一遍就完事而是需要一套针对工地场景重新训练、并且把权重和数据集一起交付的方案。这个标题里其实压了三样东西YOLOv5 这套检测框架、训练好的权重文件、以及配套数据集。对一线做安防、智慧工地、边缘盒子落地的工程师来说它的价值在于省掉从零标注和调参的时间直接拿到一个能复现、能微调、能部署的起点。适合谁适合手上有工地/厂区视频流、需要快速验证检测可行性的人也适合想拿一个真实工业场景练 YOLOv5 全流程的学生和转行者。下面我按数据长什么样 → 怎么训 → 怎么验 → 坑在哪的顺序把这条链路讲透。2. 拆开这个 zip数据集结构、类别定义与权重到底给了什么拿到一个权重数据集打包的项目第一件事不是急着跑推理而是先搞清楚里面到底有什么。很多人解压完直接detect.py结果类别对不上、标签格式不对白折腾半天。这一章先把数据集的目录约定、标注格式和权重文件的含义讲清楚后面训练和部署才有地基。2.1 反光衣安全帽数据集的目录约定与类别划分工地安全检测这类数据集常见做法是两类或三类标注。两类就是helmet戴安全帽和vest穿反光衣三类会拆出person或no_helmet未戴帽。我一般先看data.yaml或classes.txt确认类别顺序因为 YOLO 的标签是纯数字索引索引和类别名错位一位整个训练就废了。一个规范的 YOLOv5 数据集目录通常长这样dataset/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片可选 ├── labels/ │ ├── train/ # 与 train 图片同名的 .txt 标签 │ ├── val/ │ └── test/ └── data.yaml # 数据集配置文件data.yaml的内容大致是# 数据集根路径建议写绝对路径避免相对路径踩坑 path: /home/user/dataset train: images/train val: images/val test: images/test # 类别数量与名称顺序必须和标签索引一致 nc: 2 names: [helmet, vest]这里有个血泪经验names的顺序不是随便写的。如果标注时helmet是 0、vest是 1那names就必须按这个顺序。我见过有人把顺序调换后训练loss 一路下降看着很美好实际推理时安全帽框全标成了反光衣属于典型的训练正常、结果全错。2.2 标签格式YOLO txt 的五个数字怎么读YOLO 系列的标签是每张图一个同名.txt每行代表一个目标格式是class_id x_center y_center width height后四个值都是归一化到 0~1 的相对坐标不是像素值。举个例子一张 1920×1080 的图里有个安全帽像素框是(800, 300)到(900, 400)那么中心点像素(850, 350)归一化中心850/1920 ≈ 0.4427350/1080 ≈ 0.3241宽高归一化100/1920 ≈ 0.0521100/1080 ≈ 0.0926对应标签行就是0 0.4427 0.3241 0.0521 0.0926如果你手上的数据集是 VOC 的 XML 或 COCO 的 JSON需要先转换。转换脚本的核心逻辑是读框、算归一化、写 txt网上现成的很多但要注意两个边界一是坐标别超出图像范围标注工具手抖会标出界二是空标签图要保留一个空 txt否则 YOLOv5 会报找不到标签。2.3 训练好的权重文件best.pt 和 last.pt 该用哪个打包项目里通常会给best.pt和last.pt两个权重。last.pt是最后一轮训练结束的权重best.pt是验证集指标最好那一轮的权重。落地推理一律用best.pt因为最后一轮很可能已经过拟合mAP 反而掉了。权重文件本身还带着训练时的元信息包括类别名、输入尺寸、锚框。可以用下面这段代码快速验证权重是否和你的类别对得上import torch # 加载权重map_location 保证在无 GPU 的机器上也能读 ckpt torch.load(best.pt, map_locationcpu) model ckpt[model] # 打印类别名和类别数确认与 data.yaml 一致 print(类别:, model.names) print(类别数:, model.nc) print(输入尺寸:, model.stride)逻辑说明torch.load读出的ckpt是个字典model键里存着模型结构names是类别名列表。参数上map_locationcpu很关键否则在有 GPU 训练的权重拿到纯 CPU 机器上会直接报错。如果打印出来的names和你数据集不一致说明权重不是这套数据训的得重新训练或做类别映射。提示拿到权重先跑一张图验证别急着批量推理。一张图能暴露类别错位、输入尺寸不符、颜色通道搞反这三类最常见问题。3. 用这套数据集把 YOLOv5 跑起来环境、训练与推理的最小闭环搞清楚数据长什么样之后就可以动手了。这一章给出一条从环境配置到训练再到推理的完整命令链每一步都说明参数含义和失败时该看什么。目标不是跑通一个 demo而是让你能在这套反光衣安全帽数据上复现出一个可用的权重。3.1 环境配置conda 建环境与依赖安装的版本坑YOLOv5 对 PyTorch 和 CUDA 版本比较敏感我一般用 conda 隔离环境避免污染系统 Python。常见做法是# 创建 Python 3.9 环境YOLOv5 对 3.8~3.10 兼容较好 conda create -n yolov5_helmet python3.9 -y conda activate yolov5_helmet # 安装 PyTorchCUDA 11.8 版本按自己显卡驱动选 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 克隆 YOLOv5 仓库并安装依赖 git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt参数说明python3.9是经验值3.11 以上有些依赖轮子还没跟上PyTorch 的 CUDA 版本要和nvidia-smi显示的驱动兼容驱动太老就装低版本 CUDA 的 torch。装完用python -c import torch; print(torch.cuda.is_available())验证返回True才算 GPU 可用。失败时看什么如果torch.cuda.is_available()返回False八成是 torch 版本和驱动不匹配或者装成了 CPU 版。这时候别硬训CPU 训 YOLOv5 一张图要好几秒几百张图能等到天亮。3.2 训练命令与关键超参数batch、imgsz、epochs 怎么定环境好了就可以开训。YOLOv5 的训练入口是train.py一条典型命令python train.py \ --data /home/user/dataset/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --workers 8 \ --project runs/train \ --name helmet_vest逐个说参数--weights yolov5s.pt从官方预训练权重开始比从零训收敛快得多。工地数据量通常几千张迁移学习是标配。--img 640输入分辨率。安全帽和反光衣在画面里占比不大时可以提到 960 或 1280但显存和速度会明显上升。--batch 16批大小。显存不够就降到 8 或 4YOLOv5 会自动做梯度累积补偿。--epochs 100轮数。小数据集 100~300 轮常见看验证集 mAP 是否还在涨。--workers 8数据加载线程数Windows 上建议设 0 或 2否则容易卡死。训练过程中重点盯三个指标box_loss、obj_loss和验证集的mAP0.5。loss 下降但 mAP 不涨通常是过拟合或学习率太大loss 震荡剧烈多半是 batch 太小或数据里有脏标注。3.3 推理与批量验证detect.py 的常用参数训练完拿到best.pt先用单张图验证python detect.py \ --weights runs/train/helmet_vest/weights/best.pt \ --source /home/user/test_images \ --img 640 \ --conf-thres 0.4 \ --iou-thres 0.45 \ --save-txt \ --project runs/detect参数说明--conf-thres 0.4是置信度阈值工地场景漏检代价高可以适当降到 0.3 提高召回--iou-thres 0.45是 NMS 的 IoU 阈值人多拥挤时调低能减少重叠框--save-txt会把检测结果存成 YOLO 格式 txt方便后续做统计或二次处理。如果要做批量评估用val.pypython val.py \ --data /home/user/dataset/data.yaml \ --weights runs/train/helmet_vest/weights/best.pt \ --img 640 \ --task val它会输出每一类的 precision、recall、mAP0.5 和 mAP0.5:0.95。反光衣和安全帽这两类我一般要求 mAP0.5 至少到 0.85 才考虑上线低于这个数先回去看数据。4. 反光衣安全帽检测的避坑与排查五条真实踩坑记录训练能跑通不代表结果能用。这一章把我在工地场景里踩过的坑按现象 → 原因 → 解决列出来都是能直接对号入座的。4.1 现象白天检测正常夜间几乎全漏原因数据集里夜间样本太少模型没学到夜间补光下的颜色分布。工地夜间多是暖黄光反光衣的荧光色在暖光下偏暗和背景对比度骤降。解决往训练集里补夜间样本至少占总量 20%~30%训练时开 HSV 增强YOLOv5 默认开把hsv_v调大一点模拟亮度变化如果夜间是红外画面那基本是另一个域得单独训一个红外模型别指望可见光模型硬扛。4.2 现象安全帽和反光衣互相误检原因两类目标颜色接近黄色安全帽 vs 荧光黄反光衣且经常同时出现在一个人身上标注框重叠严重。解决检查标注是否把两类框画得太近甚至重叠训练时适当降低--iou-thres让 NMS 更激进如果误检集中在某类可以在data.yaml里给类别加权或干脆合并成一类合规穿戴再细分。4.3 现象训练 loss 正常但推理框位置全偏原因标签坐标没归一化或者用了像素值当归一化值。这种情况 loss 会异常低因为模型在拟合错误的简单目标。解决写个脚本抽查标签确认所有坐标都在 0~1 之间。有超出范围的直接修正或剔除。归一化公式再核对一遍中心点除以宽高不是除以 2。4.4 现象显存爆了报 CUDA out of memory原因--img或--batch设太大或者--workers太多导致数据加载占用显存。解决先把--batch减半试再考虑降--img。YOLOv5 支持--batch-size -1自动批大小但实测不如手动调稳。另外--workers在 Windows 上设 0 能避免多进程显存泄漏。4.5 现象mAP 卡在 0.6 上不去原因数据质量差——漏标、错标、框太松。工地数据尤其容易漏标远处的小目标。解决抽 50 张验证集图片把预测框和标注框叠一起看肉眼找漏标。这一步没有捷径但往往比调参管用。另外确认验证集和训练集没有重复图片否则 mAP 虚高。注意别一上来就调超参数。反光衣安全帽这类场景数据质量对结果的影响远大于学习率、优化器这些。先把数据洗干净再谈调参。5. 从能跑到能用模型导出、边缘部署与一个提点小技巧训练出 mAP 达标的权重只是中间站真正落地还要过导出和部署这两关。这一章讲怎么把 PyTorch 权重转成部署友好的格式以及在边缘设备上跑的几个实操要点最后给一个我常用的提点技巧。5.1 导出 ONNX 与 TensorRT格式选择与验证PyTorch 的.pt权重在服务器上跑没问题但边缘盒子上通常要转 ONNX 或 TensorRT。导出 ONNXpython export.py \ --weights runs/train/helmet_vest/weights/best.pt \ --include onnx \ --img 640 \ --batch 1 \ --opset 12参数说明--opset 12是 ONNX 算子集版本太低有些算子不支持太高部分推理引擎不认12 是比较稳的选择--batch 1是边缘部署常用批大小。导出后务必用onnxruntime跑一张图和 PyTorch 结果对比确认数值误差在可接受范围。如果要上 NVIDIA 边缘设备再转 TensorRTpython export.py \ --weights best.pt \ --include engine \ --img 640 \ --device 0 \ --half--half是 FP16 半精度速度能提升接近一倍精度损失通常很小但反光衣这种靠颜色的目标要验证一下 FP16 下有没有掉点。5.2 边缘设备部署输入尺寸、预处理与帧率权衡在树莓派、Jetson 这类设备上部署自己训练的 YOLOv5 模型核心矛盾是帧率和精度。几个实操经验设备档位建议输入尺寸建议模型预期帧率树莓派 4/5320~416yolov5n3~8 FPSJetson Nano416~640yolov5s10~20 FPSJetson Xavier/Orin640yolov5s/m30 FPS预处理要和训练时严格一致letterbox 填充、BGR 转 RGB、归一化到 0~1。我见过部署后精度暴跌的案例八成是预处理没对齐尤其是 letterbox 的灰边填充值搞错。5.3 一个提点小技巧用切片推理救远处小目标工地画面里远处的小安全帽经常漏检因为缩到 640 后目标只剩几个像素。我常用的办法是切片推理SAHI 思路把原图切成带重叠的小块分别推理再合并结果。核心逻辑# 伪代码示意切块推理再合并 def sliced_inference(img, model, slice_size640, overlap0.2): step int(slice_size * (1 - overlap)) boxes [] for y in range(0, img.shape[0], step): for x in range(0, img.shape[1], step): patch img[y:yslice_size, x:xslice_size] # 对每个小块推理再把坐标映射回原图 preds model(patch) boxes.extend(remap(preds, x, y)) # 最后对所有框做一次全局 NMS return nms(boxes)参数说明slice_size一般设成模型输入尺寸overlap取 0.2 左右保证边缘目标不被切断。代价是推理耗时成倍增加所以只在对召回要求极高的场景用比如安全巡检抓拍而不是实时视频流。这套流程我从最早被夜间漏检折磨到后来固定成先洗数据、再训、再切片补召回的习惯中间返工过好几轮。反光衣安全帽检测不难难的是把工地那些脏数据、怪光照一个个啃下来。希望帮到你。本文还有配套的精品资源点击获取
返回列表