公司动态
YOLOV5交通标志识别项目实战:从数据集到训练部署全记录
简介本资源是一套基于YOLOv5的交通标志识别高分毕业设计项目面向计算机、人工智能及相关专业本科生与深度学习初学者解决交通场景下多类标志检测的实战建模问题适用于毕业设计、课程设计及期末大作业。压缩包共1568个文件含779个Python源码含训练/推理/可视化脚本、61个YAML配置文件定义数据路径、类别数、模型结构等、10个预训练PT权重文件、62张示例图像及18张PNG标注可视化图另有TensorBoard日志events.out.tfevents支持训练过程分析整体大小为282.71MB。已有207人学习下载项目经导师指导并获98分高分评审所有代码均本地实测可运行包含完整数据预处理、模型训练、验证评估与部署推理流程目录结构规范模块职责清晰配套数据集已精细标注6105张交通标志图像覆盖常见限速、禁行、警告等类别开箱即用显著降低环境配置与调试门槛。 做目标检测项目这几年我最大的感受是真正能让你快速入门的往往不是某个算法的原理推演而是一套数据、代码、环境全都齐活的项目。最近我拿到一套YOLOV5交通标志识别的完整项目包含6105张已经标注好的数据集和整套可运行代码从配置环境到跑通训练再到出检测效果整个过程非常顺畅。这篇文章我就根据自己的实际运行经历把项目的完整拆解、数据集情况、环境配置细节、训练过程以及常见坑位全部记录下来希望能给正在做交通标志识别或者想用YOLOV5跑自定义数据集的朋友一些参考。先说结论这个项目的完整度确实很高数据集标注格式规范代码可以直接阅读和修改环境装好之后验证步骤走一遍就能看到效果。不管你是刚接触目标检测的初学者还是已经跑过几个模型想快速验证交通标志场景的开发者这套项目都能帮你省下从标注到调试的大把时间。1. 项目整体设计与选型思路1.1 为什么是YOLOV5而不是其他模型交通标志识别在自动驾驶和辅助驾驶里算是一个非常重要的感知任务。这类任务的特点是目标尺寸不大、类别多、实时性要求高。相比Faster R-CNN这类两阶段检测器YOLO系列在速度和精度的平衡上更有优势而YOLOV5作为2020年发布的版本到现在依然是很多实际项目里的首选版本因为它足够稳定社区资料也最全。之前我也用过YOLOv8做过一些测试v8的模块设计更先进训练细节也做了优化但如果你需要快速在业务场景落地YOLOV5依然不过时。原因很简单网上关于YOLOV5的教程、issue讨论、部署方案存量极大踩坑容易搜到答案。而交通标志这种小目标检测场景YOLOV5提供的小模型、中模型、大模型可以灵活根据算力进行切换这个项目自带的代码结构也方便做针对性修改。还有一个比较关键的点是硬件门槛。这套项目用默认参数在普通显卡上就能跑起来不像一些大模型动辄需要多卡并行。对我这种手里只有一块中低端显卡的人来说YOLOV5是真正的务实选择。1.2 项目目录结构与核心文件说明整套项目拿到手之后第一件事应该是把目录结构理顺。它的核心代码基于Ultralytics的YOLOV5官方仓库结构但也做了一些定制可以关注几个重点train.py训练入口负责加载数据、配置超参数并启动训练。detect.py推理入口可以处理图片、视频也支持摄像头实时检测。models/网络结构定义包括yolov5s.yaml、yolov5m.yaml等不同规模的配置文件。data/数据集配置里面存放了自定义数据集的YAML文件。datasets/存放标注好的图片和标签文件这也是这个项目的核心资产之一。runs/训练日志和权重保存目录训练完成后所有结果都在这里。这些文件和官方YOLOV5仓库非常像但数据集的配置和类别定义已经定好了。也就是说你不需要再去写一份数据集路径配置也不必手动调整类别列表只要路径正确训练就能启动。2. 6105张数据集拆解与分析2.1 这个数据规模到底够不够用很多第一次接触这个项目的朋友会问6105张图片做交通标志识别够用吗我的看法是对于大部分场景这个量级属于“入门有余、精细不足”的区间。如果类别数量控制在十几类以内目标形态相对固定、背景变化又不至于太夸张训练出来的模型在日常场景下已经具备可用的识别能力。我做了一些统计这套数据集的图片尺寸主要集中在一千像素左右交通标志在画面里大概占图像面积的百分之几属于典型的小目标。数据中包含白天、黄昏等不同时段的图片部分图片里标志存在一定程度遮挡和旋转。这种多样性对提升模型泛化能力很有帮助比单纯追求图片数量更重要。如果以后想继续优化这套数据也可以作为基础再补充一部分自己采集的负样本和难例。因为数据标注格式是标准的YOLO标签格式跟各类数据增强和半自动标注工具都能兼容后续扩展并不需要伤筋动骨。2.2 标注格式与类别配置解析这套数据集采用的是YOLO格式的标注也就是每张图片对应一个同名txt文件每一行代表一个目标。五个数值的含义分别是类别id、归一化的中心点x坐标、归一化的中心点y坐标、归一化的目标宽度和目标高度。所有坐标都用0到1之间的小数保存这种格式的好处是跟图片分辨率无关训练时不需要额外做坐标换算。我建议拿到项目后先手动检查几个标注文件确认类别id的范围和图片内容是否对应。尤其是自己要对数据集做二次清洗的时候如果类别id匹配错位训练出来的模型会出现很奇怪的误检。这个项目里类别名和id的对应关系写在数据集配置文件中打开后可以看到类似这样的定义names: 0: speed_limit 1: no_entry 2: stop 3: warning 4: crosswalk这里特别提醒YOLO坐标的归一化方式一定要确认中心点是否落在了目标框内部。偶尔会有标注工具导出时把中心点坐标写错训练时模型不收敛的情况很可能就出在这里。用Python快速脚本扫描一圈把越界的标注找出来是很有必要的环节。2.3 数据划分与验证集的作用数据集文件夹里通常会按YOLOV5的标准习惯划分为images和labels两个大目录每个目录下又分train和val。这样train.py会自动根据文件路径找到对应的训练集和验证集。这套项目的划分比例大概是90%用于训练10%用于验证。对六千多张的规模来说验证集六百多张是合理的既不会让模型的评估结果太抖也不会浪费参与训练的样本。训练过程中每个epoch结束模型都会用验证集进行mAP计算你是否做好数据划分直接影响指标能不能正确反映模型真实水平。如果以后要换自己的数据别忘了保持训练集和验证集之间的分布一致性。简单来说同一个地点连续拍摄的相似图片不要全堆在同一侧否则验证分数会虚高一旦换场景就露馅。3. 环境配置全记录3.1 从零搭建Python与PyTorch环境这个项目名字里写了“配置完环境就能运行”但环境配置这一步仍然是新手翻车最多的地方。我自己的配置过程是这样的本次运行使用的是Python 3.9版本PyTorch 2.0CUDA 11.8。这套组合跑YOLOV5非常稳定如果显卡驱动支持建议优先复用这个组合。建议不要直接在系统全局Python里装这些依赖而是用conda创建一个独立的虚拟环境。虚拟环境的隔离作用能让你在不同项目之间自由切换避免包版本互相干扰。创建环境的命令很简单conda create -n yolo_traffic python3.9 conda activate yolo_traffic激活环境之后先安装PyTorch再安装requirements.txt里的其他依赖。PyTorch的安装方式会随着CUDA版本的变化而变化官网的安装命令会自动匹配对应的wheel包建议尽量跟着官网的命令行走不要自己手动拼写版本号否则很容易出现安装上了但GPU不可用的情况。3.2 requirements.txt依赖排查项目根目录下的requirements.txt是环境配置的“购物清单”里面列出了运行训练和推理需要的所有Python包。主要有这么几类numpy提供数值计算基础opencv-python负责图像读写和预处理matplotlib用来可视化训练曲线tensorboard用于记录训练日志以及seaborn等数据展示库。我的建议是不要盲目地一次性pip install整份文件。先前逐个看一遍把不需要的包剔除。比如如果你不做TensorBoard可视化它缺失也不会影响训练只是会减少一部分日志记录功能。安装过程里最常见的报错是某个Cython依赖编译失败或者一些底层库的wheel包在当前平台不存在。遇到这种情况不用紧张一般升级一下pip或者单独指定一个稍微新一点的版本重装就能解决。装完之后强烈推荐验证一下PyTorch和显卡能不能正常通信import torch print(torch.__version__) print(torch.cuda.is_available())只有is_available()返回True才说明GPU环境真正就绪否则训练会默认退回CPU速度惨不忍睹。3.3 权重文件与预训练模型准备训练之前还需要准备一个预训练权重。YOLOV5官方提供了yolov5s.pt、yolov5m.pt、yolov5l.pt、yolov5x.pt几个文件分别对应从小到大不同规模的模型。这个项目里我选择了yolov5s.pt原因有三点训练速度快、显存占用小、在交通标志这种相对单一的任务上精度已经够用。如果你运行训练命令后权重没有提前准备程序会自动尝试下载。这里要提醒一下不要把这个自动下载当成依赖很多服务器环境出不了网所以提前把预训练权重放在项目根目录下比依赖自动下载更可靠。判断权重文件是否完整的标准是文件大小是否正常如果下载中断生成的文件只有几十KB基本上没法用。3.4 常见环境问题Quick Check环境配置阶段我遇到的报错基本可以分成三类。第一类是找不到模块比如No module named torch这种情况通常是环境没有激活或者依赖没装全。第二类是CUDA初始化错误显示CUDA error: no kernel image available这种比较头疼基本是PyTorch版本和显卡驱动不匹配需要升级驱动或换一个PytTorch版本。第三类是显存不足OOM这个跟环境无关是模型参数、batch size和图片尺寸共同决定的需要降低配置参数。一套项目拿过来的第一步不是急着训练而是先跑一个小目标来验证环境。比如用一张测试图片执行一次detect.py看看推理流程能不能正常走通。如果这一步没问题说明依赖基本都装好了后面训练即使有问题排查思路也能更清晰。4. 训练过程的完整实操记录4.1 数据集配置文件的正确写法训练脚本运行时要指定一个数据集配置文件这个文件决定了模型去哪些路径找图片、有哪些类别要预测。这个项目里已经写好了这个文件打开后大概是这样的结构train: datasets/images/train val: datasets/images/val nc: 5 names: 0: speed_limit 1: no_entry 2: stop 3: warning 4: crosswalktrain和val这两个路径一定要跟项目实际所在位置对应。很多人运行时在排查时看到assert train set not found之类的提示就是因为相对路径写错了。建议训练前先检查一下这个yaml文件的路径可以做一个快速验证用Python统计一下目录下的图片数量看看train和val是否都能读出来。一个需要注意的细节是nc数值必须和names列表长度一致。nc表示类别总数如果这里写错模型输出的维度就会跟标签对不上训练时报错几乎不可避免。4.2 训练命令与关键参数调优一份可以直接执行的训练命令如下python train.py \ --data data/traffic_sign.yaml \ --weights yolov5s.pt \ --cfg models/yolov5s.yaml \ --batch-size 16 \ --epochs 100 \ --img 640每个参数的用途要理解清楚而不是背命令。--data告诉训练脚本数据集信息--weights指定初始权重一般用官方的COCO预训练权重来迁移学习比从零训练效果好很多--batch-size是每次迭代喂给模型的图片数显存不够时优先调低它--epochs是训练轮数交通标志这类任务往往不需要跑太多轮100轮已经能明显看到结果--img是输入网络的图片尺寸640是比较常见的选择兼顾速度与精度。我实际跑的过程中还调整了--workers也就是数据加载的线程数从默认值调到8训练整体速度提升了一些。这个参数对精度没有影响纯粹是效率优化。如果你的电脑CPU核心不多反而可以降低一些因为worker数量太多可能导致CPU成为瓶颈。超参数文件hyp.scratch.yaml里还有一些更细的配置比如学习率、动量、权重衰减等。默认参数已经能在大多数数据集上取得不错效果新手阶段建议先不动它。如果训练出来的模型过拟合严重可以适当增加一些数据增强比例或者把--epochs减少。4.3 epoch训练过程观察训练启动后每完成一个epoch终端会打印出一系列指标。我主要看三个box_loss表示边界框回归的损失cls_loss表示分类损失mAP表示平均精度均值。从我的实际过程看刚开始的十几个epoch损失下降非常明显mAP从零星几个百分点快速攀升。到了50轮附近提升速度明显放缓曲线进入平台期。这里需要留意的是判断模型有没有收敛不要只看最终epoch的指标更合理的方法是看验证集mAP的峰值出现在哪个epoch。YOLOV5会自动保留best.pt这个文件就是验证集表现最好的那一轮权重。后续推理时优先使用best.pt而不是最后一轮的last.pt。训练过程偶有出现损失激增一小段再回落回来的情况如果幅度不大且能恢复正常就不用太担心这通常跟批量大小和数据顺序有关。但如果一路飙升八成是学习率太高或者数据集标注有严重问题及时终止修正才是上策。4.4 训练结果可视化与指标解读训练结束后runs/train/exp目录下会生成一堆结果文件包括results.png、confusion_matrix.png、labels.jpg。这几张图值得花时间好好看一遍。labels.jpg展示了训练集里所有目标框的位置和大小分布如果看到中心点坐标集中在图片边缘或者框的宽高比都异常说明数据本身存在问题模型再怎么调也白搭。混淆矩阵能直观看到哪个类别的识别效果不好比如限速标志被误检成禁止通行那就在这些类别的图片数量上做补充。在交通标志识别场景里单独看mAP不能完全说明问题因为真实路上会有大量的背景区域和相似外观的标志。如果部署环境对误检容忍度低建议再观察一下precision和recall曲线的平衡点。通过调整置信度阈值可以控制检测结果的严格程度。5. 推理部署与模型使用细节5.1 用detect.py跑图片与视频推理模型训练好之后激动人心的环节就是看实际检测效果。YOLOV5提供了开箱即用的推理脚本最基本的调用方式是python detect.py \ --weights runs/train/exp/weights/best.pt \ --source test_images/0001.jpg \ --conf 0.4 \ --save-txt--source既可以是图片路径、视频路径也可以是摄像头编号。如果用摄像头命令会调用本机摄像头实现实时检测。--conf是置信度阈值默认是0.25但在交通标志这种场景下我倾向于调高一点到0.4左右用来过滤掉一些低置信度的背景误检。--save-txt会把检测结果输出成txt文件每一行记录类别、置信度和归一化坐标方便后续程序做结果解析。跑推理时我遇到过一个很有意思的情况对着电脑屏幕上的手机相册图片检测准确率蛮高但换到真实行车记录仪拍摄的图片时效果有明显波动。这提醒我模型的部署效果和训练数据分布高度相关训练时如果图片视角、光照都比较单一换到现场环境时仍然要做好充分的测试。5.2 模型导出与跨平台部署如果你想把模型部署到服务端或者嵌入式设备可以考虑把PyTorch模型导出成TorchScript或ONNX格式。TorchScript的好处是可以脱离Python训练环境直接运行ONNX的兼容性更好可以转换到TensorRT、OpenVINO等推理引擎上。YOLOV5提供了export.py脚本一行命令就能完成导出python export.py \ --weights runs/train/exp/weights/best.pt \ --include onnx \ --img 640导出的onnx文件可以用onnxruntime在CPU上跑也能进一步转换到移动端。比较关键的一点是导出前要确保模型输入的尺寸和训练时保持统一否则推理时会出现目标框位置偏移的怪问题。我自己的经验是这类导出的问题主要出在输出层解析上如果使用第三方的ONNX推理框架一定要确认后处理里的锚点策略和原版一致否则边界框和类别都容易乱。6. 踩坑实录与问题排查速查6.1 训练常见的几个大坑项目整体跑得比较顺但有一些坑需要单独拎出来讲避免后面的人重复踩。第一个坑是路径问题。很多人的项目文件夹放在中文路径下或者路径中间带了空格这会导致Python读取数据集时出现奇怪的解析错误。最稳妥的做法是把项目放到纯英文路径下比如D:\yolo_traffic这种。第二个坑是显存不够导致进程被杀。如果显卡显存只有6GB或8GB跑默认的批次大小很容易OOM。遇到这种情况不要盲目升级硬件先降低--batch-size比如从16降到8或4再把输入图片尺寸从640降到512通常就能解决。如果还想跑更大的模型可以尝试开启混合精度训练在train.py命令中加一个--amp参数显存占用能明显减少。第三个坑是训练过程中验证集指标始终为零。这种情况要重点检查标签文件和names列表。比如标签里某个类别id是5但是你的names列表只定义了5个类别就会导致无法对应。我建议用脚本把每个txt标签文件的类别id最大值统计出来和nc做比较不一致就立刻修正。第四个坑是数据类别严重不平衡。交通标志数据里不同类别的数量差距可能非常大。有的标志出现几千次有的只有几十次模型会倾向于把数量多的类别学得更好。针对这个问题可以优先采用简单有效的方法对少数类图片做复制粘贴增强或者调整置信度阈值让模型对少数类更敏感一些。6.2 推理结果出现大量误检怎么处理如果你发现测试图片上出现了很多彼此重叠的框或者同一个标志被多次框出先不要急着调训练参数。一个很常见的原因是anchor尺寸和你的目标尺寸不匹配YOLO系列对anchor非常敏感。官方预训练权重是基于COCO数据集的COCO里大目标较多而交通标志是小目标。解决方式是把训练时的--img尺寸适当调大或者用聚类方法重新计算适合数据的anchor尺寸。在YOLOV5仓库里有一个utils/autoanchor.py训练时会自动检测anchor是否适配当前数据集如果建议调整就说明当前锚点框效果不够好。开启--nosave跑一两个epoch可以快速触发anchor重新演算。如果仍然误检严重就要审视测试图片是否包含训练集中根本没出现过的标志种类这类OOD检测问题目前所有模型都无法完全避免业务上一般只能通过扩充数据或者后置规则过滤来解决。6.3 数据标注质量自查清单整个项目跑完回头看最影响最终效果的其实是数据标注质量。以下是几个容易被忽视但又非常关键的检查点建议定期跑一遍标签文件里是否存在x、y坐标超出[0,1]区间的情况。标注框的宽度或高度是否为0或负数。图片和标签文件是否一一对应有没有存在空标签的图片。类别id是否从0开始连续编号有没有跳号。这些检查完全可以写一段小脚本自动完成。我自己执行过一遍确实发现有几张图片的标签框坐标存在轻微越界修正后训练曲线整体平滑度上升了一个档次。不要迷信别人的数据就绝对干净拿数据的第一时间先查验是专业做法。7. 我的最终使用体会这套YOLOV5交通标志识别项目从拿到手到跑通全部流程整体是非常舒服的。代码结构清晰6105张数据集的标注质量也达到了可用级别。对于想快速上手目标检测、或者需要在此场景上做二次开发的朋友它是一个很不错的起点。我在实际操作中跑通了训练、推理、导出全链路之后最大的收获其实不是精度数字有多高而是理解了在整个项目里数据质量、环境匹配和参数理解这三件事才是真正决定项目成败的关键。最后再分享一个小技巧训练前后多看一眼runs目录里生成的可视化图片很多问题在这些图里早有预兆只是容易被忽略。模型最差和最好的epoch之间差距远比想象中大别怕多跑几轮也别盲目堆轮数和数据量先把基础的路径、标注、批次关系理清了很多问题自己就解决了。本文还有配套的精品资源点击获取