YOLO交通标志检测完整项目:Python源码、数据训练与PyQt5系统构建
本项目使用YOLO和PyQt5构建交通标志检测系统,支持图片、文件夹、视频和摄像头输入,输出目标框、类别、置信度及结果表格。我是孔一学长,这篇按工程实现过程介绍项目组成、数据接入、模型训练、结果验证与界面集成,方便做课设的同学逐项对照文件。
项目功能与运行效果
项目有YOLOv8s、YOLO11s、YOLO26s三个独立版本,共用同类界面功能。下面是YOLO11运行图:主区域绘制目标框,左侧展示检测信息,下方表格记录结果,右侧提供输入选择、模型选择和保存按钮。
完整演示采用YOLO11版,展示单图、文件夹批量、结果保存及连续视频检测:
https://www.bilibili.com/video/BV1oLpM6CEpL/除演示功能外,程序还有摄像头输入入口。各版本实际检测效果以对应训练权重为准。
系统如何分层,代码分别负责什么
工程分为数据与模型文件、模型推理、结果处理、PyQt5交互几部分。训练阶段将数据变成权重,运行阶段加载权重处理新输入,再把结果显示到界面中。
| 工程任务 | 主要文件 | 处理内容 |
|---|---|---|
| 数据定义 | myvoc.yaml | 数据路径与45类标签 |
| 模型训练 | train.py | 加载初始权重并执行训练 |
| 模型评估 | val.py | best.pt复评与指标保存 |
| 运行交互 | main.py、ui.py | 输入选择、推理、显示与保存 |
| 配置管理 | 项目配置.yaml、config_utils.py | 权重路径、阈值及界面资源 |
构建顺序是先准备数据与模型训练入口,再保存和验证权重,最后让界面调用同一条预测链路。界面显示所需的类别、坐标等内容来自模型返回值。
准备环境并确认启动入口
项目推荐Python 3.11,依赖包括PyTorch、PyQt5、OpenCV和PyYAML。完整包已带ultralytics源码,运行时保持项目目录完整,并核对本机PyTorch与计算环境。
python-mpipinstall-rrequirements.txt python train.py --check-only python main.py--check-only检查训练入口所需模型能否加载,不开始正式训练。main.py启动界面前,还要确保配置中的正式权重存在,例如YOLO11默认指向runs/train/exp_yolo11s_main200/weights/best.pt。
直接查看运行效果可以使用已有权重;重新训练则会产生新的实验文件。两种操作对应不同入口,第一次运行建议先用随包测试图确认界面流程。
具体支持哪些交通标志
类别范围由myvoc.yaml中的45个标签和项目配置.yaml中的显示名称共同确定。三版配置核对一致。下面按用途列全中文名称,分组只是文档组织方式,模型类别数仍为45。
限速与解除限速(10类):限速80、限速60、限速70、限速30、解除40限制速度、限速20、限速40、限速120、限速100、限速50。
最低时速(3类):最低80时速、最低60时速、最低100时速。
限高与限重(6类):限重55t、限高4m、限高4.5m、限重30t、限高5m、限重20t。
车辆通行限制(9类):禁止非机动车进入、禁止驶入、禁止二轮摩托车、禁止小型客车、禁止人力车、禁止机动车、禁止载货汽车、禁止载货汽车和拖拉机、禁止运输危险物车辆。
转向、停车与鸣笛限制(5类):禁止掉头、禁止鸣笛、禁止左转、禁止车辆临时或长时停放、禁止右转。
通行与车道指示(6类):人行横道、非机动车车道、机动车行驶、机动车车道、非机动车行驶、靠右行驶。
警示与让行(6类):减速让行、十字交叉、注意儿童、施工、注意行人、注意合流。
模型一次预测返回框位置和这45类中的类别。新增一种标志时,需要补充相应图像与标注并更新训练配置;现有工程中的名称表用于显示。日常读代码只需在这一处核对顺序,后面的重点是数据、训练与应用怎样连接。
接入数据集与训练配置
数据集共9738张道路图像、45类标志。myvoc.yaml指定datasets/dataset作为根目录,images和labels分别保存图像与检测标签。
| 划分 | 图像数 |
|---|---|
| train | 6793 |
| val | 1949 |
| test | 996 |
三个版本使用相同的数据划分规模。接入自定义数据时,应核对路径、图像与标签的对应关系以及类别编号;随后再同步数据配置与模型训练任务。
这张类别分布图按标注目标数统计,一张图像可以包含多个目标。类别数量并不均匀,因此新增实验时,除了总量,也要查看关注类别的样本。
用真实样本理解图像与标签
runs/val/exp_yolo11s_main200/val_batch0_labels.jpg把验证样本和真实标注排在一起。图中既有白天道路,也有夜间路口,标志经常位于画面远处;这里显示的是数据标签,不是预测成功率。
以左上角98112.jpg为例,对应datasets/dataset/labels/val/98112.txt中的真实内容如下:
15 0.955077 0.391276 0.022137 0.027344检测标签采用class_id x_center y_center width height五列。后四列是归一化坐标,此处类别15在项目中显示为限高4.5m。每个目标写一行,因此多目标图像会有多行标签;读取数据时依靠同名文件把图像和标注配对。
写数据接入逻辑时,可以从一个样本先检查路径和框位置,再检查整批。上图的夜间场景、小尺寸标志和同屏多个标志,也给后续验证提供了具体观察对象。
训练输入尺寸设为640。脚本使用旋转、平移、尺度变化、Mosaic与MixUp等增强;其水平和垂直翻转配置对方向性标志需要单独检查,避免改变原有语义。
预处理链路及可视化
数据指标图表/process_vis.py保留了预处理步骤可视化。下图把原始图像、LetterBox尺寸处理、RGB转换、0—1数值归一化和反归一化检查放在一起;最后一步用于核对显示,不是训练输入的一次额外处理。
图上方是整图,中间是同一区域的放大,下方是像素分布。原图缩到640后,远处小标志会损失部分细节。做尺寸实验时,应同时比较指标和样本预测,不能仅凭缩放后的图看起来清晰就判断模型效果。
从增强参数到实际训练批次
img_augment_vis.py另存了单目标增强图。这里使用类别14的目标裁剪,展示几何变化及模糊的外观,帮助理解每个操作改变什么。
正式训练参数包括degrees=10、translate=0.1、scale=0.5、perspective=0.001、mosaic=1.0和mixup=0.1,close_mosaic=10。可视化脚本与训练入口是两份代码,图中的高斯模糊不作为已开启训练参数的证据。
下面是runs/train/exp_yolo11s_main200/train_batch0.jpg,由训练过程实际保存。可以看到多图拼接、旋转或翻转后的道路,以及对应框的位置。
检查增强需要同时看图像与标签:目标发生位移或缩放时,框也应随之变化;涉及左右转向、靠右行驶等类别时,还要核查方向语义。这里只呈现已有配置和批次,不把某项增强直接写成指标提升原因。
执行模型训练,检查留下的产物
YOLO11训练入口加载本地yolo11s.pt,再调用model.train()。关键参数如下,另外两版同样设置200轮、640输入和16批量。
| 参数 | 配置 |
|---|---|
| epochs / imgsz / batch | 200 / 640 / 16 |
| optimizer / lr0 | SGD / 0.01 |
| momentum / weight_decay | 0.937 / 0.0005 |
| warmup_epochs / close_mosaic | 3 / 10 |
| seed / deterministic | 0 / True |
执行python train.py会写入训练目录。想保留既有结果,可用--name指定新的实验名;如果验证新实验,需要同步修改val.py中的权重和输出路径。
训练完成后,best.pt与last.pt保存模型权重,results.csv与results.png记录各轮数值和训练曲线。图中可以直接看到损失变化与检测指标趋稳的过程。
在PyQt5中接入预测和结果保存
训练好的权重通过项目配置.yaml指定,config_utils.py解析项目相对路径。界面选择图片或获取视频帧后,进入main.py的detect_pic():
self.results=self.yolo(img_path,conf=self.model_conf,iou=self.model_iou)[0]程序读取boxes.xyxy、boxes.cls和boxes.conf,绘制框与文字并填入表格。中文名称通过配置中的类别表转换,保持与模型类别顺序一致即可。视频和摄像头通过采集及定时刷新继续送帧。
CSV保存由save_current_result()完成:读取当前表格非空行,以utf-8-sig编码写入outputs/detection_results.csv,再次保存覆盖同名文件。它保存的是表格当前内容,不是自动追加整段视频的全部历史预测。
若启动后没有检测框,先检查输入、权重路径和置信度设置;若保存失败,检查表格有无内容与输出路径写权限。这样可以区分预测、显示和文件写入各自的问题。
验证模型并比较三个版本
python val.py加载本版best.pt,设置split=val、conf=0.001、iou=0.60,输入640、batch16,输出总体和分类别评价结果。
| 模型 | Precision | Recall | mAP50 | mAP50-95 |
|---|---|---|---|---|
| YOLOv8s | 74.15% | 67.43% | 75.11% | 56.31% |
| YOLO11s | 81.67% | 74.89% | 83.28% | 63.23% |
| YOLO26s | 82.82% | 80.41% | 87.12% | 65.41% |
上表来自各版evaluation_metrics.json。Precision观察预测正确性,Recall观察目标召回情况,mAP50-95综合多个框匹配严格程度;这些数值属于验证集复评,不能写成测试集成绩。
矩阵横轴为真实类别,纵轴为预测类别。总体指标之外,可以结合非对角线与背景相关项继续检查误分类、误检或漏检。界面默认conf0.5、iou0.5,与评估参数用途不同。
PR曲线与逐图验证
同一复评目录的BoxPR_curve.png展示Precision与Recall的变化关系。图例0.833是YOLO11的mAP50四舍五入,详细数值保留上表83.28%。
横轴是Recall、纵轴是Precision,灰线是类别曲线,蓝线为总体展示。定位问题时,总体表用于版本比较,曲线用于看阈值变化下的取舍,混淆矩阵用于查看类别错误,三者各有用途。
val_batch0_pred.jpg与前文val_batch0_labels.jpg使用同一批图像,可以按文件名对照。预测图里的类别旁有置信度,不能与真实标签混为一谈。
逐图核查时先看框的位置,再看类别与置信度,最后找真实标注存在而预测未出现的目标。先定位到样本和错误类型,再调整对应环节。修改模型后保留同一批检查图,便于比较新旧结果。
完整包的文件位置和版本范围
主要目录如下,训练材料、运行材料与使用说明都能在各自位置找到:
项目根目录/ ├─ main.py / ui.py / ui/ 界面入口与组件 ├─ 项目配置.yaml 权重路径、阈值、中文类别 ├─ config_utils.py 配置读取与路径解析 ├─ myvoc.yaml 45类数据集定义 ├─ datasets/dataset/ images与labels及数据划分 ├─ train.py / val.py / predict.py ├─ runs/train/ 训练曲线与weights/best.pt ├─ runs/val/ 复评指标与混淆矩阵 ├─ test_images/ / test_video.mp4 ├─ outputs/ 检测结果CSV ├─ 数据指标图表/ 架构及数据统计图 └─ 【打开后必看-带你一步步运行使用】/当前提供三个s规模基础版本,均有代码、数据、权重及训练验证产物。YOLO11可对应本文演示,YOLOv8用于版本对照,YOLO26在本次验证中的总体指标较高;版本比较采用上表的同一验证口径。
项目适合目标检测课程设计、三版本实验与PyQt5开发练习。阅读源码时,可以按数据定义、训练、权重复评、界面推理和结果保存依次运行,检查每一阶段的输出。
项目代码获取
完整资料包含源码、45类数据集、三版本权重、实验结果、测试素材与使用说明。同一项目库还可以查看其他视觉项目方向。
https://smallerkong.com/s/cs-yolo-traffic-8c51bc