随着计算机视觉技术的快速发展,目标检测算法在智能交通系统中的应用越来越广泛。本文介绍了一个基于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种不同类型的中国交通标志,涵盖了限速标志、禁令标志、指示标志和警告标志四大类别。下表详细列出了所有可识别的交通标志类别及其编号:

表3-1:交通标志类别

类别编号 标志名称 类别编号 标志名称 类别编号 标志名称
0 限速5 20 允许直行和右转 40 下坡路
1 限速15 21 允许直行 41 上坡路
2 限速30 22 允许左转 42 慢行
3 限速40 23 允许左转和右转 43 T型交叉路口(1)
4 限速50 24 允许右转 44 T型交叉路口(2)
5 限速60 25 靠道路左侧行驶 45 村庄
6 限速70 26 靠道路右侧行驶 46 反向弯路
7 限速80 27 环岛行驶 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 解除限速40 38 向右急弯
19 解除限速50 38 向左急弯

三、模型架构与训练配置


  项目选用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(seed=42):
    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(
    data='data/chinese_signs.yaml',  # 数据集配置文件
    epochs=100,                       # 训练轮数
    imgsz=640,                        # 图像尺寸
    batch=8,                          # 批次大小
    device=0,                         # GPU设备编号
    optimizer='SGD',                  # 优化器
    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,                          # 分布焦点损失权重
    patience=50,                      # 早停耐心值
    save=True,                        # 保存检查点
    seed=42,                          # 随机种子
    deterministic=True                # 确定性训练
)

四、训练过程与性能分析


  模型训练过程展现出良好的收敛特性。在训练初期,各项损失函数值较高,第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-1:P_curve.png(精确率-置信度曲线)

  该图展示了模型在不同置信度阈值下的精确率变化情况。蓝色粗线表示所有类别的平均精确率曲线,在置信度为1.0时达到最大值1.0。灰色细线代表各个类别的单独曲线,可以看出大部分类别在高置信度区间都能保持较高的精确率,表明模型对交通标志的识别具有很高的可信度。

图5-2:confusion_matrix.png(混淆矩阵)

  该图以热力图的形式展示了模型对58种交通标志的分类结果。对角线上的深蓝色方块表示正确分类的样本数量,颜色越深表示该类别的识别准确率越高。从图中可以看出,绝大多数类别都集中在对角线上,说明模型对各类交通标志的识别准确率都很高,只有极少数类别之间存在轻微的混淆现象。

图5-3:PR_curve.png(精确率-召回率曲线)

  该图展示了精确率和召回率之间的权衡关系。蓝色曲线表示所有类别的平均PR曲线,在召回率为0.5时达到mAP值0.982。灰色线条代表各个类别的单独PR曲线,大部分曲线都保持在较高位置,说明模型在保持高精确率的同时也能维持高召回率,整体性能表现优异。

图5-4:F1_curve.png(F1分数-置信度曲线)

  该图展示了F1分数随置信度阈值变化的趋势。F1分数是精确率和召回率的调和平均值,能够综合反映模型性能。蓝色粗线显示所有类别的平均F1曲线在置信度0.845时达到最大值0.94。灰色细线代表各个类别的F1曲线,可以看出不同类别的最优置信度阈值有所差异,但整体都维持在较高水平。

图5-5:results.png(训练过程指标变化图)

  该图包含10个子图,全面展示了训练过程中各项指标的变化趋势。左上角的box_om、cls_om、dfl_om分别显示训练集上边界框损失、分类损失和分布焦点损失的下降曲线,都呈现出快速下降后趋于平稳的特征。右上角的box_oo、cls_oo、dfl_oo显示验证集上对应损失的变化,与训练集趋势一致。下方的recall、mAP50、mAP50-95和precision曲线展示了模型性能指标的提升过程,都呈现出快速上升后趋于稳定的良好收敛特性。

图5-6:R_curve.png(召回率-置信度曲线)

  该图展示了模型在不同置信度阈值下的召回率表现。蓝色粗线表示所有类别的平均召回率曲线,在置信度为0时达到最大值0.99。灰色细线代表各个类别的单独曲线,可以看出随着置信度阈值的提高,召回率逐渐下降,这是目标检测模型的正常特性。在实际应用中需要根据具体需求选择合适的置信度阈值来平衡精确率和召回率。

图5-7:confusion_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(f'jameslahm/{model_id}')
    
    # 执行推理
    results = model.predict(
        source=image, 
        imgsz=image_size, 
        conf=conf_threshold
    )
    
    # 绘制检测结果
    annotated_image = results[0].plot()
    return annotated_image[:, :, ::-1]

# 创建Gradio界面
with gr.Blocks() as demo:
    gr.HTML("<h1 style='text-align: center'>交通标志识别系统</h1>")
    
    with gr.Row():
        with gr.Column():
            image = gr.Image(type="pil", label="上传图片")
            model_id = gr.Dropdown(
                label="选择模型",
                choices=["yolov10n", "yolov10s", "yolov10m",
                        "custom/runs/train/best.pt"],
                value="yolov10m"
            )
            image_size = gr.Slider(
                label="图像尺寸", 
                minimum=320, 
                maximum=1280, 
                step=32, 
                value=640
            )
            conf_threshold = gr.Slider(
                label="置信度阈值",
                minimum=0.0,
                maximum=1.0,
                step=0.05,
                value=0.25
            )
            detect_btn = gr.Button("开始检测")
        
        with gr.Column():
            output_image = gr.Image(type="numpy", label="检测结果")
    
    detect_btn.click(
        fn=yolov10_inference,
        inputs=[image, model_id, image_size, conf_threshold],
        outputs=output_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,
                conf=self.conf_threshold,
                imgsz=640,
                verbose=False
            )
            
            # 绘制结果
            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,
                conf=self.conf_threshold,
                device=self.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算法在交通标志识别任务中的有效性。系统不仅具有高精度的识别能力,还具备实时处理的速度优势,能够满足实际应用的需求。

七、视频演示

交通标志检测识别

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐