基于 YOLOv8 的交通标志识别系统(全套源码+数据集)

基于 YOLOv8 的交通标志识别系统

一、项目简介

本项目以清华大学与腾讯联合发布的 TT100K 数据集为基础,采用 YOLOv8n 模型完成交通标志的训练与推理,并基于 PyQt6 开发了一套完整的桌面端可视化识别系统。整个开发流程涵盖数据集构建与处理、模型训练与调优、系统集成与功能开发三个核心阶段,可识别限速牌、禁止标志、指示标志、警告标志等共 45 种常见中国交通标志。


二、数据集

2.1 数据集来源

TT100K(Tsinghua-Tencent 100K)由清华大学与腾讯联合发布,是目前规模最大的中国道路交通标志检测数据集之一,图片均来源于腾讯街景实拍,具备较强的场景多样性与实际应用价值。

2.2 数据规模

项目 数值
图片总数 约 100,000 张
单图分辨率 2048 × 2048 像素
含标志样本数 约 30,000 张
标注实例总数 约 100,000 个
本项目使用类别数 45 种
训练集 / 验证集 / 测试集 按官方划分

2.3 类别说明

本项目选取了数据集中频次较高的 45 种标志进行训练,按功能分为以下几类:

  • 限速系列(pl):pl5、pl20、pl30、pl40、pl50、pl60、pl70、pl80、pl100、pl120
  • 禁止系列(p):p3、p5、p6、p10、p11、p12、p13、p19、p23、p26、p27、pn、pne、pg
  • 限速解除(pm):pm20、pm30、pm55
  • 指示系列(i):i2、i2r、i4、i4l、i5、ip
  • 最低限速(il):il60、il80、il100
  • 限高系列(ph):ph4、ph4.5、ph5
  • 警告系列(w):w13、w32、w55、w57、w59
  • 其他:pr40

2.4 数据预处理

原始数据集已转换为 YOLO 格式(每张图片对应一个 .txt 标注文件,格式为 类别 cx cy w h,坐标归一化至 0-1),目录结构如下:

TT100K-YOLO格式/
├── images/
│   ├── train/
│   ├── val/
│   └── test/
└── labels/
    ├── train/
    ├── val/
    └── test/

训练时还使用了以下数据增强策略,以提升模型在复杂道路场景下的泛化能力:

增强方式 参数
HSV 色调抖动 h=0.015, s=0.7, v=0.4
随机水平翻转 概率 0.5
随机缩放 scale=0.5
随机平移 translate=0.1
Mosaic 拼接 概率 1.0

三、模型训练

3.1 基础架构

选用 YOLOv8n(nano)作为骨干网络,在 ImageNet 预训练权重基础上进行迁移学习。YOLOv8n 参数量极小,推理速度快,适合部署在边缘设备或对实时性有要求的场景中。

3.2 训练参数

参数
基础模型 yolov8n.pt
训练轮次(epochs) 100
批次大小(batch) 16
输入分辨率(imgsz) 640 × 640
优化器 SGD
初始学习率(lr0) 0.01
最终学习率(lrf) 0.01
动量(momentum) 0.937
权重衰减(weight_decay) 0.0005
预热轮次(warmup_epochs) 3
预热动量(warmup_momentum) 0.8
早停耐心值(patience) 20
训练设备 GPU(CUDA)
混合精度(AMP) 开启
NMS IoU 阈值 0.7

3.3 损失函数

YOLOv8 的总损失由三部分加权构成:

  • Box Loss(边框回归损失):权重 7.5,采用 CIoU,约束预测框与真实框的位置精度
  • Cls Loss(分类损失):权重 0.5,交叉熵损失,衡量类别预测正确率
  • DFL Loss(分布焦点损失):权重 1.5,对边框边缘分布建模,提升定位精度

3.4 学习率策略

训练前 3 个 epoch 执行线性 Warmup,使学习率从 0 平滑上升至 0.01;此后按余弦退火方式逐步衰减,最终收敛至接近初始学习率乘以 lrf 的数值,防止后期震荡。


四、训练指标

以下为模型在验证集上的最优指标(取各轮次峰值):

指标 数值
mAP@50 73.3%
mAP@50-95 55.2%
Precision(精确率) 75.2%
Recall(召回率) 65.8%
  • mAP@50:IoU 阈值为 0.5 时的平均精度,反映模型整体检测能力
  • mAP@50-95:在 0.5~0.95 多个 IoU 阈值下的均值,评估定位精度更严格
  • Precision:所有预测为正样本中真实为正的比例,越高误检越少
  • Recall:所有真实正样本中被成功检测到的比例,越高漏检越少

训练从第 1 个 epoch 的 mAP50≈6.3% 出发,经过约 80 个 epoch 基本收敛,最终稳定在 mAP50≈73%,说明迁移学习与增强策略组合对该数据集适配良好。


五、可视化图说明

训练完成后,运行目录 runs/train/tt100k_yolov8/ 下会生成以下可视化文件:

文件名 含义
results.png 综合训练曲线,包含各损失与 mAP 随 epoch 的变化趋势
training_loss.png 训练集三项损失(box/cls/dfl)的变化曲线
validation_loss.png 验证集三项损失的变化曲线,曲线与训练集接近说明无明显过拟合
mAP_curves.png mAP@50 与 mAP@50-95 随训练进程的上升曲线
P_curve.png 不同置信度阈值下 Precision 的变化,反映误检风险
R_curve.png 不同置信度阈值下 Recall 的变化,反映漏检风险
PR_curve.png Precision-Recall 曲线,面积即 AP,越靠近右上角越好
F1_curve.png F1 分数随置信度变化的曲线,峰值对应最佳置信度阈值
confusion_matrix.png 混淆矩阵(绝对数值),展示各类别的预测分布
confusion_matrix_normalized.png 归一化混淆矩阵,按行归一化后更直观对比各类别准确率
labels.jpg 数据集标注分布图,含类别频次直方图与边框中心/尺寸热图
labels_correlogram.jpg 标注属性相关性矩阵,分析 cx/cy/w/h 之间的分布关系
learning_rate.png 三组参数组(pg0/pg1/pg2)的学习率调度曲线
box_loss_comparison.png 训练集与验证集 box_loss 的对比曲线
detection_metrics.png Precision、Recall、mAP 三条曲线并列展示
precision_recall_trajectory.png Precision 与 Recall 随 epoch 的轨迹对比
training_dashboard.png 训练全局仪表板,汇总所有关键指标
final_metrics_summary.png 最终最优指标的柱状图汇总
train_batch*.jpg 随机训练批次样图,含标注框,用于检查数据增强效果
val_batch*_labels.jpg 验证集真实标签可视化
val_batch*_pred.jpg 验证集模型预测结果可视化,与 labels 对比可直观判断检测质量

六、系统功能

识别系统基于 PyQt6 开发,采用深空蓝主题,提供完整的图形界面操作体验,包含以下六个功能模块:

图片识别:支持文件选择与拖拽导入,一键触发 YOLOv8 推理,结果以标注图、统计摘要表、详细数据表(含坐标、面积、置信度)及置信度分布直方图四种形式呈现,并可将标注图与识别结果分别导出为图片文件和 CSV 表格。

视频识别:加载本地视频文件后,可指定每 N 帧执行一次推理以平衡性能与帧率,实时渲染带标注的视频帧,右侧同步显示当前帧统计与累计检测数据,支持导出当前帧为图片。

摄像头识别:通过摄像头 ID 连接本地摄像头,实时推流检测,支持一键开关检测模式、截图保存,并可将本次会话统计写入历史记录。

检测历史:所有检测结果均持久化至本地 SQLite 数据库,历史页面支持按类型筛选(图片/视频/摄像头)、关键词搜索、导出 CSV 及清空操作,点击任一行可展开详细记录。

模型管理:可浏览并替换权重文件,异步验证模型是否可正常加载,支持动态调整置信度阈值、IoU 阈值、最大检测数等推理参数,保存后即时生效。

指标展示:自动读取 runs/train/tt100k_yolov8/results.csv,以交互式图表展示训练曲线(训练/验证损失、mAP、P/R)及最佳指标柱状图汇总。


七、技术栈

类别 技术
深度学习框架 PyTorch 2.x
目标检测模型 Ultralytics YOLOv8
图像处理 OpenCV
数据分析 Pandas、NumPy
可视化 Matplotlib、Seaborn
桌面 UI 框架 PyQt6
数据库 SQLite(内置)
运行环境 Python 3.9

八、项目结构

c108/
├── app.py                          # 程序入口
├── login_window.py                 # 登录/注册窗口
├── main_window.py                  # 主窗口(侧边栏 + 页面堆栈)
├── train_yolov8.py                 # 模型训练脚本
├── data_tt100k.yaml                # 数据集配置文件
├── requirements.txt                # 依赖列表
│
├── pages/                          # 各功能页面
│   ├── image_page.py               # 图片识别页
│   ├── video_page.py               # 视频识别页
│   ├── camera_page.py              # 摄像头识别页
│   ├── history_page.py             # 检测历史页
│   ├── model_page.py               # 模型管理页
│   └── metrics_page.py             # 训练指标展示页
│
├── utils/                          # 工具模块
│   ├── styles.py                   # QSS 样式定义
│   ├── database.py                 # SQLite 数据库操作
│   ├── detector.py                 # YOLO 推理线程(图片/视频/摄像头)
│   └── helpers.py                  # 公共工具函数
│
├── TT100K-YOLO格式/                # 数据集(YOLO 格式)
│   ├── images/train|val|test/
│   └── labels/train|val|test/
│
├── runs/train/tt100k_yolov8/       # 训练输出目录
│   ├── weights/best.pt             # 最优权重(默认加载)
│   ├── weights/last.pt             # 最后轮次权重
│   ├── results.csv                 # 各 epoch 指标记录
│   └── *.png / *.jpg               # 可视化图表
│
└── data/                           # 运行时生成(SQLite 数据库)
    └── app.db

九、启动教程

9.1 安装依赖

pip install -r requirements.txt

9.2 准备数据集(仅训练时需要)

将 TT100K 数据集整理为 YOLO 格式后,放置于项目根目录的 TT100K-YOLO格式/ 文件夹中,目录结构与 data_tt100k.yaml 中的配置保持一致。

9.3 训练模型(可选)

如需重新训练,运行:

python train_yolov8.py

训练完成后,最优权重自动保存至 runs/train/tt100k_yolov8/weights/best.pt

9.4 启动识别系统

python app.py

默认账号:admin,密码:admin123(首次使用可直接登录,也可在登录页注册新账号)。

系统启动后自动加载 runs/train/tt100k_yolov8/weights/best.pt 作为默认模型,可在【模型管理】页面切换为其他权重文件。


本项目为个人原创,结构清晰,功能完整,适合计算机视觉方向课程设计、毕业设计和项目演示使用。有定制化需求可以评论或私信作者。

作者原创项目地址:michael-jay.pages.dev/projects.html

posted on 2026-08-03 00:56  Jay8059  阅读(3)  评论(0)    收藏  举报

导航