随着计算机视觉技术的快速发展目标检测算法在智能交通系统中的应用越来越广泛。本文介绍了一个基于YOLOv10深度学习模型的中国交通标志识别系统该系统能够准确识别58种常见的中国交通标志为自动驾驶和智能交通管理提供技术支持。一、项目概述项目采用最新的YOLOv10目标检测算法针对中国交通标志的特点进行了专门训练。YOLOv10是YOLO系列的最新版本相比前代模型在检测精度和速度上都有显著提升。该模型采用端到端的实时目标检测架构能够在保证高精度的同时实现快速推理特别适合应用于实时交通场景。系统不仅支持图像检测还支持视频流的实时处理可以部署在车载设备或交通监控系统中。二、数据集构成本项目使用的数据集包含5998张交通标志图像涵盖了中国道路上常见的各类交通标志。数据集按照标准的机器学习实践进行了划分其中训练集包含5398张图像用于模型的学习和参数优化验证集包含600张图像用于训练过程中的模型评估和超参数调整。所有图像均为640×640像素的标准尺寸并配有YOLO格式的标注文件每个标注文件详细记录了图像中交通标志的类别和位置信息。数据集配置文件采用YAML格式定义了数据路径和类别信息核心配置代码如下# chinese_signs.yaml path: ../ # 数据集根目录项目根目录 train: data/images/train # 训练集图片路径 val: data/images/val # 验证集图片路径 nc: 58 # 类别数量 names: [限速5, 限速15, 限速30, 限速40, 限速50, 限速60, 限速70, 限速80, 禁止直行或左转, 禁止直行和右转, 禁止直行, 禁止左转, 禁止左转和右转, 禁止右转, 禁止超车, 禁止掉头, 禁止机动车通行, 禁止鸣笛, 解除限速40, 解除限速50, 允许直行和右转, 允许直行, 允许左转, 允许左转和右转, 允许右转, 靠道路左侧行驶, 靠道路右侧行驶, 环岛行驶, 允许机动车通行, 允许鸣笛, 允许非机动车行驶, 允许掉头, 左右绕行, 注意信号灯, 注意危险, 注意行人, 注意非机动车, 注意儿童, 向右急弯, 向左急弯, 下坡路, 上坡路, 慢行, T型交叉路口, T型交叉路口, 村庄, 反向弯路, 无人看守铁道路口, 小心施工, 连续急弯, 有人看守铁道路口, 事故多发地, 停车让行, 禁止通行, 禁止停车, 禁止驶入, 减速让行, 停车检查 ]2.1 交通标志类别系统能够识别58种不同类型的中国交通标志涵盖了限速标志、禁令标志、指示标志和警告标志四大类别。下表详细列出了所有可识别的交通标志类别及其编号类别编号标志名称类别编号标志名称类别编号标志名称0限速520允许直行和右转40下坡路1限速1521允许直行41上坡路2限速3022允许左转42慢行3限速4023允许左转和右转43T型交叉路口(1)4限速5024允许右转44T型交叉路口(2)5限速6025靠道路左侧行驶45村庄6限速7026靠道路右侧行驶46反向弯路7限速8027环岛行驶47无人看守铁道路口8禁止直行或左转28允许机动车通行48小心施工9禁止直行和右转29允许鸣笛49连续急弯10禁止直行30允许非机动车行驶50有人看守铁道路口11禁止左转31允许掉头51事故多发地12禁止左转和右转32左右绕行52停车让行13禁止右转33注意信号灯53禁止通行14禁止超车34注意危险54禁止停车15禁止掉头35注意行人55禁止驶入16禁止机动车通行36注意非机动车56减速让行17禁止鸣笛37注意儿童57停车检查18解除限速4038向右急弯19解除限速5038向左急弯表2-1交通标志类别三、模型架构与训练配置项目选用YOLOv10n作为基础模型架构这是YOLOv10系列中的轻量级版本在保证检测精度的同时具有较快的推理速度。模型总共包含385层网络结构参数量为272.9万个其中272.96万个参数参与梯度更新。网络采用了多个先进的模块设计包括C2f模块用于特征提取、SCDown模块用于下采样、PSA模块用于空间注意力机制以及SPPF模块用于多尺度特征融合。检测头采用v10Detect架构能够同时输出三个不同尺度的特征图分别对应64、128和256个通道以适应不同大小的交通标志检测需求。训练过程采用了精心设计的超参数配置。模型训练总共进行了100个轮次批次大小设置为8输入图像尺寸统一为640×640像素。优化器选用SGD随机梯度下降初始学习率设置为0.01最终学习率衰减至0.01动量参数为0.937权重衰减系数为0.0005。为了加速模型收敛训练过程采用了3个轮次的预热策略预热阶段的动量参数为0.8偏置项学习率为0.1。损失函数方面边界框损失权重为7.5分类损失权重为0.5分布焦点损失权重为1.5。数据增强策略包括HSV色彩空间变换、随机翻转、缩放变换和RandAugment自动增强同时采用了0.4的随机擦除技术来提高模型的鲁棒性。训练过程在NVIDIA GeForce RTX 5060 Ti显卡上进行显存容量为16GB使用CUDA 13.0加速计算。模型训练的核心代码如下from ultralytics import YOLOv10 import torch # 设置随机种子确保结果可复现 def set_seed(seed42): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.deterministic True set_seed(42) # 加载YOLOv10n模型架构 model YOLOv10(ultralytics/cfg/models/v10/yolov10n.yaml) # 配置训练参数 results model.train( datadata/chinese_signs.yaml, # 数据集配置文件 epochs100, # 训练轮数 imgsz640, # 图像尺寸 batch8, # 批次大小 device0, # GPU设备编号 optimizerSGD, # 优化器 lr00.01, # 初始学习率 lrf0.01, # 最终学习率 momentum0.937, # 动量参数 weight_decay0.0005, # 权重衰减 warmup_epochs3.0, # 预热轮数 box7.5, # 边界框损失权重 cls0.5, # 分类损失权重 dfl1.5, # 分布焦点损失权重 patience50, # 早停耐心值 saveTrue, # 保存检查点 seed42, # 随机种子 deterministicTrue # 确定性训练 )四、训练过程与性能分析模型训练过程展现出良好的收敛特性。在训练初期各项损失函数值较高第1轮训练时边界框损失为2.18分类损失高达5.92此时模型的mAP50指标仅为0.18%。随着训练的进行损失函数快速下降到第10轮时mAP50已经提升至81.84%显示出模型快速学习的能力。训练中期第20-60轮模型性能持续稳定提升各项指标逐步优化。到第50轮时模型在验证集上的表现已经相当优秀mAP50达到97.17%mAP50-95达到94.05%。训练后期第60-100轮模型进入精细调优阶段性能提升趋于平缓但仍在持续优化。最终训练完成后模型在验证集上取得了优异的性能表现。第100轮的最终结果显示模型的精确率达到98.73%召回率为94.13%mAP50指标达到98.25%mAP50-95指标达到96.07%。这些指标表明模型不仅能够准确识别交通标志而且具有很高的定位精度。训练损失方面边界框损失降至0.22分类损失降至0.13分布焦点损失降至0.86验证损失也保持在相似的低水平说明模型没有出现过拟合现象具有良好的泛化能力。图5-1P_curve.png精确率-置信度曲线该图展示了模型在不同置信度阈值下的精确率变化情况。蓝色粗线表示所有类别的平均精确率曲线在置信度为1.0时达到最大值1.0。灰色细线代表各个类别的单独曲线可以看出大部分类别在高置信度区间都能保持较高的精确率表明模型对交通标志的识别具有很高的可信度。图5-2confusion_matrix.png混淆矩阵该图以热力图的形式展示了模型对58种交通标志的分类结果。对角线上的深蓝色方块表示正确分类的样本数量颜色越深表示该类别的识别准确率越高。从图中可以看出绝大多数类别都集中在对角线上说明模型对各类交通标志的识别准确率都很高只有极少数类别之间存在轻微的混淆现象。图5-3PR_curve.png精确率-召回率曲线该图展示了精确率和召回率之间的权衡关系。蓝色曲线表示所有类别的平均PR曲线在召回率为0.5时达到mAP值0.982。灰色线条代表各个类别的单独PR曲线大部分曲线都保持在较高位置说明模型在保持高精确率的同时也能维持高召回率整体性能表现优异。图5-4F1_curve.pngF1分数-置信度曲线该图展示了F1分数随置信度阈值变化的趋势。F1分数是精确率和召回率的调和平均值能够综合反映模型性能。蓝色粗线显示所有类别的平均F1曲线在置信度0.845时达到最大值0.94。灰色细线代表各个类别的F1曲线可以看出不同类别的最优置信度阈值有所差异但整体都维持在较高水平。图5-5results.png训练过程指标变化图该图包含10个子图全面展示了训练过程中各项指标的变化趋势。左上角的box_om、cls_om、dfl_om分别显示训练集上边界框损失、分类损失和分布焦点损失的下降曲线都呈现出快速下降后趋于平稳的特征。右上角的box_oo、cls_oo、dfl_oo显示验证集上对应损失的变化与训练集趋势一致。下方的recall、mAP50、mAP50-95和precision曲线展示了模型性能指标的提升过程都呈现出快速上升后趋于稳定的良好收敛特性。图5-6R_curve.png召回率-置信度曲线该图展示了模型在不同置信度阈值下的召回率表现。蓝色粗线表示所有类别的平均召回率曲线在置信度为0时达到最大值0.99。灰色细线代表各个类别的单独曲线可以看出随着置信度阈值的提高召回率逐渐下降这是目标检测模型的正常特性。在实际应用中需要根据具体需求选择合适的置信度阈值来平衡精确率和召回率。图5-7confusion_matrix_normalized.png归一化混淆矩阵该图是混淆矩阵的归一化版本每一行的数值总和为1更直观地展示了各类别的分类准确率。对角线上的深蓝色表示正确分类的比例可以看出几乎所有类别的正确分类率都接近100%只有极少数类别存在轻微的误分类情况。这进一步证明了模型对中国交通标志识别的高准确性和可靠性。五、系统实现与应用为了便于模型的实际应用和演示本项目开发了两套用户交互界面。第一套是基于Gradio框架的Web应用界面用户可以通过浏览器访问系统上传交通标志图像或视频进行实时检测。系统支持多种YOLOv10模型规格的选择包括yolov10n、yolov10s、yolov10m、yolov10b、yolov10l和yolov10x以及本项目训练的中国交通标志专用模型。用户可以根据实际需求调整图像尺寸320-1280像素和置信度阈值0.0-1.0以在检测速度和准确率之间取得最佳平衡。Web应用的核心实现代码如下import gradio as gr from ultralytics import YOLOv10 def yolov10_inference(image, model_id, image_size, conf_threshold): YOLOv10推理函数 参数: image: 输入图像 model_id: 模型路径 image_size: 图像尺寸 conf_threshold: 置信度阈值 返回: annotated_image: 标注后的图像 # 加载模型 if model_id.startswith(custom/): model_path model_id.replace(custom/, ) model YOLOv10(model_path) else: model YOLOv10.from_pretrained(fjameslahm/{model_id}) # 执行推理 results model.predict( sourceimage, imgszimage_size, confconf_threshold ) # 绘制检测结果 annotated_image results[0].plot() return annotated_image[:, :, ::-1] # 创建Gradio界面 with gr.Blocks() as demo: gr.HTML(h1 styletext-align: center交通标志识别系统/h1) with gr.Row(): with gr.Column(): image gr.Image(typepil, label上传图片) model_id gr.Dropdown( label选择模型, choices[yolov10n, yolov10s, yolov10m, custom/runs/train/best.pt], valueyolov10m ) image_size gr.Slider( label图像尺寸, minimum320, maximum1280, step32, value640 ) conf_threshold gr.Slider( label置信度阈值, minimum0.0, maximum1.0, step0.05, value0.25 ) detect_btn gr.Button(开始检测) with gr.Column(): output_image gr.Image(typenumpy, label检测结果) detect_btn.click( fnyolov10_inference, inputs[image, model_id, image_size, conf_threshold], outputsoutput_image ) demo.launch()图6-1交通标志识别系统PyQt5桌面应用界面该图展示了基于PyQt5开发的交通标志识别系统桌面应用程序的主界面。界面采用深蓝色科技风格设计整体布局清晰合理分为左侧控制面板和右侧显示区域两大部分。左侧控制面板从上到下依次包含文件操作区、视频流区、运行控制区、置信度调节区、导出数据区、批量浏览区、类别显示区和位置信息区等功能模块。文件操作区提供了四个主要按钮选择图片文件、选择视频文件、选择图片文件夹和打开摄像头支持单张图片检测、视频文件检测、批量图片检测和实时摄像头检测四种工作模式。视频流区显示当前加载的模型信息包括模型类型、类别数量、使用设备GPU或CPU和加载状态。运行控制区包含开始运行和停止检测两个按钮用于控制检测过程的启动和终止。置信度调节区提供了一个滑动条允许用户实时调整检测的置信度阈值默认值设置为0.15可在0.01到1.00之间灵活调节。导出数据区支持将检测结果导出为CSV或XLSX格式的电子表格文件便于后续的数据分析和统计。批量浏览区在进行批量检测时显示当前图片的序号和总数并提供上一张和下一张按钮用于浏览所有检测结果。类别显示区实时显示当前检测到的交通标志类别名称位置信息区则显示检测框的精确坐标xmin、ymin、xmax、ymax。右侧显示区域分为上下两部分上部采用左右对比的方式同时展示原始图片和检测结果图片便于用户直观比较检测效果每个显示框都有清晰的标题标识。下部是检测结果表格包含序号、图片名称、录入时间、识别结果、目标数目、精度、用时和保存路径等八个字段详细记录了每次检测的完整信息。表格支持点击行查看对应的检测结果实现了检测历史的快速回溯和查看。整个界面的背景使用了半透明的深蓝色渐变效果各个功能模块采用圆角矩形边框和淡蓝色高光边框设计按钮使用青色系配色并具有悬停和按下的视觉反馈效果整体呈现出现代化的科技感和良好的用户体验。该桌面应用程序完全基于Python的PyQt5框架开发集成了YOLOv10模型的完整调用流程支持CPU和GPU两种运行模式的自动检测和切换具有多线程视频处理能力能够实现实时检测而不阻塞用户界面同时提供了完善的检测结果管理和数据导出功能是一个功能完整、性能优异的交通标志识别应用系统。PyQt5桌面应用的核心实现代码如下from PyQt5.QtWidgets import QMainWindow, QApplication from PyQt5.QtCore import QThread, pyqtSignal from ultralytics import YOLO import cv2 class VideoThread(QThread): 视频检测线程 change_pixmap_signal pyqtSignal(np.ndarray) def __init__(self): super().__init__() self.model None self.running False self.conf_threshold 0.15 def run(self): 线程主循环 cap cv2.VideoCapture(self.source) while self.running: ret, frame cap.read() if not ret: break # 执行检测 results self.model.predict( frame, confself.conf_threshold, imgsz640, verboseFalse ) # 绘制结果 annotated_frame results[0].plot() self.change_pixmap_signal.emit(annotated_frame) cap.release() class MainWindow(QMainWindow): 主窗口类 def __init__(self): super().__init__() self.model None self.video_thread None self.init_ui() self.load_model() def load_model(self): 加载YOLO模型 model_path runs/train/best.pt self.model YOLO(model_path) # 检测设备 import torch self.device cuda:0 if torch.cuda.is_available() else cpu print(f使用设备: {self.device}) def detect_image(self): 图片检测 file_path, _ QFileDialog.getOpenFileName( self, 选择图片, , 图片文件 (*.jpg *.png) ) if file_path: # 读取图片 image cv2.imread(file_path) # 执行检测 results self.model.predict( image, confself.conf_threshold, deviceself.device ) # 显示结果 annotated_image results[0].plot() self.display_image(annotated_image) # 提取检测信息 for box in results[0].boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) cls_name self.model.names[cls_id] x1, y1, x2, y2 box.xyxy[0].tolist() # 添加到结果表格 self.add_to_table(cls_name, conf, x1, y1, x2, y2) def start_camera(self): 启动摄像头检测 self.video_thread VideoThread() self.video_thread.model self.model self.video_thread.source 0 # 摄像头 self.video_thread.conf_threshold self.conf_threshold self.video_thread.change_pixmap_signal.connect(self.update_image) self.video_thread.running True self.video_thread.start() if __name__ __main__: app QApplication(sys.argv) window MainWindow() window.show() sys.exit(app.exec_())该系统具有广泛的应用前景。在自动驾驶领域系统可以集成到车载计算平台中实时识别道路上的交通标志为车辆的决策系统提供重要的环境信息。在智能交通管理方面系统可以部署在道路监控摄像头中自动统计和分析交通标志的分布情况辅助交通规划和管理。在驾驶辅助系统中系统可以提醒驾驶员注意前方的交通标志提高行车安全性。此外系统还可以用于交通标志的自动化巡检和维护及时发现损坏或遮挡的标志。桌面应用程序特别适合交通管理部门、研究机构和教育培训场景使用提供了离线运行、数据隐私保护和批量处理等优势。六、总结成功实现了基于YOLOv10的中国交通标志识别系统在包含58个类别的数据集上取得了优异的性能表现。模型的mAP50达到98.25%mAP50-95达到96.07%精确率和召回率分别达到98.73%和94.13%充分证明了YOLOv10算法在交通标志识别任务中的有效性。系统不仅具有高精度的识别能力还具备实时处理的速度优势能够满足实际应用的需求。七、视频演示交通标志检测识别
阅读完成 · 觉得有帮助?