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 训练流程
- 数据加载:使用DataLoader加载训练和验证数据
- 前向传播:模型对输入图像进行特征提取和预测
- 损失计算:计算边界框损失、分类损失和DFL损失
- 反向传播:计算梯度并更新模型参数
- 验证评估:在验证集上评估模型性能
- 模型保存:保存最佳模型和检查点
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 验证流程
- 加载训练好的最佳模型
- 在验证集上运行推理
- 计算各种性能指标
- 生成可视化结果(混淆矩阵、PR曲线等)
- 保存验证结果和报告
2.4 模型导出阶段
2.4.1 导出格式
- **PyTorch格式(.pt)**:原始训练格式,用于继续训练
- **ONNX格式(.onnx)**:跨平台部署格式
- **TensorRT格式(.engine)**:GPU加速推理格式
2.4.2 导出流程
- 加载训练好的模型
- 转换为目标格式
- 验证导出模型的正确性
- 保存到指定目录
三、数据集详解
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 主要优化方向
- 漏检问题修复:降低置信度阈值,优化损失函数权重
- 小目标检测优化:集成注意力机制和特征融合
- 数据增强平衡:保持特征完整性的同时增加多样性
- 训练策略优化:稳定学习率,充分预热
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 功能使用
- 模型加载:点击”重新加载模型”或”选择模型文件”
- 摄像头检测:点击”📷 摄像头检测”
- 图片检测:点击”🖼️ 图片检测”,选择图片文件
- 视频检测:点击”🎬 视频检测”,选择视频文件
- 参数调节:使用置信度滑块调节检测阈值
- 查看结果:在”检测结果”区域查看详细信息
- 统计分析:切换到”📊 数据分析”标签页查看统计
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提高效率
- 队列管理:使用队列管理任务调度
Yolo11交通标志检测系统