一、💡前言:毕业设计的痛点与解决方案

痛点一:环境配置困难

做过深度学习项目的小伙伴肯定都遇到过这些坑:

  • PyTorch版本不兼容,CUDA环境配置报错
  • 依赖包版本冲突,pip install总失败
  • 代码在别人电脑上能跑,自己电脑上各种报错

痛点二:代码理解困难

  • GitHub上的开源项目代码复杂,注释不清晰
  • 不知道从哪个文件开始看起
  • 模型训练参数不知道如何调整

痛点三:数据集获取困难

  • 标注数据集耗时耗力
  • 找不到高质量的训练数据
  • 数据格式转换麻烦

二、✨ 本项目的优势

纯Python开发:基于PyTorch和PyQt5,代码结构清晰,注释详细

一键运行:提供完整的环境配置脚本,按步骤操作即可运行

美观的UI界面:使用PyQt5开发的图形界面,操作简单直观

完整数据集:包含6000+张交通标志图片,45种标志类别,VOC格式标准标注

多种检测模式:支持单张图片、视频文件、实时摄像头三种检测方式

预训练模型:提供训练好的模型权重,可直接使用


三、🎬 系统演示

在这里插入图片描述

系统主界面包含以下功能区域:

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

在这里插入图片描述

系统识别效果展示:

  • 识别准确率:经过6000+数据训练的模型,在测试集上mAP达到95%+
  • 检测速度:单张图片检测时间<0.1秒,实时视频检测FPS>30
  • 支持标志类别:45种常见交通标志,包括限速标志、禁止标志、指示标志、警告标志等

四、🛠️ 核心技术栈

技术用途
Python开发语言
PyTorch深度学习框架
PyQt5GUI界面开发
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:使用系统进行检测

图像检测:

  1. 点击右侧"图像"按钮(📷图标)
  2. 选择要检测的图片文件(支持.jpg、.png格式)
  3. 系统自动显示检测结果,左侧面板显示检测详情,下方表格显示所有检测到的标志

视频检测:

  1. 点击右侧"视频"按钮(🎬图标)
  2. 选择视频文件(支持.mp4、.avi格式)
  3. 系统自动逐帧检测并实时显示结果

摄像头检测:

  1. 确保摄像头已连接
  2. 点击右侧"摄像头"按钮(📹图标)
  3. 系统打开摄像头并实时检测,再次点击可关闭摄像头

调整参数:

  • 点击"模型文件"按钮可更换检测模型(支持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 #毕设项目 #目标检测

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐