新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于YOLOV5的交通标志识别实战:从数据集到部署全流程

发布时间:2026/9/28 2:13:34来源:尧图网络
基于YOLOV5的交通标志识别实战:从数据集到部署全流程
简介这份资源面向计算机、人工智能相关专业的本科生与研究生提供一套可直接用于毕业设计、期末大作业或课程设计的交通标志识别检测完整方案基于YOLOv5深度学习框架实现适合具备Python基础、希望快速完成高分项目的学习者。压缩包共266个文件约423.33MB包含53个py源码文件、59个yaml配置、55张jpg与26张png图像样本、10个pt权重文件以及csv训练日志、sh脚本、Dockerfile部署文件等覆盖数据、训练、推理与部署全流程。目前已有105人学习下载。代码注释详尽新手也能看懂项目经过严格调试下载后简单部署即可运行界面美观、功能完善可直接作为毕设或课程设计提交具有较高的实际应用与参考价值。1. 从一张糊掉的限速牌说起YOLOV5 交通标志识别到底能做成什么样城市道路上的限速牌、禁止掉头、注意行人这些标志在 60 公里时速下留给摄像头的有效像素可能不到 40×40。我拿手机在副驾随手拍过一段回放时发现逆光下的限速 80 几乎糊成一团人眼都要盯两秒才认得出。这就是交通标志识别Traffic Sign Recognition, TSR真正难的地方——不是分类本身而是小目标、光照剧变、遮挡和运动模糊叠在一起。用 Python 基于 YOLOV5 做交通标志识别是这几年毕业设计和工程落地里性价比很高的一条路线。YOLOV5 把检测框和类别一次输出推理速度快单卡 1080Ti 就能跑到实时Python 生态让数据清洗、增强、评估全流程都能脚本化。这套「数据集 代码 模型」的组合适合三类人要交高分毕业设计的学生、想快速验证车载感知原型的工程师、以及需要把交通标志检测嵌进已有视频分析流水线的开发者。但我要先把预期说清楚网上那些「训练完 mAP 99%」的截图多半是在干净数据集上过拟合的结果。真实路测里模型对远距离小标志的召回率会掉一大截。这篇文章不讲虚的从数据组织、环境配置、训练参数到部署推理把每一步能复现的命令和参数都摆出来也把翻车的地方提前标出来。2. 数据集怎么组织才不返工从原始标注到 YOLOV5 可读格式2.1 交通标志数据集的类别体系与标注规范交通标志数据集的质量八成决定了最终模型的上限。常见的公开数据有德国 GTSRB分类为主、TT100K清华发布含检测框、以及国内一些标注平台产出的自定义数据。TT100K 覆盖 200 多类但类别极不均衡很多类只有几十张如果直接拿来训长尾类别基本学不动。我的做法是先做类别合并。把「限速 60」「限速 80」这种细分类保留但把出现次数少于 100 的稀有类合并成「其他标志」或直接剔除。类别数控制在 15 到 30 之间是精度和可训练性的平衡点。标注格式统一用 YOLO 的 txt每行class_id x_center y_center width height坐标全部归一化到 0 到 1。下面这段脚本用来检查标注文件里有没有越界坐标和空文件这是训练前必做的一步import os import glob def check_labels(label_dir, img_dir): bad_files [] empty_files [] for txt_path in glob.glob(os.path.join(label_dir, *.txt)): name os.path.basename(txt_path) if os.path.getsize(txt_path) 0: empty_files.append(name) continue with open(txt_path, r) as f: for line_no, line in enumerate(f, 1): parts line.strip().split() if len(parts) ! 5: bad_files.append((name, line_no, 字段数不对)) continue cls_id int(parts[0]) coords [float(x) for x in parts[1:]] # 归一化坐标必须落在 0~1越界说明标注框跑出图像 if any(c 0 or c 1 for c in coords): bad_files.append((name, line_no, f坐标越界: {coords})) # 宽高为 0 是无效框 if coords[2] 0 or coords[3] 0: bad_files.append((name, line_no, 宽高非正)) print(f空标注文件: {len(empty_files)}) print(f异常标注: {len(bad_files)}) for item in bad_files[:20]: print(item) return bad_files check_labels(./labels/train, ./images/train)逻辑说明遍历所有 txt先查空文件空文件会让该图变成纯背景少量可以多了会拉低召回再逐行校验字段数和坐标范围。参数上coords[2]和coords[3]是宽高必须为正坐标越界通常是标注工具导出时没做裁剪。跑完这个脚本异常文件要么修要么删别带着脏数据进训练。2.2 划分训练集验证集与 data.yaml 的写法数据集目录按 YOLOV5 约定组织images/train、images/val、labels/train、labels/val平行存放文件名一一对应。划分比例我一般用 8:2但如果某类样本特别少要做分层抽样保证验证集里每类都有几张否则验证指标会失真。data.yaml是训练入口的配置写错路径是最常见的低级错误# data.yaml path: /home/user/traffic_sign # 数据集根目录 train: images/train # 相对 path 的训练图目录 val: images/val # 相对 path 的验证图目录 nc: 20 # 类别数必须和标注里的 class_id 最大值1 一致 names: # 类别名顺序必须和 class_id 对应 0: speed_limit_60 1: speed_limit_80 2: no_left_turn 3: pedestrian_crossing # ... 其余类别参数说明nc写错会导致训练时索引越界或类别错位这是血泪教训——曾经把 nc 写成 21 但实际只有 20 类训练不报错但最后一类永远学不到。names的顺序必须和标注时用的 class_id 严格对应改类别名不改顺序没事改顺序等于把标签全打乱。提示划分完数据集后用train和val的图片数量、标注框数量做一次交叉核对两边类别分布差异过大就重新分层。3. 环境配置与 YOLOV5 训练从 conda 到第一个收敛的模型3.1 conda 环境与 YOLOV5 依赖安装的完整命令环境这块翻车最多。YOLOV5 对 PyTorch 和 CUDA 版本敏感版本不匹配会报一堆看不懂的错。我一般用 conda 建独立环境避免污染系统 Python# 创建 Python 3.9 环境3.9 对 YOLOV5 兼容性最稳 conda create -n yolov5_ts python3.9 -y conda activate yolov5_ts # 安装 PyTorchCUDA 11.8 对应大多数 30/40 系显卡 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 克隆 YOLOV5 源码并安装依赖 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt逻辑说明先建环境再装框架顺序不能反。--index-url指定 PyTorch 官方 wheel 源避免 pip 默认源拉到 CPU 版本。装完用下面这行验证 GPU 是否可用python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))输出True加显卡型号才算成功。如果输出False八成是 CUDA 版本和驱动不匹配先nvidia-smi看驱动支持的 CUDA 上限再回退 PyTorch 版本。这一步没有后悔药环境不对后面全白搭。3.2 训练命令与关键超参数怎么设YOLOV5 的训练入口是train.py最简命令如下python train.py \ --data data/traffic_sign.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --project runs/train \ --name ts_exp1参数逐个说--weights yolov5s.pt用预训练权重做迁移学习小数据集千万别从零训收敛慢且容易过拟合--img 640是输入分辨率交通标志是小目标可以提到 960 甚至 1280但显存占用翻倍--batch 16在 8G 显存下比较稳显存够可以加到 32--epochs 100配合早停实际往往 60 到 80 轮就收敛了。超参数里最值得调的是学习率和锚框。YOLOV5 默认用--hyp data/hyps/hyp.scratch-low.yaml小数据集建议换成hyp.scratch-low.yaml并手动降lr0到 0.005 左右。锚框方面交通标志的宽高比和 COCO 通用目标差异大用下面命令重新聚类python utils/autoanchor.py --data data/traffic_sign.yaml --img 640它会根据你的标注框重新算 k-means 锚框替换掉默认的 COCO 锚框对小目标召回提升明显。这一步很多人跳过结果就是模型对大标志还行对远处小标志几乎瞎。3.3 训练过程监控与指标解读训练启动后runs/train/ts_exp1下会生成results.csv和各类曲线图。重点盯三个指标metrics/mAP_0.5、metrics/mAP_0.5:0.95、以及val/box_loss。mAP_0.5 到 0.85 以上算可用0.5:0.95 能到 0.6 就不错。如果 box_loss 一直不降检查标注框是不是普遍偏大或偏小。用 TensorBoard 看曲线更直观tensorboard --logdir runs/train浏览器打开对应端口看train/box_loss和val/box_loss的差距。两者差距持续拉大就是过拟合该加数据增强或提前停。YOLOV5 内置了 mosaic、mixup 增强交通标志场景下 mosaic 很有用但 mixup 对小目标可能把标志糊没可以调低mixup权重。4. 推理部署与效果验证模型训完只是开始4.1 用 detect.py 跑通单图与视频推理训练完的权重在runs/train/ts_exp1/weights/best.pt。单图推理python detect.py \ --weights runs/train/ts_exp1/weights/best.pt \ --source test_images/ \ --img 640 \ --conf-thres 0.4 \ --iou-thres 0.45 \ --device 0参数说明--conf-thres 0.4是置信度阈值交通标志场景宁可漏检也别误检可以设到 0.5--iou-thres 0.45控制 NMS 合并重叠框的力度标志密集时调低到 0.4 避免相邻标志被合并。视频推理把--source换成视频路径即可输出默认在runs/detect/exp。4.2 用验证集算 mAP 与混淆矩阵定位问题光看推理图不够要用val.py出量化指标python val.py \ --weights runs/train/ts_exp1/weights/best.pt \ --data data/traffic_sign.yaml \ --img 640 \ --task val \ --save-json跑完会输出每类的 P、R、mAP并生成混淆矩阵。混淆矩阵是排查利器如果「限速 60」大量被识别成「限速 80」说明这两类特征太像要么加数据要么在类别定义上合并。如果某类召回极低先看该类验证集样本数少于 50 张的基本学不好。4.3 导出 ONNX 与推理加速要嵌到 C 或边缘设备导出 ONNXpython export.py \ --weights runs/train/ts_exp1/weights/best.pt \ --include onnx \ --img 640 \ --opset 12--opset 12兼容性较好导出后用 onnxruntime 验证输出是否一致。注意导出时的--img必须和训练一致否则锚框对不上检测框会全乱。这一步在部署时踩过坑训练 640 导出 320结果框位置整体偏移排查了半天才发现是分辨率不匹配。5. 避坑与排查那些让模型「看起来能跑其实没用」的细节5.1 训练 loss 正常但 mAP 极低现象box_loss 稳步下降但 mAP_0.5 一直在 0.1 附近。原因通常是data.yaml里nc和实际类别数不一致或者names顺序和标注 class_id 错位。解决用脚本统计所有标注里出现过的 class_id确认最大值加一等于 nc再核对 names 顺序。5.2 小目标标志几乎检测不到现象近处大标志能检出远处小标志全漏。原因是默认锚框偏大且输入分辨率不够。解决跑autoanchor.py重新聚类锚框把--img提到 960并在hyp里调低anchor_t阈值让更多小框参与匹配。5.3 验证集指标高但实拍图效果差现象val mAP 0.9自己拍的视频里错检漏检一堆。原因是训练集和实拍场景域差异大——训练集多是晴天正拍实拍有逆光、雨雾、运动模糊。解决补充实拍数据进训练集加--augment做测试时增强或在推理前做直方图均衡化预处理。5.4 显存溢出CUDA out of memory现象训练中途报 OOM。原因是 batch 或 img 太大。解决降 batch 到 8或开--multi-scale让输入尺寸动态变化或改用 yolov5s 而非 yolov5m/l。梯度累积也能缓解但 YOLOV5 原生支持有限简单点直接降 batch。5.5 推理速度达不到实时现象单帧推理超过 100ms。原因是模型太大或没开半精度。解决换 yolov5s推理加--half开 FP16导出 TensorRT 引擎。实测 yolov5s 在 1080Ti 上 FP16 能到 5ms 左右一帧足够实时。6. 把模型塞进真实流水线一个可复用的推理封装技巧训完模型只是半成品真正要用起来得封装成可调用的接口。我一般写一个类把加载、预处理、推理、后处理、画框全包进去这样换模型或换输入源都不用改上层代码。下面这个封装基于 ultralytics 的YOLOv5接口实测在批量图片和视频流上都能用import cv2 import torch import numpy as np class TrafficSignDetector: def __init__(self, weights, img_size640, conf0.4, iou0.45, device0): # 加载本地权重避免每次推理重新读盘 self.model torch.hub.load(./yolov5, custom, pathweights, sourcelocal) self.model.conf conf self.model.iou iou self.model.img_size img_size self.model.to(fcuda:{device} if device ! cpu else cpu) self.model.eval() def preprocess(self, img_bgr): # YOLOV5 内部接受 BGR无需转 RGB但尺寸要记录用于还原 self.orig_h, self.orig_w img_bgr.shape[:2] return img_bgr def infer(self, img_bgr): img self.preprocess(img_bgr) results self.model(img) # pandas 格式便于按列取用 df results.pandas().xyxy[0] detections [] for _, row in df.iterrows(): detections.append({ class: row[name], conf: float(row[confidence]), bbox: [int(row[xmin]), int(row[ymin]), int(row[xmax]), int(row[ymax])] }) return detections def draw(self, img_bgr, detections): for det in detections: x1, y1, x2, y2 det[bbox] label f{det[class]} {det[conf]:.2f} cv2.rectangle(img_bgr, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img_bgr, label, (x1, y1 - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) return img_bgr # 使用示例 detector TrafficSignDetector(runs/train/ts_exp1/weights/best.pt) frame cv2.imread(test.jpg) dets detector.infer(frame) vis detector.draw(frame, dets) cv2.imwrite(result.jpg, vis)逻辑说明__init__里用torch.hub.load加载本地 YOLOV5 仓库和自定义权重sourcelocal避免联网拉取。infer返回结构化列表而不是原始张量方便上层做业务判断比如只关心「限速」类就过滤class字段。draw单独拆出来是因为有些场景只要检测结果不要画框比如对接告警系统。参数上conf和iou在类初始化时设好批量处理时不用每帧传。img_size要和训练一致否则精度掉。这个封装在 1080P 视频上单帧约 8msyolov5s FP16批量处理 1000 张图大概 12 秒。一个我踩过的坑torch.hub.load第一次调用会缓存模型结构如果中途换了权重文件路径但没重启进程可能加载的还是旧权重。稳妥做法是每次换模型都新建 detector 实例别复用。最后说个习惯。我现在每训完一个模型都会拿手机去路口拍 20 张不同光照的实拍图单独测一遍不看 mAP就看漏检和误检的具体案例。指标好看不代表能用实拍图才是照妖镜。这套流程从数据到部署走下来快的话两三天能出第一版可用模型慢的话卡在数据清洗上。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Python实现完全去中心化联邦学习:Socket通信与环形拓扑实战 2026/9/28 6:04:40

Python实现完全去中心化联邦学习:Socket通信与环形拓扑实战

简介:这是一份基于 Python 实现的简单完全去中心化联邦学习项目源码与文档,面向学习人工智能、隐私计算或联邦学习的在校生、研究者及开发者,尤其适合作为毕业设计、课程设计的参考与二次开发起点。项目包含数据加载与预处理、客户端模型、训…

阅读更多 →
Java+SpringBoot+Vue实现基于物品的协同过滤推荐系统实战 2026/9/28 6:04:39

Java+SpringBoot+Vue实现基于物品的协同过滤推荐系统实战

做推荐系统,别被“人工智能”四个字吓住。体育商品推荐这种业务,在绝大多数中小型项目里,用到协同过滤就足够了,根本不需要上深度学习。这篇实战指南,我从零开始讲清楚一件事:怎么用 Java SpringBoot Vue…

阅读更多 →
厨房积水检测数据集:VOC转YOLO训练与排坑指南 2026/9/28 6:04:39

厨房积水检测数据集:VOC转YOLO训练与排坑指南

简介:厨房积水检测数据集面向计算机视觉目标检测方向的开发者与学习者,聚焦厨房场景中泡沫(foam)和积水(water)两类目标的识别,可服务于家庭安全监控、餐厅后厨卫生管理以及清洁机器人环境感知等…

阅读更多 →
基于多模态融合的阿尔兹海默症智能诊断方法与PyTorch实现 2026/9/28 6:04:39

基于多模态融合的阿尔兹海默症智能诊断方法与PyTorch实现

简介:面向计算机相关专业学生与科研人员的Python毕业设计项目,聚焦基于多模态融合的阿尔兹海默症智能诊断方法,通过融合临床影像等多维特征完成脑疾病分类判断,覆盖从数据预处理、特征提取到模型训练与评估的完整流程,…

阅读更多 →
AURIX TriCore联合调试:HighTec与UDE协同配置实战指南 2026/9/28 6:04:39

AURIX TriCore联合调试:HighTec与UDE协同配置实战指南

1. 项目概述:为什么AURIX TriCore的联合调试总让人“卡在第一步”?AURIX TriCore开发环境搭建,尤其是HighTec与UDE的联合调试配置,是汽车电子、电机控制、安全关键系统领域工程师绕不开的一道硬门槛。我从2014年第一次接触TC275开…

阅读更多 →
京东云老用户续费同价,云服务成本优化的实操指南 2026/9/28 6:04:33

京东云老用户续费同价,云服务成本优化的实操指南

在云服务这个圈子里泡得久了,我对各种“老用户回馈”活动的敏感度比一般人高。这次看到“京东云老用户回馈,续费同价专区享优惠”这个话题,第一反应是平台终于开始认真对待存量用户了。云服务行业有个公开的秘密:新用户补贴花样百…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉