基于 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
浙公网安备 33010602011771号