保姆级教程!基于YOLOv8的交通标志检测系统(附完整源码+6000多张数据集+PyQt5界面)
·
一、💡前言:毕业设计的痛点与解决方案
痛点一:环境配置困难
做过深度学习项目的小伙伴肯定都遇到过这些坑:
- PyTorch版本不兼容,CUDA环境配置报错
- 依赖包版本冲突,pip install总失败
- 代码在别人电脑上能跑,自己电脑上各种报错
痛点二:代码理解困难
- GitHub上的开源项目代码复杂,注释不清晰
- 不知道从哪个文件开始看起
- 模型训练参数不知道如何调整
痛点三:数据集获取困难
- 标注数据集耗时耗力
- 找不到高质量的训练数据
- 数据格式转换麻烦
二、✨ 本项目的优势
纯Python开发:基于PyTorch和PyQt5,代码结构清晰,注释详细
一键运行:提供完整的环境配置脚本,按步骤操作即可运行
美观的UI界面:使用PyQt5开发的图形界面,操作简单直观
完整数据集:包含6000+张交通标志图片,45种标志类别,VOC格式标准标注
多种检测模式:支持单张图片、视频文件、实时摄像头三种检测方式
预训练模型:提供训练好的模型权重,可直接使用
三、🎬 系统演示

系统主界面包含以下功能区域:
- 左侧:检测结果详情显示(检测时间、标志数量、标志编号、置信度、坐标位置)
- 中间:图像/视频实时显示区域
- 下方:检测结果列表表格(序号、文件路径、识别结果、标志含义、置信度、坐标位置)
- 右侧:参数设置和操作按钮(模型选择、IOU阈值调整、图像/视频/摄像头检测按钮)

系统识别效果展示:
- 识别准确率:经过6000+数据训练的模型,在测试集上mAP达到95%+
- 检测速度:单张图片检测时间<0.1秒,实时视频检测FPS>30
- 支持标志类别:45种常见交通标志,包括限速标志、禁止标志、指示标志、警告标志等
四、🛠️ 核心技术栈
| 技术 | 用途 |
|---|---|
| Python | 开发语言 |
| PyTorch | 深度学习框架 |
| PyQt5 | GUI界面开发 |
| OpenCV | 图像处理和视频读取 |
| NumPy | 数值计算 |
| Pillow | 图像处理 |
为什么选择这些技术?
- PyTorch:当前最流行的深度学习框架之一,API设计简洁,易于上手
- PyQt5:跨平台GUI框架,可以开发出美观的桌面应用
- OpenCV:计算机视觉领域的标准库,功能强大且稳定
- YOLOv8:最新的YOLO系列模型,在速度和准确率之间达到了很好的平衡
五、📁 项目目录结构
yolov8-pytorch-traffic_sign_01/
├── 主界面.py # 主程序入口,PyQt5界面逻辑
├── ui.py # UI界面自动生成文件
├── ui.ui # Qt Designer设计的界面文件
├── yolo.py # YOLO检测核心类
├── predict.py # 命令行预测脚本
├── train.py # 模型训练脚本
├── voc_annotation.py # VOC格式数据标注转换
├── get_map.py # mAP计算脚本
│
├── nets/ # 网络模型定义
│ ├── backbone.py # YOLOv8主干网络
│ ├── yolo.py # YOLO检测头
│ └── yolo_training.py # 训练相关辅助函数
│
├── utils/ # 工具函数库
│ ├── utils.py # 通用工具函数
│ ├── utils_bbox.py # 边界框处理
│ ├── utils_fit.py # 训练相关函数
│ ├── utils_map.py # mAP计算工具
│ ├── dataloader.py # 数据加载器
│ └── callbacks.py # 训练回调函数
│
├── model_data/ # 模型和数据配置
│ ├── my_classes.txt # 45种交通标志类别列表
│ ├── yolov8_s.pth # YOLOv8-small预训练权重
│ ├── yolov8_m.pth # YOLOv8-medium预训练权重
│ ├── yolov8_l.pth # YOLOv8-large预训练权重
│ ├── yolov8_x.pth # YOLOv8-xlarge预训练权重
│ └── simhei.ttf # 中文字体文件
│
├── logs/ # 训练日志和权重文件
│ ├── best_epoch_weights.pth # 最佳模型权重
│ └── last_epoch_weights.pth # 最后一次训练权重
│
├── VOCdevkit/ # VOC格式数据集
│ └── VOC2007/
│ ├── Annotations/ # XML标注文件(6034个)
│ ├── JPEGImages/ # 原始图片(6034张)
│ └── ImageSets/ # 数据集划分文件
│
├── img/ # 测试图片文件夹
├── img_out/ # 检测结果输出文件夹
├── ui/ # UI界面资源文件
│ ├── background.png # 界面背景图
│ ├── 图像.png # 图像按钮图标
│ ├── 视频.png # 视频按钮图标
│ └── 摄像头.png # 摄像头按钮图标
│
└── 环境配置命令.txt # 环境配置安装命令
目录说明:
nets/:定义了YOLOv8的网络结构,包括主干网络和检测头utils/:提供了数据加载、图像处理、边界框计算等工具函数VOCdevkit/:存储VOC格式的数据集,包含图片和XML标注文件model_data/:存放模型配置文件和预训练权重
六、💻 核心代码展示
1. 界面初始化与YOLO模型加载
from PyQt5 import QtWidgets, QtGui, QtCore
from ui import Ui_MainWindow
from yolo import YOLO
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self) # 初始化UI界面
# 设置IOU阈值下拉框(0.1到0.9)
self.comboBox.addItems(["0.1", "0.2", "0.3", "0.4", "0.5",
"0.6", "0.7", "0.8", "0.9"])
self.comboBox.setCurrentIndex(4) # 默认选择0.5
# 初始化YOLO检测模型
self.yolo = YOLO()
# 设置定时器用于视频和摄像头检测
self.timer_camera = QtCore.QTimer()
self.timer_video = QtCore.QTimer()
self.cap = cv2.VideoCapture()
# 连接信号与槽函数
self.pushButton_pic.clicked.connect(self.select_img) # 图像检测
self.pushButton_video.clicked.connect(self.select_video) # 视频检测
self.pushButton_camera.clicked.connect(self.button_open_camera_clicked) # 摄像头检测
代码说明:
- 使用PyQt5创建主窗口,继承自动生成的UI类
- 初始化YOLO检测模型,加载预训练权重
- 设置定时器用于实时视频流检测
- 通过信号槽机制连接按钮点击事件与处理函数
2. 图像预处理与模型推理
from yolo import YOLO
from PIL import Image
def detect_image(self, image, crop=False, count=False, confidence=0.5):
"""
单张图片检测函数
Args:
image: PIL格式的图片对象
confidence: 置信度阈值,过滤低置信度检测框
Returns:
image: 绘制了检测框的图片
"""
# 将图片转换为RGB格式(处理灰度图)
image = cvtColor(image)
# 图片resize,保持宽高比(letterbox方式)
image_data = resize_image(image, (640, 640), letterbox_image=True)
# 数据预处理:归一化、通道转换、添加batch维度
# [H, W, 3] -> [1, 3, 640, 640]
image_data = np.expand_dims(
np.transpose(preprocess_input(np.array(image_data, dtype='float32')), (2, 0, 1)),
0
)
# 模型推理(不计算梯度,加快推理速度)
with torch.no_grad():
images = torch.from_numpy(image_data)
outputs = self.net(images) # 模型前向传播
outputs = self.bbox_util.decode_box(outputs) # 解码预测框
# 非极大值抑制(NMS)去除重复框
results = self.bbox_util.non_max_suppression(
outputs, self.num_classes, self.input_shape,
image_shape, letterbox_image=True,
conf_thres=confidence, nms_thres=0.3
)
# 在图片上绘制检测框和标签
if results[0] is not None:
for i, c in enumerate(top_label):
predicted_class = self.class_names[int(c)] # 类别名称
box = top_boxes[i] # 边界框坐标
score = top_conf[i] # 置信度
# 绘制矩形框和文字标签
draw.rectangle([left, top, right, bottom],
outline=self.colors[c], width=2)
draw.text((left, top-20), f'{predicted_class} {score:.2f}',
fill=self.colors[c], font=font)
return image
代码说明:
- 图片预处理:RGB转换、尺寸调整、归一化
- 模型推理使用
torch.no_grad()禁用梯度计算,提升速度 - NMS非极大值抑制去除重复检测框
- 使用PIL的ImageDraw在图片上绘制检测框和标签
3. 摄像头实时检测
def show_camera(self):
"""
摄像头实时检测函数
通过定时器每30ms读取一帧并检测
"""
flag, self.image = self.cap.read() # 从摄像头读取一帧
if flag:
# 调整图片尺寸以适应显示区域
show = cv2.resize(self.image, (741, 431))
cv2.imwrite('./jietu.jpg', show)
# 转换为PIL格式并调用YOLO检测
image = Image.open('./jietu.jpg')
r_image = self.yolo.detect_image(
image,
crop=False,
count=False,
confidence=float(self.comboBox.currentText()) # 使用当前选择的IOU阈值
)
# 保存检测结果并显示在界面上
r_image.save('./res2.png')
self.label_show.setStyleSheet("image: url(./res2.png)")
# 更新检测结果表格
self.show_data()
def button_open_camera_clicked(self):
"""
打开/关闭摄像头按钮事件
"""
if self.timer_camera.isActive() == False:
# 打开摄像头(0表示默认摄像头)
flag = self.cap.open(0)
if flag:
# 启动定时器,每30ms触发一次show_camera
self.timer_camera.start(30)
else:
# 关闭定时器和摄像头
self.timer_camera.stop()
self.cap.release()
代码说明:
- 使用OpenCV的VideoCapture读取摄像头视频流
- 通过QTimer定时器实现实时检测(30ms一帧)
- 将检测结果实时显示在PyQt5的QLabel控件上
- 支持动态调整置信度阈值,过滤低质量检测框
七、🚀 如何使用/运行步骤
步骤1:安装依赖
打开终端(或Anaconda Prompt),创建虚拟环境并安装依赖:
# 创建conda虚拟环境(推荐)
conda create -n pytorch python=3.8
conda activate pytorch
# 安装PyTorch(根据你的CUDA版本选择,CPU版本去掉-c pytorch)
pip install torch torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 安装其他依赖
pip install PyQt5 opencv-python numpy Pillow matplotlib tqdm scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/
或者直接使用项目提供的环境配置命令.txt文件中的命令(已配置国内镜像源)。
步骤2:运行主程序
# 激活环境(如果已激活可跳过)
conda activate pytorch
# 运行主界面
python 主界面.py
步骤3:使用系统进行检测
图像检测:
- 点击右侧"图像"按钮(📷图标)
- 选择要检测的图片文件(支持.jpg、.png格式)
- 系统自动显示检测结果,左侧面板显示检测详情,下方表格显示所有检测到的标志
视频检测:
- 点击右侧"视频"按钮(🎬图标)
- 选择视频文件(支持.mp4、.avi格式)
- 系统自动逐帧检测并实时显示结果
摄像头检测:
- 确保摄像头已连接
- 点击右侧"摄像头"按钮(📹图标)
- 系统打开摄像头并实时检测,再次点击可关闭摄像头
调整参数:
- 点击"模型文件"按钮可更换检测模型(支持yolov8_n/s/m/l/x)
- 调整"IOU阈值"下拉框可改变检测的置信度阈值(0.1-0.9)
八、📊 训练自己的数据集
如果你想使用自己的数据集训练模型:
1. 准备数据集
- 将图片放入
VOCdevkit/VOC2007/JPEGImages/ - 将XML标注文件放入
VOCdevkit/VOC2007/Annotations/ - 修改
model_data/my_classes.txt,写入你的类别名称
2. 生成训练文件
python voc_annotation.py
3. 开始训练
python train.py
训练过程中可以:
- 查看
logs/文件夹下的loss曲线图 - 使用TensorBoard可视化训练过程
- 训练完成后权重文件保存在
logs/best_epoch_weights.pth
九、📥 获取完整源码
由于篇幅限制,本文仅展示了项目的核心代码框架和基础功能。
完整项目包含:
- ✅ 完整源代码(包含所有注释)
- ✅ 6000+交通标志数据集(VOC格式)
- ✅ 预训练模型权重(可直接使用)
- ✅ PyQt5界面源文件(.ui文件可自行修改界面)
- ✅ 详细的使用文档和训练教程
- ✅ 万字项目报告(适合毕设参考)
获取方式:
项目获取链接:https://my.feishu.cn/wiki/A4dow4Nu6imJDNkgYMgcpjqEn10?from=from_copylink
#Python #深度学习 #YOLOv8 #计算机视觉 #PyTorch #OpenCV #毕设项目 #目标检测
更多推荐
所有评论(0)