ARTICLE DETAIL

资讯详情

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

基于YOLOv5的电动自行车头盔佩戴检测系统:源码、数据集与模型权重全解析

基于YOLOv5的电动自行车头盔佩戴检测系统:源码、数据集与模型权重全解析 简介本资源面向计算机视觉方向的毕业设计与课程实践者提供一套基于YOLOv5的电动自行车头盔佩戴检测系统完整实现方案可用于自动识别图像或视频流中骑行者是否佩戴安全头盔。压缩包共94个文件约23.74MB包含13个Python源码文件、24个YAML配置、26张JPG示例图片、6个Shell脚本及说明文档、Dockerfile、ipynb教程等覆盖模型训练、验证、推理与部署全流程。资源内含标注数据集、已训练好的模型权重以及环境配置说明读者可据此复现训练过程、调整超参数并直接部署检测程序同时借助示例图片与视频快速验证效果。目前已有101人学习下载适合需要完整项目参考、希望掌握目标检测落地流程的学生与开发者。1. 从一次路口误判说起这套 YOLOv5 头盔检测资源到底能干什么上个月帮朋友看一个社区路口的电动车抓拍项目甲方给的需求很直接从监控画面里把骑电动车没戴头盔的人框出来最好能联动喇叭提醒。朋友一开始想用现成的通用检测模型结果翻车了——模型把戴帽子的人、撑伞的人、甚至后视镜都识别成了未佩戴头盔误报率高得没法交付。问题不在模型本身而在于通用 COCO 预训练权重里根本没有头盔这个类别你让它去判断戴没戴它只能靠猜。这套基于 YOLOv5 的电动自行车头盔佩戴检测系统解决的正是这个具体场景。它包含完整源码、标注好的数据集和训练好的模型权重类别定义直接落在佩戴头盔 / 未佩戴头盔这两个业务目标上而不是让你从零标注几千张图再调参。适合三类人做课程设计需要完整可跑项目的学生、接智能交通小项目需要快速出原型的开发者、以及想拿一个真实数据集练 YOLOv5 微调流程的算法入门者。下面我按资源是什么 → 怎么跑起来 → 怎么换成你自己的数据 → 坑在哪的顺序拆一遍能抄的地方直接给命令和参数。2. 环境配置与数据准备把 YOLOv5 跑起来的第一公里2.1 为什么选 YOLOv5 而不是 v8 或 RT-DETR先说选型理由这决定了你后面踩坑的方向。YOLOv5 虽然版本号看着老但它的工程成熟度在头盔检测这类中小目标场景里依然能打一是仓库结构清晰models/、utils/、data/分工明确改数据集配置只需要动一个 yaml二是对显存友好6G 显存的笔记本就能跑 batch size 8 的训练三是社区里针对安全帽头盔的迁移案例最多遇到问题搜得到答案。YOLOv8 精度略高但依赖 ultralytics 新框架RT-DETR 对小目标友好却吃显存课程设计这种要能跑通、能讲清的场景v5 是性价比最高的选择。这套资源的技术栈是 PyTorch YOLOv5 OpenCV数据集是 VOC 转 YOLO 格式的标注模型权重是.pt文件。拿到手之后第一件事不是急着训练而是把推理环境先跑通确认权重能用。2.2 环境搭建conda 隔离 依赖锁定我一般不会在系统 Python 里直接装血泪经验是版本冲突能让你查一整天。用 conda 建一个独立环境# 创建 Python 3.8 环境YOLOv5 对 3.8/3.9 兼容最好 conda create -n helmet_yolo python3.8 -y conda activate helmet_yolo # 安装 PyTorch按你的 CUDA 版本选这里以 CUDA 11.3 为例 pip install torch1.12.1cu113 torchvision0.13.1cu113 \ --extra-index-url https://download.pytorch.org/whl/cu113 # 安装 YOLOv5 依赖 pip install -r requirements.txt这里有个参数要盯住torch和torchvision版本必须配套1.12.1 对应 0.13.1错一个版本就会在torch.load时报_pickle.UnpicklingError。如果你没有独显把cu113换成 CPU 版本也能跑推理只是训练会慢到怀疑人生。装完之后用一行命令验证python -c import torch; print(torch.__version__, torch.cuda.is_available())输出1.12.1cu113 True才算环境通了。cuda.is_available()返回 False 的话先别往下走去查显卡驱动和 CUDA 版本匹配这是最常见的翻车点。2.3 数据集结构VOC 转 YOLO 的目录约定YOLOv5 不认 VOC 的 XML 标注必须转成每张图对应一个.txt的格式每行是类别 x_center y_center width height坐标全部归一化到 0~1。这套资源里的数据集已经转好了目录结构长这样datasets/ ├── images/ │ ├── train/ # 训练集图片 │ └── val/ # 验证集图片 └── labels/ ├── train/ # 对应的 txt 标注 └── val/图片和标注文件名必须一一对应images/train/001.jpg对应labels/train/001.txt少一个文件训练时就会报No labels found。如果你要换成自己的数据转换脚本的核心逻辑是这样import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, img_w, img_h, classes): tree ET.parse(xml_path) root tree.getroot() 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) # VOC 坐标是左上右下转成中心点宽高 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_c ((x1 x2) / 2) / img_w y_c ((y1 y2) / 2) / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h lines.append(f{cls_id} {x_c:.6f} {y_c:.6f} {w:.6f} {h:.6f}) return lines关键参数是img_w和img_h必须用cv2.imread读出来的真实尺寸不能想当然用 640×640否则归一化坐标全错训练 loss 会一直不降。classes列表的顺序决定了类别 id这套资源里是[helmet, no_helmet]你换数据时如果类别顺序变了推理结果的标签映射也要跟着改。3. 训练与推理从权重加载到画面框选3.1 配置文件怎么改data yaml 与模型 yamlYOLOv5 训练靠两个 yaml 驱动。一个是数据配置data/helmet.yaml# 训练集和验证集路径相对路径以 yolov5 根目录为基准 train: datasets/images/train val: datasets/images/val # 类别数头盔检测是 2 类 nc: 2 # 类别名称顺序必须和标注里的 id 一致 names: [helmet, no_helmet]另一个是模型结构配置这套资源用的是yolov5s.yamls 版本参数量小、推理快适合边缘部署。如果你追求精度可以换yolov5m.yaml但显存占用会翻倍。改完 yaml 后训练命令是python train.py \ --data data/helmet.yaml \ --cfg models/yolov5s.yaml \ --weights yolov5s.pt \ --epochs 100 \ --batch-size 16 \ --img 640 \ --device 0逐个说参数--weights yolov5s.pt是加载 COCO 预训练权重做迁移学习这一步千万别省从零训练 100 epoch 也到不了迁移学习的精度--img 640是输入分辨率头盔在画面里属于中小目标640 是精度和速度的平衡点调到 416 会快但小头盔容易漏--batch-size 16按显存调6G 显存跑 16 可能 OOM降到 8--device 0指定第一块 GPUCPU 训练去掉这个参数。3.2 训练过程看什么loss 曲线与 mAP训练启动后终端会打印每个 epoch 的box_loss、obj_loss、cls_loss和mAP0.5。判断训练是否正常看三个信号box_loss 应该在前 10 个 epoch 快速下降然后趋缓如果一直震荡不降多半是学习率太大或标注有问题mAP0.5 在 50 epoch 左右应该能到 0.85 以上头盔这种特征明显的目标达不到就是数据量不够如果 val 的 loss 开始上升而 train 的还在降说明过拟合了加数据增强或提前停。训练完权重存在runs/train/exp/weights/best.pt这个文件就是最终模型。资源里已经给了一份训练好的best.pt你可以直接拿来做推理验证不用等训练。3.3 推理与可视化detect.py 的参数推理命令比训练简单核心是把权重、输入源、置信度阈值配好python detect.py \ --weights runs/train/exp/weights/best.pt \ --source test_images/ \ --img 640 \ --conf-thres 0.5 \ --iou-thres 0.45 \ --save-txt--source可以是单张图、文件夹、视频文件甚至0表示调用摄像头。--conf-thres 0.5是置信度阈值低于这个值的框不显示头盔检测里这个值别调太低0.3 以下会把背景误检成头盔--iou-thres 0.45是 NMS 的 IoU 阈值两个人挨得近时调高能保留更多框--save-txt会把检测结果存成 txt方便你后续做统计。输出结果默认在runs/detect/exp/画面上戴头盔的框和未戴的框会用不同颜色区分。如果你想在 Python 里调用模型做二次开发比如联动报警逻辑用torch.hub加载import torch # 加载本地权重注意 path 参数指向你的 best.pt model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, force_reloadTrue) model.conf 0.5 # 置信度阈值 model.iou 0.45 # NMS 阈值 results model(test.jpg) # 打印每个框的类别和坐标 for *box, conf, cls in results.xyxy[0]: label model.names[int(cls)] print(f{label} {conf:.2f} {box})force_reloadTrue在第一次加载后可以设成 False 加速但改了权重文件必须重新加载否则用的还是旧模型这个坑我踩过。4. 避坑与排查头盔检测里最容易翻车的五件事4.1 现象训练 loss 正常但 mAP 一直是 0原因通常是标注格式错了。YOLO 要求坐标归一化到 0~1如果你转换时忘了除以图片宽高坐标值会是几百模型学不到东西。解决方法是随便打开一个 label txt看数值是不是都在 0~1 之间有大于 1 的就是没归一化。另外检查类别 id 是不是从 0 开始VOC 里类别名对不上也会导致全部被过滤。4.2 现象推理时框的位置整体偏移这是图片预处理和坐标还原不一致导致的。YOLOv5 推理时会做 letterbox 填充把图片缩放到 640×640 并补边如果后处理时没把填充的偏移量减掉框就会偏。用官方detect.py不会出这个问题自己写推理脚本时要注意scale_coords这个函数它负责把 640 空间的坐标映射回原图。4.3 现象戴头盔和没戴头盔识别反了类别顺序搞反了。names: [helmet, no_helmet]里 helmet 是 id 0no_helmet 是 id 1如果你训练时用的是这个顺序推理时又按[no_helmet, helmet]去映射结果就全反了。解决方法是训练和推理共用同一个 yaml别手写类别列表。4.4 现象小目标头盔漏检严重640 分辨率下远处骑车人的头盔可能只有十几个像素特征太弱。三个解决方向把--img提到 1280但推理速度会降一半在数据增强里开启mosaic和scale让模型见过更多尺度或者换yolov5m这种更大的模型。如果部署在树莓派这类边缘设备上分辨率提不上去就得在数据采集端把摄像头拉近。4.5 现象CUDA out of memory显存不够先降--batch-size从 16 降到 8 再降到 4。如果还不行把--img从 640 降到 416或者用--freeze冻结主干只训练检测头。另外训练前确认没有其他进程占着显存nvidia-smi看一眼有时候上一个训练没退干净显存一直挂着。5. 换自己的数据与进阶技巧让模型适配你的路口5.1 用自己标注的数据微调资源里的数据集是通用场景你的路口可能有特殊角度、特殊头盔样式这时候需要微调。流程是用 labelImg 标注 200~500 张你的场景图导出 VOC 格式用 2.3 的脚本转成 YOLO 格式然后改helmet.yaml的路径指向你的数据加载资源里的best.pt作为预训练权重继续训练python train.py \ --data data/my_helmet.yaml \ --weights best.pt \ --epochs 50 \ --batch-size 8 \ --img 640 \ --freeze 10--freeze 10是冻结前 10 层只微调后面的检测头这样小数据集不会过拟合训练也快。50 epoch 足够因为你不是从零学只是让模型适应新场景。5.2 验证模型有没有真的学会别只看 mAP 数字要拿实际场景的图去测。我一般会准备三类测试图正常白天、逆光傍晚、雨天模糊分别跑一遍看漏检和误检。如果逆光下漏检多说明训练数据里缺这类样本补进去再训。还有一个技巧是看混淆矩阵YOLOv5 训练完会在runs/train/exp/下生成confusion_matrix.png如果 helmet 和 no_helmet 之间有大量互相误判说明两个类别的特征区分度不够可能是标注时把戴帽子也标成了 helmet。5.3 部署到边缘设备的取舍如果最终要部署到树莓派或 Jetson 这类设备模型要转成 ONNX 或 TensorRT。YOLOv5 自带导出脚本python export.py --weights best.pt --include onnx --img 640导出 ONNX 后推理速度能提升 20%~30%但要注意 opset 版本树莓派上用 onnxruntime 建议 opset 12。Jetson 上转 TensorRT 更快但转换过程对版本敏感CUDA、cuDNN、TensorRT 三者版本必须匹配这是另一个大坑建议单独查官方文档。从那以后我每次拿到一个新的检测项目都强制先跑通推理再动训练确认权重和数据管道没问题了再改配置。这套头盔检测资源的价值就在于它把数据、权重、代码都备齐了你省下的不是写代码的时间而是踩标注格式和类别映射这些坑的时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表