博客 / 詳情

返回

基於深度學習的交通標誌檢測系統演示與介紹(YOLOv12/v11/v8/v5模型+Pyqt5界面+訓練代碼+數據集)

視頻演示

基於深度學習的交通標誌檢測系統

1. 前言​

大家好,歡迎來到 Coding茶水間

在智能交通與自動駕駛快速發展的當下,準確、實時地識別道路上的交通標識,已成為保障行車安全與提升駕駛輔助系統性能的關鍵環節。然而,現實場景中交通標識種類繁多、形態各異,且受光照變化、遮擋、天氣等因素影響,傳統圖像處理方法往往難以兼顧檢測速度與精度;即便引入深度學習,不同模型在複雜環境下的魯棒性與可部署性也存在差異。此外,很多現有系統功能單一,僅支持圖片或視頻檢測,缺乏批量處理、實時攝像頭接入、結果可視化與語音播報等一體化能力,也難以滿足實際開發與測試的多場景需求。

針對這一現狀,我們團隊基於 YOLO 系列算法,研發了一套 交通標識檢測系統,能夠一次性識別多達 55 種常見交通標識,覆蓋禁令、警告、指示等多種類型,兼容國內外通用標識。系統不僅提供直觀的圖形化操作界面,支持圖片、視頻、文件夾批量及實時攝像頭檢測,還具備模型切換、置信度與 IoU 參數調節、檢測耗時與目標統計展示、類別過濾、檢測結果導出與語音播報等功能,並配套登錄管理、腳本化調用以及完整的模型訓練流程,幫助開發者快速驗證與迭代算法。

今天,我們就帶大家全面瞭解這套系統的界面設計、核心功能與實際演示效果,看看它如何在多種場景下穩定、高效地完成交通標識檢測任務。

業務介紹圖

2. 項目演示

2.1 用户登錄界面

登錄界面佈局簡潔清晰,左側展示系統主題,用户需輸入用户名、密碼及驗證碼完成身份驗證後登錄系統。

1

2.2 新用户註冊

註冊時可自定義用户名與密碼,支持上傳個人頭像;如未上傳,系統將自動使用默認頭像完成賬號創建。

ScreenShot_2025-12-27_172445_804

2.3 主界面佈局

主界面採用三欄結構,左側為功能操作區,中間用於展示檢測畫面,右側呈現目標詳細信息,佈局合理,交互流暢。

2

2.4 個人信息管理

用户可在此模塊中修改密碼或更換頭像,個人信息支持隨時更新與保存。

ScreenShot_2025-12-27_172531_502

2.5 多模態檢測展示

系統支持圖片、視頻及攝像頭實時畫面的目標檢測。識別結果將在畫面中標註顯示,並且帶有語音播報提醒,並在下方列表中逐項列出。點擊具體目標可查看其類別、置信度及位置座標等詳細信息。

3

2.6 檢測結果保存

可以將檢測後的圖片、視頻進行保存,生成新的圖片和視頻,新生成的圖片和視頻中會帶有檢測結果的標註信息,並且還可以將所有檢測結果的數據信息保存到excel中進行,方便查看檢測結果。

010ScreenShot_2025-12-29_113357_369

2.7 多模型切換

系統內置多種已訓練模型,用户可根據實際需求靈活切換,以適應不同檢測場景或對比識別效果。

ScreenShot_2025-12-27_172632_895

3.模型訓練核心代碼

本腳本是YOLO模型批量訓練工具,可自動修正數據集路徑為絕對路徑,從pretrained文件夾加載預訓練模型,按設定參數(100輪/640尺寸/批次8)一鍵批量訓練YOLOv5nu/v8n/v11n/v12n模型。

# -*- coding: utf-8 -*-
"""
該腳本用於執行YOLO模型的訓練。

它會自動處理以下任務:
1. 動態修改數據集配置文件 (data.yaml),將相對路徑更新為絕對路徑,以確保訓練時能正確找到數據。
2. 從 'pretrained' 文件夾加載指定的預訓練模型。
3. 使用預設的參數(如epochs, imgsz, batch)啓動訓練過程。

要開始訓練,只需直接運行此腳本。
"""
import os
import yaml
from pathlib import Path
from ultralytics import YOLO

def main():
    """
    主訓練函數。
    
    該函數負責執行YOLO模型的訓練流程,包括:
    1. 配置預訓練模型。
    2. 動態修改數據集的YAML配置文件,確保路徑為絕對路徑。
    3. 加載預訓練模型。
    4. 使用指定參數開始訓練。
    """
    # --- 1. 配置模型和路徑 ---
    
    # 要訓練的模型列表
    models_to_train = [
        {'name': 'yolov5nu.pt', 'train_name': 'train_yolov5nu'},
        {'name': 'yolov8n.pt', 'train_name': 'train_yolov8n'},
        {'name': 'yolo11n.pt', 'train_name': 'train_yolo11n'},
        {'name': 'yolo12n.pt', 'train_name': 'train_yolo12n'}
    ]
    
    # 獲取當前工作目錄的絕對路徑,以避免相對路徑帶來的問題
    current_dir = os.path.abspath(os.getcwd())
    
    # --- 2. 動態配置數據集YAML文件 ---
    
    # 構建數據集yaml文件的絕對路徑
    data_yaml_path = os.path.join(current_dir, 'train_data', 'data.yaml')
    
    # 讀取原始yaml文件內容
    with open(data_yaml_path, 'r', encoding='utf-8') as f:
        data_config = yaml.safe_load(f)
    
    # 將yaml文件中的 'path' 字段修改為數據集目錄的絕對路徑
    # 這是為了確保ultralytics庫能正確定位到訓練、驗證和測試集
    data_config['path'] = os.path.join(current_dir, 'train_data')
    
    # 將修改後的配置寫回yaml文件
    with open(data_yaml_path, 'w', encoding='utf-8') as f:
        yaml.dump(data_config, f, default_flow_style=False, allow_unicode=True)
    
    # --- 3. 循環訓練每個模型 ---
    
    for model_info in models_to_train:
        model_name = model_info['name']
        train_name = model_info['train_name']
        
        print(f"\n{'='*60}")
        print(f"開始訓練模型: {model_name}")
        print(f"訓練名稱: {train_name}")
        print(f"{'='*60}")
        
        # 構建預訓練模型的完整路徑
        pretrained_model_path = os.path.join(current_dir, 'pretrained', model_name)
        if not os.path.exists(pretrained_model_path):
            print(f"警告: 預訓練模型文件不存在: {pretrained_model_path}")
            print(f"跳過模型 {model_name} 的訓練")
            continue
        
        try:
            # 加載指定的預訓練模型
            model = YOLO(pretrained_model_path)
            
            # --- 4. 開始訓練 ---
            
            print(f"開始訓練 {model_name}...")
            # 調用train方法開始訓練
            model.train(
                data=data_yaml_path,  # 數據集配置文件
                epochs=100,           # 訓練輪次
                imgsz=640,            # 輸入圖像尺寸
                batch=8,             # 每批次的圖像數量
                name=train_name,      # 模型名稱
            )
            
            print(f"{model_name} 訓練完成!")
            
        except Exception as e:
            print(f"訓練 {model_name} 時出現錯誤: {str(e)}")
            print(f"跳過模型 {model_name},繼續訓練下一個模型")
            continue
    
    print(f"\n{'='*60}")
    print("所有模型訓練完成!")
    print(f"{'='*60}")

if __name__ == "__main__":
    # 當該腳本被直接執行時,調用main函數
    main()

4. 技術棧

  • 語言:Python 3.10

  • 前端界面:PyQt5

  • 數據庫:SQLite(存儲用户信息)

  • 模型:YOLOv5、YOLOv8、YOLOv11、YOLOv12

5. YOLO模型對比與識別效果解析

5.1 YOLOv5/YOLOv8/YOLOv11/YOLOv12模型對比

基於Ultralytics官方COCO數據集訓練結果:

模型

尺寸(像素)

mAPval 50-95

速度(CPU ONNX/毫秒)

參數(M)

FLOPs(B)

YOLO12n

640

40.6

-

2.6

6.5

YOLO11n

640

39.5

56.1 ± 0.8

2.6

6.5

YOLOv8n

640

37.3

80.4

3.2

8.7

YOLOv5nu

640

34.3

73.6

2.6

7.7

關鍵結論

  1. 精度最高:YOLO12n(mAP 40.6%),顯著領先其他模型(較YOLOv5nu高約6.3個百分點);

  2. 速度最優:YOLO11n(CPU推理56.1ms),比YOLOv8n快42%,適合實時輕量部署;

  3. 效率均衡:YOLO12n/YOLO11n/YOLOv8n/YOLOv5nu參數量均為2.6M,FLOPs較低(YOLO12n/11n僅6.5B);YOLOv8n參數量(3.2M)與計算量(8.7B)最高,但精度優勢不明顯。

綜合推薦

  • 追求高精度:優先選YOLO12n(精度與效率兼顧);

  • 需高速低耗:選YOLO11n(速度最快且精度接近YOLO12n);

  • YOLOv5nu/YOLOv8n因性能劣勢,無特殊需求時不建議首選。

5.2 數據集分析

labels

數據集中訓練集和驗證集一共4300張圖片,數據集目標類別33種:禁止前行, 禁止左轉, 禁止超車, 禁止右轉, 禁止超過10公里/小時, 禁止超過100公里/小時, 禁止超過130公里/小時, 禁止超過20公里/小時, 禁止超過30公里/小時, 禁止超過40公里/小時, 禁止超過5公里/小時, 禁止超過50公里/小時, 禁止超過60公里/小時, 禁止超過70公里/小時, 禁止超過80公里/小時, 禁止超過90公里/小時, 禁止停車, 禁止貨車通行, 禁止掉頭, 禁止總質量超過3.5噸車輛通行, 禁止總質量超過7.5噸車輛通行, 公交車站信息, 人行橫道信息, 高速公路信息, 單向交通信息, 停車場信息, 出租車停車位信息, 自行車道強制, 強制左轉, 強制左右轉, 強制靠左行駛, 強制靠左或靠右行駛, 強制靠右行駛, 強制右轉, 環島強制, 直行或左轉強制, 強制直行, 直行或右轉強制, 讓行優先權, 優先道路, 停車優先權, 注意兒童警告, 施工警告, 注意人行橫道警告, 注意騎行者警告, 注意家畜警告, 其他危險警告, 路面不良警告, 環島警告, 濕滑路面警告, 減速帶警告, 注意紅綠燈警告, 有軌電車警告, 雙向交通警告, 注意野生動物警告數據集配置代碼如下:

train: ../train/images
val: ../valid/images
test: ../test/images
path: data
nc: 55
names: ['forb_ahead', 'forb_left', 'forb_overtake', 'forb_right', 'forb_speed_over_10', 
'forb_speed_over_100', 'forb_speed_over_130', 'forb_speed_over_20', 'forb_speed_over_30', 
'forb_speed_over_40', 'forb_speed_over_5', 'forb_speed_over_50', 'forb_speed_over_60', 
'forb_speed_over_70', 'forb_speed_over_80', 'forb_speed_over_90', 'forb_stopping', 
'forb_trucks', 'forb_u_turn', 'forb_weight_over_3.5t', 'forb_weight_over_7.5t', 
'info_bus_station', 'info_crosswalk', 'info_highway', 'info_one_way_traffic', 'info_parking',
'info_taxi_parking', 'mand_bike_lane', 'mand_left', 'mand_left_right', 'mand_pass_left', 
'mand_pass_left_right', 'mand_pass_right', 'mand_right', 'mand_roundabout', 'mand_straigh_left', 
'mand_straight', 'mand_straight_right', 'prio_give_way', 'prio_priority_road', 'prio_stop', 
'warn_children', 'warn_construction', 'warn_crosswalk', 'warn_cyclists', 'warn_domestic_animals',
'warn_other_dangers', 'warn_poor_road_surface', 'warn_roundabout', 'warn_slippery_road', 
'warn_speed_bumper', 'warn_traffic_light', 'warn_tram', 'warn_two_way_traffic', 'warn_wild_animals']

train_batch0train_batch1

上面的圖片就是部分樣本集訓練中經過數據增強後的效果標註。

5.3 訓練結果

confusion_matrix_normalized

混淆矩陣顯示中識別精準度顯示是一條對角線,方塊顏色越深代表對應的類別識別的精準度越高

BoxF1_curve

F1指數(F1 Score)是統計學和機器學習中用於評估分類模型性能的核心指標,綜合了模型的精確率(Precision)和召回率(Recall),通過調和平均數平衡兩者的表現。 

當置信度為0.481時,所有類別的綜合F1值達到了0.79(藍色曲線)。

BoxPR_curve

mAP@0.5:是目標檢測任務中常用的評估指標,表示在交併比(IoU)閾值為0.5時計算的平均精度均值(mAP)。其核心含義是:只有當預測框與真實框的重疊面積(IoU)≥50%時,才認為檢測結果正確。

圖中可以看到綜合mAP@0.5達到了0.854(85.4%),準確率非常高。

6. 源碼獲取方式

源碼獲取方式:https://www.bilibili.com/video/BV1ervHBqE76

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.