Yolo11交通标志检测系统

关于Yolov11模型的交通标志检测项目

一、项目概述

1.1 项目简介

本项目是一个基于YOLOv11的智能交通标志检测系统,支持实时检测、图片检测和视频检测三种模式。项目采用PyQt5构建现代化GUI界面,集成了原始训练脚本和优化训练脚本,专门针对小目标检测进行了深度优化。

1.2 主要特性

  • 多模式检测:支持摄像头实时检测、图片批量检测、视频流检测
  • 现代化UI:采用渐变色彩和圆角设计,提供良好的用户体验
  • 智能优化:集成注意力机制和特征融合,提升小目标检测能力
  • 完整流程:包含数据预处理、模型训练、验证、导出和部署的完整流程
  • 统计分析:提供详细的检测统计和历史记录功能

1.3 技术栈

  • 深度学习框架:PyTorch + Ultralytics YOLOv11

  • GUI框架:PyQt5

  • 计算机视觉:OpenCV

  • 数据处理:NumPy, PIL

  • 配置管理:YAML, JSON

二、YOLO训练全流程详解

2.1 数据准备阶段

2.1.1 数据集结构

data/
├── train/
│   ├── images/          # 训练图片 (16,356张)
│   └── labels/          # 训练标签 (16,356个)
├── test/
│   ├── images/          # 测试图片 (1,500张)
│   └── labels/          # 测试标签 (1,500个)
└── dataset.yaml         # 数据集配置文件

2.1.2 标签格式

采用YOLO格式的标签文件,每个标签文件包含:

  • 类别ID (0: mandatory, 1: prohibitory, 2: warning)
  • 边界框坐标 (归一化的中心点坐标和宽高)
  • 格式:class_id center_x center_y width height

2.1.3 数据集配置

path: /path/to/data
train: train/images
val: test/images
test: test/images
nc: 3
names: ['mandatory', 'prohibitory', 'warning']

2.2 模型训练阶段

2.2.1 训练参数配置

# 基础训练参数
epochs: 10              # 训练轮数
batch_size: 16          # 批次大小
img_size: 640           # 输入图像尺寸
device: '0'             # 训练设备 (GPU/CPU)
workers: 4              # 数据加载工作进程数

# 学习率配置
lr0: 0.01              # 初始学习率
lrf: 0.01              # 最终学习率
momentum: 0.937         # 动量
weight_decay: 0.0005    # 权重衰减
warmup_epochs: 3.0      # 预热轮数

# 损失函数权重
box: 7.5               # 边界框损失权重
cls: 0.5               # 分类损失权重
dfl: 1.5               # DFL损失权重

# 数据增强参数
hsv_h: 0.015           # HSV色调增强
hsv_s: 0.7             # HSV饱和度增强
hsv_v: 0.4             # HSV明度增强
degrees: 0.0           # 旋转角度
translate: 0.1         # 平移
scale: 0.5             # 缩放
fliplr: 0.5            # 左右翻转
mosaic: 1.0            # 马赛克增强

2.2.2 训练流程

  1. 数据加载:使用DataLoader加载训练和验证数据
  2. 前向传播:模型对输入图像进行特征提取和预测
  3. 损失计算:计算边界框损失、分类损失和DFL损失
  4. 反向传播:计算梯度并更新模型参数
  5. 验证评估:在验证集上评估模型性能
  6. 模型保存:保存最佳模型和检查点

2.2.3 训练监控

  • 损失曲线:监控训练和验证损失的变化
  • 性能指标:mAP50、mAP50-95、精确率、召回率
  • 混淆矩阵:分析各类别的检测性能
  • 学习率调度:余弦学习率调度策略

2.3 模型验证阶段

2.3.1 验证指标

  • mAP50:IoU阈值为0.5时的平均精度
  • mAP50-95:IoU阈值从0.5到0.95的平均精度
  • **精确率(Precision)**:正确检测的阳性样本比例
  • **召回率(Recall)**:正确检测的真实阳性样本比例
  • F1分数:精确率和召回率的调和平均数

2.3.2 验证流程

  1. 加载训练好的最佳模型
  2. 在验证集上运行推理
  3. 计算各种性能指标
  4. 生成可视化结果(混淆矩阵、PR曲线等)
  5. 保存验证结果和报告

2.4 模型导出阶段

2.4.1 导出格式

  • **PyTorch格式(.pt)**:原始训练格式,用于继续训练
  • **ONNX格式(.onnx)**:跨平台部署格式
  • **TensorRT格式(.engine)**:GPU加速推理格式

2.4.2 导出流程

  1. 加载训练好的模型
  2. 转换为目标格式
  3. 验证导出模型的正确性
  4. 保存到指定目录

三、数据集详解

3.1 数据集来源

本项目使用TSRD (Traffic Sign Recognition Dataset) 数据集,包含:

  • 训练集:16,356张图片,覆盖各种交通标志
  • 测试集:1,500张图片,用于模型评估
  • 类别:3类交通标志(指示、禁令、警告)

3.2 数据预处理

3.2.1 图像预处理

  • 尺寸调整:统一调整为640x640像素
  • 归一化:像素值归一化到[0,1]范围
  • 数据增强:旋转、翻转、缩放、颜色变换等

3.2.2 标签处理

  • 格式转换:将边界框坐标转换为YOLO格式
  • 类别映射:将原始类别映射到0,1,2
  • 坐标归一化:将像素坐标转换为相对坐标

3.3 数据增强策略

3.3.1 几何变换

  • 旋转:随机旋转±15度
  • 翻转:水平翻转,概率0.5
  • 缩放:随机缩放0.5-1.5倍
  • 平移:随机平移±10%

3.3.2 颜色变换

  • HSV调整:色调±1.5%,饱和度±70%,明度±40%
  • 亮度对比度:随机调整亮度和对比度
  • 噪声添加:添加高斯噪声

3.3.3 高级增强

  • 马赛克增强:将4张图片拼接成1张
  • 混合增强:将两张图片混合
  • Copy-Paste:复制粘贴增强

四、优化代码详解

4.1 优化策略概述

4.1.1 主要优化方向

  1. 漏检问题修复:降低置信度阈值,优化损失函数权重
  2. 小目标检测优化:集成注意力机制和特征融合
  3. 数据增强平衡:保持特征完整性的同时增加多样性
  4. 训练策略优化:稳定学习率,充分预热

4.1.2 核心改进

  • 置信度阈值:从0.5降低到0.1,减少漏检
  • IoU阈值:从0.6降低到0.5,提高召回率
  • 分类损失权重:从0.5提高到1.5,减少漏检
  • 学习率策略:降低初始学习率,增加预热轮数

4.2 注意力机制集成

4.2.1 SE注意力机制

class SEAttention(nn.Module):
    """Squeeze-and-Excitation注意力机制"""
    def __init__(self, channel, reduction=16):
        super(SEAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

4.2.2 CBAM注意力机制

class CBAM(nn.Module):
    """Convolutional Block Attention Module"""
    def __init__(self, in_channels, reduction=16, kernel_size=7):
        super(CBAM, self).__init__()
        self.channel_attention = ChannelAttention(in_channels, reduction)
        self.spatial_attention = SpatialAttention(kernel_size)

4.2.3 多尺度特征融合

class MultiScaleFeatureFusion(nn.Module):
    """多尺度特征融合模块"""
    def __init__(self, in_channels_list, out_channels=256):
        super(MultiScaleFeatureFusion, self).__init__()
        # 特征金字塔网络
        self.lateral_convs = nn.ModuleList()
        self.fpn_convs = nn.ModuleList()
        # 注意力机制用于特征融合
        self.attention = CBAM(out_channels, reduction=16)

4.3 优化训练参数

4.3.1 检测参数优化

# 修复漏检的检测参数
'conf': 0.1,           # 降低置信度阈值,减少漏检
'iou': 0.5,            # 降低IoU阈值,提高召回率
'max_det': 300,        # 适中的最大检测数
'multi_scale': True,   # 多尺度训练
'dropout': 0.0,        # 移除dropout,避免特征丢失

4.3.2 数据增强优化

# 平衡的数据增强 - 保持特征的同时增加多样性
'hsv_h': 0.015,        # 适中的色调变化
'hsv_s': 0.3,          # 适中的饱和度变化,保持标志颜色特征
'hsv_v': 0.3,          # 适中的明度变化
'degrees': 3.0,        # 适中的旋转角度
'translate': 0.15,     # 适中的平移
'scale': 0.3,          # 适中的缩放范围,保持标志形状
'mosaic': 0.8,         # 适中的马赛克增强
'copy_paste': 0.2,     # 适中的Copy-Paste增强

4.3.3 学习率策略优化

# 保守的学习率策略
'lr0': 0.005,          # 降低初始学习率,稳定训练
'lrf': 0.005,          # 降低最终学习率
'warmup_epochs': 5.0,  # 增加预热轮数
'cos_lr': True,        # 余弦学习率调度
'close_mosaic': 5,     # 最后5个epoch关闭马赛克

4.4 优化效果对比

4.4.1 性能提升

  • mAP50:从0.557提升到0.764 (+37%)
  • 召回率:从70%提升到85% (+15%)
  • 漏检率:从40-50%降低到20-30% (-50%)
  • 误报率:从30-40%降低到15-25% (-40%)

4.4.2 训练稳定性

  • 损失收敛:更稳定的损失曲线
  • 梯度稳定:避免梯度爆炸和消失
  • 学习率调度:平滑的学习率变化

五、GUI界面详解

5.1 界面设计

5.1.1 整体布局

  • 左侧控制面板:模型管理、检测控制、结果显示
  • 右侧显示区域:实时检测显示、统计分析
  • 分割器设计:可调整左右面板比例

5.1.2 现代化UI特性

  • 渐变色彩:采用蓝紫色渐变背景
  • 圆角设计:所有组件采用圆角边框
  • 阴影效果:添加立体阴影效果
  • 悬停效果:按钮悬停时的视觉反馈

5.2 功能模块

5.2.1 模型管理

  • 模型加载:自动加载最佳模型
  • 模型选择:支持选择不同模型文件
  • 状态显示:实时显示模型加载状态

5.2.2 检测控制

  • 置信度调节:滑块调节置信度阈值
  • 检测模式:摄像头、图片、视频三种模式
  • 实时控制:开始/停止检测按钮

5.2.3 结果显示

  • 实时显示:大尺寸图像显示区域
  • 检测结果:详细的检测信息展示
  • 历史记录:检测历史列表
  • 统计分析:各类别检测统计

5.3 多线程设计

5.3.1 检测线程

class DetectionThread(QThread):
    """检测线程 - 避免UI阻塞"""
    detection_result = pyqtSignal(dict)  # 检测结果信号
    frame_ready = pyqtSignal(np.ndarray)  # 帧就绪信号
    finished = pyqtSignal()  # 完成信号

5.3.2 信号槽机制

  • 异步通信:使用Qt信号槽机制
  • 数据传递:检测结果和图像数据传递
  • 状态同步:UI状态与检测状态同步

5.4 图像处理优化

5.4.1 显示优化

def update_display(self, frame):
    """更新显示 - 优化图像显示大小和清晰度"""
    # 转换BGR到RGB
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    
    # 优化显示尺寸 - 让图像显示更大
    display_width = 1200   # 增加显示宽度
    display_height = 900   # 增加显示高度
    
    # 高质量缩放
    scaled_pixmap = pixmap.scaled(
        new_width, new_height,
        Qt.KeepAspectRatio, 
        Qt.SmoothTransformation
    )

5.4.2 检测覆盖层

def _add_detection_overlay(self, frame):
    """添加检测信息覆盖层"""
    if hasattr(self, 'last_detections') and self.last_detections:
        # 在图像上添加检测统计信息
        overlay_text = f"检测到 {len(self.last_detections)} 个交通标志"
        cv2.putText(frame, overlay_text, (10, 30), 
                   cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

六、代码结构详解

6.1 项目目录结构

yolo-v11-traffic-sign-main/
├── backend/                    # 后端代码
│   ├── config.py              # 配置文件
│   ├── detect_yolov11.py      # 检测器
│   ├── train_yolov11.py       # 原始训练脚本
│   └── detect_yolov11_enhanced.py  # 增强检测器
├── data/                      # 数据集
│   ├── train/                 # 训练数据
│   ├── test/                  # 测试数据
│   └── dataset.yaml           # 数据集配置
├── models/                    # 模型文件
│   ├── best_yolov11.pt        # 原始最佳模型
│   └── best_yolov11_optimized.pt  # 优化模型
├── results/                   # 训练结果
├── frontend/                  # 前端代码
├── gui_traffic_detector.py    # GUI主程序
├── train_yolov11_optimized.py # 优化训练脚本
└── requirements.txt           # 依赖包

6.2 核心类设计

6.2.1 YOLOv11Trainer类

class YOLOv11Trainer:
    """原始训练器"""
    def __init__(self, config)          # 初始化
    def prepare_dataset(self)           # 数据准备
    def train_model(self)               # 模型训练
    def validate_model(self)            # 模型验证
    def export_model(self)              # 模型导出

6.2.2 YOLOv11OptimizedTrainer类

class YOLOv11OptimizedTrainer:
    """优化训练器"""
    def __init__(self, config)                    # 初始化
    def prepare_dataset(self)                     # 数据准备
    def _apply_attention_mechanisms(self)         # 应用注意力机制
    def train_model(self)                         # 优化训练
    def validate_model(self)                      # 模型验证
    def export_model(self)                        # 模型导出

6.2.3 TrafficSignDetectorGUI类

class TrafficSignDetectorGUI(QMainWindow):
    """GUI主窗口"""
    def __init__(self)                           # 初始化
    def init_ui(self)                            # 初始化UI
    def create_control_panel(self)               # 创建控制面板
    def create_display_area(self)                # 创建显示区域
    def load_model(self)                         # 加载模型
    def start_camera_detection(self)             # 开始摄像头检测
    def update_display(self, frame)              # 更新显示
    def update_detection_result(self, result)    # 更新检测结果

6.3 关键函数详解

6.3.1 数据准备函数

def prepare_dataset(self):
    """准备数据集,直接使用原始数据"""
    # 检查数据是否存在
    # 创建数据集配置文件
    # 建立标签文件链接

6.3.2 训练函数

def train_model(self):
    """训练YOLOv11模型"""
    # 初始化模型
    # 配置训练参数
    # 执行训练
    # 保存最佳模型

6.3.3 检测函数

def detect_image(self, image, filename=None):
    """检测单张图片"""
    # 图像预处理
    # 模型推理
    # 后处理
    # 绘制检测结果

七、使用指南

7.1 环境配置

7.1.1 系统要求

  • 操作系统:Windows 10/11, Linux, macOS
  • Python版本:Python 3.8+
  • GPU:NVIDIA GPU (推荐,用于加速训练)
  • 内存:8GB+ RAM
  • 存储:10GB+ 可用空间

7.1.2 依赖安装

# 安装基础依赖
pip install -r requirements.txt

# 安装PyTorch (GPU版本)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# 安装Ultralytics
pip install ultralytics

# 安装PyQt5
pip install PyQt5

7.2 训练使用

7.2.1 原始训练

# 基础训练
python backend/train_yolov11.py --epochs 10 --batch-size 16 --img-size 640

# 自定义参数训练
python backend/train_yolov11.py --epochs 20 --batch-size 8 --img-size 1280 --device 0

7.2.2 优化训练

# 优化训练
python train_yolov11_optimized.py --epochs 10 --batch-size 8 --img-size 640

# 高分辨率训练
python train_yolov11_optimized.py --epochs 15 --batch-size 4 --img-size 1280

7.3 GUI使用

7.3.1 启动GUI

# 启动图形界面
python gui_traffic_detector.py

7.3.2 功能使用

  1. 模型加载:点击”重新加载模型”或”选择模型文件”
  2. 摄像头检测:点击”📷 摄像头检测”
  3. 图片检测:点击”🖼️ 图片检测”,选择图片文件
  4. 视频检测:点击”🎬 视频检测”,选择视频文件
  5. 参数调节:使用置信度滑块调节检测阈值
  6. 查看结果:在”检测结果”区域查看详细信息
  7. 统计分析:切换到”📊 数据分析”标签页查看统计

7.4 模型部署

7.4.1 模型导出

# 导出ONNX格式
model.export(format='onnx', imgsz=640)

# 导出TensorRT格式
model.export(format='engine', imgsz=640)

7.4.2 推理使用

# 加载模型
detector = YOLOv11Detector('best_yolov11.pt')

# 检测图片
image = cv2.imread('test.jpg')
result, detections = detector.detect_image(image)

八、性能优化建议

8.1 训练优化

8.1.1 硬件优化

  • GPU选择:使用NVIDIA RTX 3080/4080或更高
  • 内存配置:至少16GB RAM,推荐32GB
  • 存储优化:使用SSD存储数据集

8.1.2 参数调优

  • 批次大小:根据GPU内存调整,建议8-16
  • 学习率:使用学习率查找器找到最优值
  • 数据增强:根据数据集特点调整增强参数

8.2 推理优化

8.2.1 模型优化

  • 模型量化:使用INT8量化减少模型大小
  • 模型剪枝:移除不重要的连接和通道
  • 知识蒸馏:使用大模型指导小模型训练

8.2.2 推理加速

  • TensorRT优化:使用TensorRT进行GPU加速
  • ONNX Runtime:使用ONNX Runtime进行CPU推理
  • 批处理:批量处理多张图片

8.3 系统优化

8.3.1 内存优化

  • 数据加载:使用多进程数据加载
  • 缓存策略:缓存常用数据到内存
  • 垃圾回收:定期清理无用对象

8.3.2 并发优化

  • 多线程:使用多线程处理不同任务
  • 异步处理:使用异步I/O提高效率
  • 队列管理:使用队列管理任务调度
作者

HuangZhongqi

发布于

2025-09-10

更新于

2025-10-05

许可协议

评论