ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLO11n安全帽检测实战:从数据准备到部署的完整指南

YOLO11n安全帽检测实战:从数据准备到部署的完整指南 简介下载包提供基于 YOLO11n 训练的安全帽检测模型面向施工现场、厂区安防等场景用于自动识别人员是否佩戴安全帽。模型覆盖 .pt、.onnx、.rknn 等主流格式既适合在 PyTorch 环境中继续训练与调试也可通过 ONNX 接入通用推理框架或部署到 RK3588/RK3576 等 Rockchip NPU 设备满足实时监测需求。资源共 9 个文件压缩包约 49.47MB另有 .bin、.xml、.yaml、.tar 等配置与网络结构文件便于理解模型结构和二次开发。已有 361 人学习下载。使用者可根据目标硬件选择对应格式快速部署用于搭建安全帽佩戴检测系统或作为 YOLO11 工业落地的参考案例有助于节省模型训练与格式转换时间。 工地安全帽检测这东西看着简单真正做成一个能用的 YOLO11n 模型里面坑是真不少。我最初以为拿开源数据集一训就完事结果放到现场监控画面里漏检、误检全来了反光、远景小人、遮挡每一类都能让你怀疑人生。这篇就把我用 YOLO11n 从头训安全帽模型的完整过程写下来包括数据准备、标注格式、训练参数、踩坑记录给准备上手或者正在调模型的朋友一个可以直接照着做的参考。1. 为什么选 YOLO11n 做安全帽检测1.1 安全帽检测的实际需求与难点安全帽检测是工地、工厂、园区等场景下的标准视觉任务核心是自动判断人员是否佩戴安全帽。它的难点不在“认识安全帽”而在真实场景的复杂度镜头角度俯视、逆光、帽子和头发颜色接近、人员密集遮挡、远处目标小到只有十几个像素。所以模型不能只会在公开数据集上表现好还得能扛住现场部署环境的折腾。这类任务通常是边端部署用 Jetson、工控机甚至树莓派这种算力有限的设备所以模型体积和推理速度必须兼顾。YOLO11n 是 ultralytics 系列里最轻量的版本参数量只有大概 2.6MFP16 精度下模型文件才 5MB 出头用 GPU 推理单帧能跑到毫秒级用 CPU 也能做到实时边缘部署。对安全帽检测这种需要多路摄像头并发分析的项目选 n 版本就是奔着“稳、快、省显存”去的。1.2 YOLO11n 相比 YOLOv5/v8 的选型逻辑很多人问YOLOv5 和 YOLOv8 已经很成熟了为什么还要用 YOLO11n我个人的理解是YOLO11 把 C3/C2f 模块换成了 C3k2训练收敛更稳对小目标的特征提取也有优化。虽然精度提升幅度不像版本号看起来那么大但在安全帽这种中小型目标为主的场景里mAP 能涨 1-3 个点就很值得了。更关键的是 YOLO11n 的模型结构更轻同样的 batch size 下训练显存占用比 YOLOv8n 低。我是用单张 RTX 3090 训的24G 显存能开到 batch 64训练速度明显比 v8 流畅。对于个人开发者和小团队来说这决定了你能否快速迭代数据。YOLO11 还有原生支持旋转检测的 OBB 版本但目前安全帽检测用普通水平框就够了不需要引入额外复杂度。2. 数据集准备与标注规范2.1 数据采集别只依赖公开数据集安全帽检测的开源数据集不少比如 SHWD、Global Wheat 等但直接用它们训练出来的模型换到自己的现场很容易废掉。这些数据集的相机视角、光线、安全帽样式和你实际布控的场景差别很大。我的做法是“公开数据打底 现场数据增强”先用 SHWD 这类数据集做预训练然后用摄像头真实抓拍画面补充训练。现场采集时注意三点一是多时段采集早上逆光、中午强光、晚上补光都必须有二是多角度采集球机变倍后的近景和远处全景都要收集三是把没戴帽子、戴帽子但帽子颜色和背景接近、帽子拿在手上这些特殊样本单独整理。大概采了 8000 多张现场图片加上公开数据集最终筛出有效图片约 1.2 万张。数据安全方面也要留意工地现场画面可能涉及人员隐私和安全管理规定训练数据不要随意上传公开平台自己本地标注、本地训练最稳妥。2.2 标注方案单类还是多类安全帽检测的标注方案有两种主流选择。一种是直接用 helmet 单类把所有戴帽子的头标出来。另一种是检测 person、head、helmet 三个类别再通过后处理逻辑判断 head 和 helmet 的匹配关系。前者简单但很难处理“身边有人戴帽子但自己没戴”这种场景后者逻辑更灵活可以统计戴帽率和违规行为但标注工作量翻倍。我采用的是 head helmet 双类别方案。标注时只标头部区域和头盔区域不标整个人体。这样模型专注在最关键的部位避免 person 类别遮挡严重时监督信号被干扰。判定是否佩戴时计算 head bbox 和 helmet bbox 的 IoUIoU 大于 0.3 就认为已佩戴。这个方法在多人密集场景下比单类检测稳定得多。2.3 YOLO 标注格式转换与目录划分YOLO 系列使用 txt 格式标注一行代表一个目标内容为类别id x_center y_center width height坐标是归一化到 0-1 的数值。比如图片宽 1920目标框中心 x 坐标 960那么x_center0.5。用 LabelImg 或 X-AnyLabeling 标注时导出成 YOLO 格式即可。如果你拿到的是 COCO 格式或 VOC 格式的数据集需要写个转换脚本。import os def convert_voc_to_yolo(xml_path, out_dir, classes): # 这里只展示核心逻辑 import xml.etree.ElementTree as ET tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) with open(out_dir, w) as f: for obj in root.iter(object): cls obj.find(name).text if cls not in classes: continue box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) x_center (xmin xmax) / 2 / img_w y_center (ymin ymax) / 2 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h f.write(f{classes.index(cls)} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n)目录结构按 ultralytics 的习惯来图片和标注文件放同一级目录图片名和 txt 名一致。数据集根目录下面建images/train、images/val、labels/train、labels/val四个文件夹然后写一个 data.yamlpath: D:/projects/helmet_detection/dataset train: images/train val: images/val names: 0: head 1: helmet划分比例我用的 9:1因为安全帽场景重复背景太多验证集不需要太大但要保证每个工地、每个光线条件下的画面都有覆盖。3. 训练环境与超参数配置3.1 本地训练环境搭建YOLO11n 训练依赖 ultralytics 库、PyTorch 和 CUDA。安装很简单但有几个版本坑需要注意。Python 我用的是 3.10PyTorch 2.x 配 CUDA 11.8ultralytics 用 8.3.x 以上版本因为 YOLO11 是 8.3.0 之后才正式支持的。如果你还在用 8.0.x直接训练会出现 model 不支持的报错。conda create -n yolo11 python3.10 conda activate yolo11 pip install ultralytics8.3.7 torch2.1.2 torchvision0.16.2 --index-url https://download.pytorch.org/whl/cu118装完后先跑一次官方示例确认环境没问题不要一上来就用自己的数据。yolo predict modelyolo11n.pt sourcehttps://ultralytics.com/images/bus.jpg这行命令能出结果说明环境正常。建议用 CPU 推理测试一次再用 GPU 测试一次排查驱动层面的问题。训练时我开了 CUDA、CUDNN确保用的是 GPU 而不是 CPU否则训练速度慢到怀疑人生。3.2 核心超参数的选择思路安全帽检测训练中最影响结果的是imgsz、batch、epochs、optimizer和lr0。我实验下来比较稳的配置如下参数推荐值说明imgsz640安全帽目标不算极小640 平衡精度和速度batch6424G显存显存不够用 16-32别硬上epochs150数据量 1 万张左右150 轮基本收敛optimizerAdamW比 SGD 收敛快适合快速迭代lr00.0005~0.001预训练模型微调用 0.001 以内合理warmup_epochs3.0稳定初期训练weight_decay0.0005防止过拟合imgsz 不建议一开始就设成 1280训练显存会翻 4 倍而且安全帽检测用 640 已经足够。真要到小目标场景先把 mosaic 增强开大再考虑提升分辨率成本更低。有个容易被忽略的参数是close_mosaic。ultralytics 会在最后 10 轮自动关闭 mosaic 增强防止模型过度依赖拼接图的上下文。训练轮数少于 50 时建议手动把close_mosaic调到 5避免增强策略影响真实场景表现。3.3 训练命令与参数文件我不用命令行堆参数而是写一个 training.yaml 继承模型的默认配置。这样可以随时回滚参数也方便多人协作。# train_config.yaml task: detect mode: train model: yolo11n.pt data: D:/projects/helmet_detection/dataset/data.yaml epochs: 150 time: null patience: 50 batch: 64 imgsz: 640 save: true device: 0 workers: 8 optimizer: AdamW lr0: 0.0007 lrf: 0.01 warmup_epochs: 3.0 close_mosaic: 10执行训练yolo train cfgtrain_config.yaml训练开始后终端会先打印模型参数量、FLOPs 和每层结构。这时候注意看Parameters大约是 2.6M如果是几千万参数说明你加载成了 s/m/l 版本检查一下模型权重路径。4. 训练过程监控与常见问题排查4.1 怎么判断模型有没有在好好学训练过程中每隔一段时间输出一组指标重点看train/box_loss、train/cls_loss、val/box_loss和metrics/mAP50(B)。安全帽检测任务里mAP50 比 mAP50-95 更直观因为安全帽是单类目标框交并比稍差一点也被算对mAP50 一般要做到 0.95 以上才算合格。Loss 曲线整体趋势是下降。如果 train loss 一直在降而 val loss 不降甚至上升就是过拟合说明模型在背训练集泛化能力差。我在第二轮迭代时把 epochs 从 200 降到 150再加了 weight_decayval loss 马上就平稳了。4.2 显存不足OOM与训练中断显存不足是最常见的报错尤其是 batch 开得太大、图片分辨率高、workers 设置过多时。遇到CUDA out of memory先别急着换显卡按顺序排查batch 降到 32 或 16imgsz从 640 降到 512看效果跌幅大不大workers 改成 4有时候数据加载线程太多会占额外显存用device0指定单卡避免多卡同步浪费显存。如果是 Windows 下报Dataloader worker (pid(s)) exited unexpectedly多数是路径问题或者 labels 文件和图片不对应。检查 data.yaml 路径是否绝对路径以及 labels 目录里 txt 命名是否和图片完全一致包括后缀比如图片是.jpg标签就是.txt不能用.jpeg混着来。4.3 精度上不去的常见原因训练完了 mAP50 只有 0.7不要急着调模型先检查几个地方标注有没有错位尤其是遮挡场景下 head 和 helmet 框是否贴合我抽查过一个样本标注框比实际头大 30%导致模型学偏类别是否均衡。我的数据集里 head 和 helmet 目标数量差不多是 1:0.9还算健康如果有一类只有几百个就要用instance balance或者多复制一些这类样本背景物体是不是干扰太大。比如安全帽颜色和墙面接近模型就会漏检。这时不要盲目加数据而是针对性收集“帽子与背景同色”的负样本增强模型对边缘特征的敏感度。如果是小目标漏检可以尝试在训练时开启multi-scale让模型适应不同分辨率下的大小变化。我就在训练参数里加了scale0.5和fliplr0.5对远距离小目标改善明显。5. 模型评估、导出与部署经验5.1 用测试集做最终评估训练结束后用predict跑一批训练时没见过的现场测试图按工地、室内、夜间三种场景分别统计准确率和召回率。不要只看总 mAP因为不同摄像头覆盖区域差别很大统一 mAP 会掩盖特定场景下崩掉的问题。我把测试图分成三个子集500 米外远景、近景、夜间补光。结果发现模型在近景下 mAP50 达到 0.97而远景只有 0.82。原因是远距离的头部目标太小部分只有 10x10 像素。后来我给远焦镜头单独补了 2000 张训练图mAP 从 0.82 提升到 0.89。这种分场景评估方式比看一个总分数实用得多。5.2 导出 ONNX 与 TensorRT 加速训练好的best.pt不能直接部署到生产环境通常要导出成 ONNX 或 TensorRT engine。导出命令yolo export modelbest.pt formatonnx opset12 simplifyTrue导出后用 onnxruntime 验证一次import onnxruntime as ort import numpy as np from PIL import Image session ort.InferenceSession(best.onnx) input_name session.get_inputs()[0].name img Image.open(test.jpg).resize((640, 640)) img_array np.array(img).astype(np.float32) / 255.0 img_array np.transpose(img_array, (2, 0, 1))[None, ...] outputs session.run(None, {input_name: img_array}) print(outputs[0].shape)ONNX 对多路视频流部署来说速度足够。如果想进一步榨干 GPU 性能再用 TensorRT 导出 FP16 精度模型。一次实测中ONNX 在 RTX 3090 上单帧推理约 3msTensorRT FP16 约 1.8ms差距明显。如果你的摄像头推流是 25 帧每秒ONNX 也能轻松扛住TensorRT 更适合要接十几路视频的服务器。5.3 部署时最容易被忽略的细节部署阶段要小心预处理环节。训练时 ultralytics 默认用letterbox把图片缩放成 640x640 并填充灰色边推理时如果直接用 cv2 的 resize 把图片硬拉到 640x640人物会被拉伸变形检测框位置也会偏移。我建议部署代码里复现相同的 letterbox 操作否则模型精度会打折扣。另一个细节是置信度阈值。训练时默认 conf0.25但现场场景误报多时可以把 conf 调到 0.35 甚至 0.4用少量的召回率换更少的误报。安全帽检测这种安全场景宁可偶尔漏报也不能频繁误报否则现场人员会对报警产生麻木。最后提醒一句模型要持续迭代。我上线后每周收集一次误报和漏报数据用难例重新标注并做增量训练。第一次增量训练只加了 500 张图就把夜间反光导致的误报降了一半。模型不是训练完就结束而是跟着现场数据一起成长。这里分享一个我踩过最深的坑训练中期我发现 loss 降得很慢排查了很久才发现是数据集里有几百张带水印的网图水印区域被标注成了头盔导致分类混乱。后来加了数据清洗脚本把所有非现场拍摄的图片全部剔除训练立刻顺畅了。别小看数据集质量YOLO11n 模型能力再强喂进去垃圾标注出来的照样是垃圾预测。本文还有配套的精品资源点击获取
返回列表