
簡介本資源是一套基于YOLOv5與OpenCV實現的道路紅綠燈智能識別檢測系統面向計算機視覺初學者、智能交通項目開發者及AI模型部署實踐者解決真實場景下多類別交通燈紅燈、綠燈、黃燈、交通燈整體的端到端檢測與評估問題。壓縮包共79個文件涵蓋17個Python源碼含train.py、detect.py、test.py等核心腳本、17個YAML配置文件含數據集路徑、超參設置、模型結構定義、3個PyTorch模型文件.pt格式含已訓練好的yolov5s.pt、7張可視化圖像含訓練批次圖、預測結果圖、PR曲線、損失曲線等以及使用說明、依賴清單和評估結果文本總大小41.68MB。已有1483人學習下載資源結構清晰完整包含訓練、推理、評估全流程不僅提供可直接運行的檢測代碼與預訓練權重還附帶200輪迭代的loss下降曲線、Recall/Precision變化趨勢、mAP指標及correlogram相關性分析圖便于模型效果復現與性能調優。1. 項目緣起從“看見”到“看懂”紅綠燈的工程實踐在計算機視覺的落地應用里交通場景的感知一直是個硬骨頭。紅綠燈識別聽起來簡單不就是識別幾個顏色和形狀嗎但真做起來你會發現它遠不止是“識別”那么簡單。光照變化、天氣影響、遮擋、運動模糊還有不同國家、不同路口的燈型差異每一個因素都可能讓一個在實驗室里跑得飛快的模型在實際路測中“翻車”。我最初接觸這個需求是幫一個做車載輔助駕駛的朋友解決一個具體問題他們的系統在傍晚逆光環境下經常把遠處紅色的廣告牌誤識別成紅燈導致不必要的減速。這讓我意識到一個魯棒的紅綠燈識別系統不能只依賴一個訓練好的模型它必須是一個結合了目標檢測、圖像預處理、后處理邏輯和場景理解的完整工程方案。所以當我看到這個“基于YOLOv5OpenCV實現道路紅綠燈識別檢測系統”的項目包時第一反應是這很可能是一個從實驗室Demo走向工程化應用的絕佳學習樣本。它不僅僅提供了模型更重要的是它打包了源碼、評估指標曲線和使用說明這意味著我們可以一窺從數據準備、模型訓練、性能評估到最終集成的完整鏈路。對于想深入理解如何將一個前沿的算法YOLOv5與經典的計算機視覺庫OpenCV結合解決一個具體、復雜且具有強現實約束問題的開發者來說這個項目包的價值遠超一個孤立的模型文件。接下來我將帶你一起拆解這個系統看看它如何工作以及我們在復現和優化時需要注意哪些關鍵點。2. 核心組件拆解YOLOv5與OpenCV的角色與協同這個系統的核心架構非常清晰YOLOv5負責“找”OpenCV負責“判”和“顯”。但兩者的分工與協作遠不止字面意思那么簡單理解它們各自承擔的任務邊界是后續調優和問題排查的基礎。2.1 YOLOv5高效的目標檢測引擎YOLOv5在這里扮演的是目標檢測器的角色。它的任務是在輸入的圖像或視頻幀中快速、準確地定位出所有可能是紅綠燈的物體并用一個矩形框Bounding Box標記出來同時給出這個框內物體是“紅綠燈”的置信度Confidence Score。YOLOv5之所以被廣泛采用主要得益于它在速度與精度之間取得的出色平衡以及其高度工程化的代碼庫使得訓練和部署相對便捷。在這個紅綠燈識別場景下YOLOv5模型需要被訓練來識別“紅綠燈”這個類別。但這里有一個關鍵細節YOLOv5本身通常不區分紅燈、綠燈和黃燈的狀態。它只是告訴你“這里有一個交通信號燈”。為什么因為從目標檢測的角度看紅燈、綠燈、黃燈在形狀、大小、外觀上高度相似僅僅是發光區域的顏色不同。如果讓檢測模型同時完成定位和精細的狀態分類模型會變得復雜且容易因顏色通道的微小變化如光照而產生誤判。因此更常見的工程實踐是采用兩階段策略第一階段用YOLOv5檢測出信號燈的位置第二階段利用OpenCV對檢測框內的圖像區域進行更精細的顏色和形狀分析來判斷其具體狀態紅、綠、黃、熄滅等。這種解耦的設計提升了系統的模塊化和魯棒性。2.2 OpenCV強大的圖像處理與后處理工具箱OpenCV在這個系統中承擔了多重任務是工程化落地的關鍵圖像預處理在將圖像送入YOLOv5模型之前可能需要進行一些預處理操作例如尺寸縮放Resize到模型要求的輸入尺寸如640x640、顏色空間轉換BGR轉RGB因為YOLOv5通常期望RGB輸入、以及歸一化Normalization。這些操作通常由推理框架如PyTorch或代碼封裝完成但底層離不開OpenCV的圖像讀寫和變換能力。狀態識別后處理核心這是OpenCV最核心的作用。當YOLOv5給出一個“紅綠燈”的檢測框后我們需要裁剪Crop出這個區域。然后針對這個裁剪出的小圖像進行一系列操作來判斷狀態顏色空間分析直接將圖像從BGR轉換到HSV顏色空間。HSV將顏色信息色調H、飽和度S和明度V分離對光照變化比RGB空間更魯棒。我們可以通過設定紅燈、綠燈、黃燈在H通道的大致范圍例如紅色在HSV中可能對應H在0-10和160-180的兩個區間并結合較高的飽和度(S)和明度(V)閾值來篩選出高亮的顏色區域。形態學操作使用cv2.morphologyEx進行開運算、閉運算等以消除噪聲點連接相鄰的像素區域使燈光的形狀更完整。輪廓查找與篩選使用cv2.findContours找到上一步二值化圖像中的所有輪廓。然后根據輪廓的面積、寬高比、圓形度如果是圓形燈或矩形度如果是箭頭燈等幾何特征篩選出最可能是燈頭的輪廓。邏輯判斷最后根據篩選出的輪廓數量、位置對于豎向排列的紅黃綠燈它們的位置是固定的等信息綜合判斷當前信號燈的狀態。例如如果只找到一個位于檢測框上部的紅色高亮區域則判定為紅燈。結果可視化使用cv2.rectangle,cv2.putText等函數將YOLOv5的檢測框、OpenCV判斷的狀態標簽如“Red” “Green”以及置信度繪制到原始圖像上生成直觀的可視化結果。注意這里提到的opencv equalizehist 掩膜等熱詞很可能是在嘗試用直方圖均衡化來增強圖像對比度或者使用掩膜來限定處理區域。這在預處理階段用于改善低光照或高對比度場景下的圖像質量是一個常見的優化點但并非必需的核心流程。過度處理有時會引入新的噪聲。3. 環境部署與源碼運行避開第一個“坑”拿到一個包含源碼和模型的項目包第一步永遠是搭建環境并讓程序跑起來。這個過程看似簡單卻最容易因為版本依賴、路徑配置等問題卡住。我們以最常見的Windows/Python環境為例梳理關鍵步驟。3.1 環境準備創建獨立的虛擬環境強烈建議使用conda或venv創建獨立的Python環境避免與系統或其他項目的包沖突。# 使用 conda conda create -n traffic_light python3.8 conda activate traffic_light # 或使用 venv python -m venv traffic_light_env # Windows traffic_light_env\Scripts\activate # Linux/Mac source traffic_light_env/bin/activate3.2 核心依賴安裝PyTorch, OpenCV, YOLOv5安裝依賴的順序和版本選擇至關重要。安裝PyTorch前往 PyTorch官網 根據你的CUDA版本如果有NVIDIA GPU并已安裝CUDA或選擇CPU版本生成對應的安裝命令。例如對于CUDA 11.8pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118如果沒有GPU則安裝CPU版本pip install torch torchvision torchaudio安裝OpenCV安裝OpenCV的核心包和擴展包opencv-contrib-python通常包含更多功能。pip install opencv-python opencv-contrib-python如果遇到網絡問題可以使用國內鏡像源如-i https://pypi.tuna.tsinghua.edu.cn/simple。獲取YOLOv5源碼項目包中可能已經包含了YOLOv5的代碼但為了確保完整性我們也可以直接從官方倉庫克隆。注意版本匹配YOLOv5的版本v6.0, v7.0等不同API可能有細微變化。git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt關鍵點安裝requirements.txt時它會自動安裝一系列依賴包括特定版本的numpy,pillow,matplotlib等。這可能會與你環境中已安裝的OpenCV或PyTorch產生版本沖突。一個常見的策略是先安裝PyTorch和OpenCV再安裝YOLOv5的requirements并忽略其中對PyTorch的版本指定如果沖突可以手動編輯requirements.txt臨時注釋掉torch和torchvision的行。3.3 項目結構解析與運行解壓項目包后典型的目錄結構可能如下traffic_light_detection/ ├── models/ # 存放訓練好的YOLOv5模型權重文件.pt ├── data/ # 可能包含數據集配置文件.yaml和示例圖片/視頻 ├── utils/ # 工具腳本可能包含OpenCV后處理、畫圖等函數 ├── detect.py # 主推理腳本或基于YOLOv5的detect.py修改而來 ├── train.py # 訓練腳本如果提供 ├── requirements.txt # 項目依賴 └── README.md # 使用說明運行推理的核心命令通常類似于python detect.py --source data/test.jpg --weights models/best.pt --conf-thres 0.25--source: 指定輸入源可以是圖片、視頻、攝像頭編號如0或文件夾路徑。--weights: 指定訓練好的模型權重路徑。--conf-thres: 置信度閾值低于此值的檢測框將被過濾掉。對于紅綠燈這種小目標初期可以設低一點如0.2以免漏檢后期再調整。常見踩坑點ModuleNotFoundError: No module named cv2說明OpenCV安裝失敗或未安裝。檢查安裝命令確保在正確的虛擬環境中操作。CUDA相關錯誤如果安裝了GPU版本的PyTorch但運行時報CUDA錯誤請檢查CUDA和PyTorch版本是否兼容。可以使用python -c import torch; print(torch.__version__); print(torch.cuda.is_available())來驗證。模型加載失敗確保--weights參數指向正確的.pt文件路徑。有時模型文件可能是在不同版本的YOLOv5上訓練的如果版本不匹配可能導致加載錯誤。嘗試使用項目包內提供的detect.py因為它通常與模型版本匹配。路徑問題在代碼中讀取文件、保存結果的路徑建議使用os.path.join來構建以兼容不同操作系統。檢查代碼中是否有硬編碼的絕對路徑。4. 模型訓練與評估理解性能曲線的背后如果項目包中包含了訓練腳本和評估指標曲線那我們就擁有了從零開始復現或優化模型的能力。這是理解系統性能上限的關鍵。4.1 數據準備紅綠燈數據集的特殊性訓練一個紅綠燈檢測模型首先需要標注好的數據集。數據通常來源于公開數據集如TT100K、Bosch Small Traffic Lights Dataset或自行采集標注。數據標注需要使用標注工具如LabelImg、CVAT將每個紅綠燈用矩形框標出并賦予“traffic_light”之類的標簽。數據準備的核心挑戰尺度變化大近處的紅綠燈可能占據圖像很大區域而遠處的則只有幾十個像素。YOLOv5的多尺度檢測頭P3, P4, P5對此有幫助但數據集中需要包含充足的多尺度樣本。類別不平衡有些狀態如黃燈的樣本可能遠少于紅燈和綠燈。需要在數據增強或損失函數中考慮這一點。復雜背景紅綠燈常出現在天空、樹木、建筑背景前容易與相似的發光物體如車尾燈、廣告牌混淆。數據集中應包含足夠的負樣本不含紅綠燈的圖片和困難負樣本容易混淆的物體。數據集的目錄結構通常遵循YOLOv5的規范datasets/ └── traffic_light/ ├── images/ │ ├── train/ # 訓練圖片 │ └── val/ # 驗證圖片 └── labels/ ├── train/ # 對應的YOLO格式標簽文件.txt └── val/每個標簽文件.txt的每一行格式為class_id x_center y_center width height坐標和寬高都是相對于圖片尺寸的歸一化值0-1之間。4.2 訓練配置與超參數調優項目中的train.py和data.yaml是訓練的控制中心。data.yaml文件定義了數據集的路徑和類別信息# data.yaml train: ../datasets/traffic_light/images/train val: ../datasets/traffic_light/images/val nc: 1 # 類別數這里只有‘traffic_light’一類 names: [traffic_light]訓練命令示例python train.py --img 640 --batch 16 --epochs 100 --data ./data/traffic_light.yaml --weights yolov5s.pt --project runs/train --name exp1--img: 輸入圖像尺寸。640是YOLOv5的常用尺寸更大的尺寸如1280可能提升小目標檢測精度但會顯著增加計算量和內存消耗。--batch: 批次大小。根據GPU內存調整。--epochs: 訓練輪數。需要觀察驗證集損失曲線防止過擬合。--weights: 初始權重。使用預訓練的yolov5s.pt可以加速收斂這是遷移學習的典型應用。--project--name: 指定輸出目錄訓練日志、模型權重、評估曲線都會保存在這里。超參數調優心得學習率--lr0是最重要的超參數之一。YOLOv5默認使用了帶熱身的余弦退火學習率調度器通常默認值0.01是個不錯的起點。如果訓練損失震蕩劇烈可以嘗試調低如0.001。數據增強YOLOv5內置了強大的數據增強Mosaic, MixUp等。對于紅綠燈小目標可以適當增強--hsv_h,--hsv_s,--hsv_vHSV顏色空間擾動來模擬不同光照和天氣但要注意過度增強可能破壞顏色信息反而影響后續OpenCV的狀態判斷。針對小目標的優化可以在模型結構上嘗試使用更關注小目標的檢測頭或者使用專門針對小目標優化的YOLO變種如YOLOv5-P2增加了一個更淺的檢測頭。但在資源有限的情況下更務實的做法是確保訓練數據中包含足夠多、高質量的小目標樣本。4.3 解讀評估指標曲線訓練完成后在runs/train/exp1目錄下我們會看到一系列重要的評估圖表它們是衡量模型性能的“體檢報告”。損失曲線train_loss.jpgval_loss.jpg訓練損失隨著epoch增加應持續下降最終趨于平緩。驗證損失也應下降但在某個epoch后可能開始上升這意味著模型開始過擬合過度記憶訓練數據泛化能力變差。此時應停止訓練早停或增加數據增強、使用正則化手段。性能指標曲線metrics.jpg精度Precision模型預測為正的樣本中真正為正的比例。高精度意味著模型“不錯報”。召回率Recall所有真實為正的樣本中被模型正確找出的比例。高召回率意味著模型“不漏報”。mAP0.5mean Average Precision在交并比IoU閾值為0.5時的平均精度。這是目標檢測的核心綜合指標。對于紅綠燈檢測我們通常更關注mAP0.5:0.95即在多個IoU閾值從0.5到0.95步長0.05下的平均mAP這能更全面地衡量定位精度。解讀理想情況是Precision和Recall曲線都盡可能高且平衡。如果Precision高但Recall低說明模型很保守只檢測非常確定的紅綠燈會漏掉很多。如果Recall高但Precision低說明模型很激進抓到了大部分紅綠燈但誤檢很多。需要通過調整置信度閾值--conf-thres來在兩者之間取得平衡。混淆矩陣confusion_matrix.png對于多分類任務非常有用。在本項目中如果只檢測“紅綠燈”一類混淆矩陣意義不大。但如果將紅、綠、黃燈作為不同類別來訓練不推薦原因見2.1節混淆矩陣可以清晰顯示類別間的誤判情況。從曲線到調優決策 如果mAP值不理想不要急于調整模型超參數。首先檢查數據標注質量是否高小目標樣本是否足夠類別是否平衡然后檢查訓練過程損失曲線是否正常收斂學習率是否合適很多時候數據的質量決定了模型性能的上限。5. OpenCV后處理邏輯深度剖析從檢測框到狀態判斷這是將“檢測到物體”轉化為“理解其狀態”的關鍵一步也是工程上最容易出問題、最需要精細調校的環節。我們詳細拆解一個典型的處理流程。5.1 檢測框裁剪與預處理假設YOLOv5給出了一個檢測框(x1, y1, x2, y2)和置信度conf。首先我們從原始圖像中裁剪出這個區域import cv2 import numpy as np # 假設 det 是YOLOv5輸出的一個檢測結果格式為 [x1, y1, x2, y2, conf, class] x1, y1, x2, y2 map(int, det[:4]) traffic_light_roi original_image[y1:y2, x1:x2] # 如果檢測框過小可以適當按比例擴大一點確保捕獲完整的燈體 padding 5 h, w original_image.shape[:2] x1 max(0, x1 - padding) y1 max(0, y1 - padding) x2 min(w, x2 padding) y2 min(h, y2 padding) traffic_light_roi original_image[y1:y2, x1:x2]5.2 基于HSV顏色空間的狀態識別這是最核心的步驟。我們以識別紅燈為例def detect_red_light(roi): # 1. 轉換到HSV空間 hsv cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) # 2. 定義紅色的HSV范圍紅色在HSV色環的兩端 # 注意這些閾值需要根據實際環境白天/夜晚、燈罩材質進行微調 lower_red1 np.array([0, 70, 50]) # 低色調紅色 upper_red1 np.array([10, 255, 255]) lower_red2 np.array([160, 70, 50]) # 高色調紅色 upper_red2 np.array([180, 255, 255]) # 3. 根據閾值創建掩膜 mask1 cv2.inRange(hsv, lower_red1, upper_red1) mask2 cv2.inRange(hsv, lower_red2, upper_red2) red_mask cv2.bitwise_or(mask1, mask2) # 4. 形態學操作去噪 kernel np.ones((3, 3), np.uint8) red_mask cv2.morphologyEx(red_mask, cv2.MORPH_CLOSE, kernel) # 閉運算填充小孔 red_mask cv2.morphologyEx(red_mask, cv2.MORPH_OPEN, kernel) # 開運算去除小白點 # 5. 查找輪廓 contours, _ cv2.findContours(red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 6. 篩選輪廓 red_detected False for cnt in contours: area cv2.contourArea(cnt) # 根據ROI大小設定面積閾值過濾掉太小的噪聲 if area (roi.shape[0] * roi.shape[1] * 0.01): # 例如面積大于ROI面積的1% # 可以進一步檢查輪廓的寬高比、圓形度等 red_detected True break return red_detected, red_mask綠燈和黃燈的檢測邏輯類似只需調整HSV范圍。例如綠燈的H范圍大約在[35, 85]黃燈在[20, 35]。5.3 多燈狀態與邏輯判斷一個紅綠燈組通常包含多個燈紅、黃、綠可能還有箭頭燈。簡單的做法是對每個檢測框獨立判斷。但更魯棒的方法是如果YOLOv5檢測到了多個非常接近的“traffic_light”框可能是一個燈組被誤檢成多個可以先進行框合并NMS或根據位置聚類得到一個大的“燈組”區域。然后在這個大區域內分別用HSV方法尋找紅、綠、黃的高亮區域再根據它們的相對空間位置例如豎向排列時紅燈在上綠燈在下進行最終狀態判決。關鍵挑戰與調優經驗閾值敏感性問題HSV閾值不是銀彈。傍晚的天空、車尾燈、霓虹招牌都可能落入相近的HSV范圍。動態閾值或機器學習分類器在裁剪的ROI上訓練一個簡單的SVM或CNN來分類紅/綠/黃/滅是更魯棒的方案但復雜度也更高。曝光與過曝在強光或夜間燈光區域可能過曝變成白色丟失顏色信息。可以嘗試在HSV分析前先提取V通道明度找到高亮區域再在這些區域的原始BGR或H通道上分析顏色趨勢。運動模糊車輛移動會導致燈光拖影破壞輪廓形狀。可以考慮使用視頻時序信息對連續幾幀的檢測結果進行投票或濾波提高穩定性。代碼優化對視頻流進行實時處理時OpenCV的逐幀循環和輪廓查找可能是性能瓶頸。務必使用time模塊對關鍵函數進行性能分析并考慮使用多線程將目標檢測和狀態識別分離到不同線程或更高效的算法。6. 系統集成與性能優化實戰將訓練好的模型和調校好的后處理邏輯集成到一個穩定、高效的應用中是最后的臨門一腳。這里涉及工程架構、性能優化和異常處理。6.1 構建可復用的處理流水線一個好的設計是將系統模塊化例如class TrafficLightSystem: def __init__(self, model_path, conf_thres0.25): self.model self.load_yolov5_model(model_path) self.conf_thres conf_thres # 初始化OpenCV后處理的參數如HSV閾值 self.hsv_params self.load_hsv_params(config/hsv_params.json) def load_yolov5_model(self, path): # 使用YOLOv5提供的加載方式 model torch.hub.load(ultralytics/yolov5, custom, pathpath, force_reloadFalse) model.conf self.conf_thres return model def process_frame(self, frame): # 步驟1: YOLOv5檢測 results self.model(frame) detections results.xyxy[0].cpu().numpy() # 獲取檢測框 [x1, y1, x2, y2, conf, cls] lights_info [] for det in detections: if det[5] 0: # 假設類別0是‘traffic_light’ # 步驟2: 裁剪ROI roi self.crop_roi(frame, det) # 步驟3: OpenCV狀態識別 state self.recognize_state(roi) # 步驟4: 組裝信息 lights_info.append({ bbox: det[:4], confidence: det[4], state: state }) # 步驟5: 可選基于位置信息的燈組邏輯判斷 lights_info self.group_and_vote(lights_info) return lights_info def recognize_state(self, roi): # 實現上一節中的HSV顏色分析邏輯 is_red, _ self.detect_by_hsv(roi, self.hsv_params[red]) is_green, _ self.detect_by_hsv(roi, self.hsv_params[green]) is_yellow, _ self.detect_by_hsv(roi, self.hsv_params[yellow]) # 簡單邏輯誰亮判誰如果都不亮或都亮不可能判為未知 if sum([is_red, is_green, is_yellow]) 1: if is_red: return RED elif is_green: return GREEN else: return YELLOW else: return UNKNOWN def visualize(self, frame, lights_info): # 使用OpenCV將結果畫到幀上 for info in lights_info: x1, y1, x2, y2 map(int, info[bbox]) state info[state] conf info[confidence] color {RED: (0, 0, 255), GREEN: (0, 255, 0), YELLOW: (0, 255, 255)}.get(state, (255, 255, 255)) cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2) label f{state} {conf:.2f} cv2.putText(frame, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) return frame6.2 性能優化技巧推理加速模型簡化使用更小的YOLOv5變體如yolov5n或yolov5s。在嵌入式設備如提到的RV1106、RK3568上需要進一步使用模型量化INT8、剪枝、轉換為特定推理引擎格式如ONNX、TensorRT、NCNN等手段。幀采樣對于實時視頻流如果不是每幀都必須處理可以跳幀如每3幀處理1幀然后用跟蹤算法如ByteTrack、Bot-SORT在中間幀維持目標ID和位置。分辨率調整在不顯著影響小目標檢測的前提下適當降低輸入模型的分辨率如從640降到480。后處理加速ROI處理限制只對置信度高于一定閾值的檢測框進行詳細的OpenCV后處理。向量化操作盡量使用NumPy的向量化操作代替Python循環。C擴展對于性能瓶頸極高的函數如復雜的輪廓分析可以考慮用C實現并通過Python綁定如PyBind11調用。內存管理在長時間運行的服務中注意及時釋放不再使用的圖像張量和中間變量防止內存泄漏。6.3 異常處理與日志記錄一個健壯的系統必須能處理各種異常情況。try: results self.model(frame) except RuntimeError as e: if CUDA out of memory in str(e): logging.warning(GPU內存不足嘗試清空緩存并降低批次大小) torch.cuda.empty_cache() # 嘗試用更小的尺寸或跳過此幀 return [] else: logging.error(f模型推理錯誤: {e}) raise完善的日志記錄logging模塊對于線上排查問題至關重要應記錄關鍵步驟的結果、耗時、以及識別到的狀態變化。7. 從項目到產品可能遇到的坑與進階思考走通整個流程后你會發現實驗室環境下的高精度模型在實際部署中依然會面臨諸多挑戰。這里分享一些更深層次的“坑”和應對思路。坑一環境光劇變。系統在白天表現良好但到了夜晚車燈、路燈成為主要光源紅綠燈的HSV特征完全變了。甚至攝像頭自動增益AGC和自動白平衡AWB也會改變圖像的整體色調。應對思路數據增強的針對性在訓練YOLOv5模型時就加入大量模擬夜間、黃昏、逆光、雨霧的數據增強。可以使用GAN或色彩變換來生成更多樣化的訓練數據。預處理自適應在OpenCV后處理前先對圖像進行光照歸一化或使用Retinex等算法進行光照補償減少全局光照的影響。特征融合不要只依賴顏色。結合形狀特征HOG、輪廓矩和紋理特征甚至使用一個輕量級的神經網絡對裁剪出的ROI進行二次分類比純HSV更穩定。坑二遠距離小目標漏檢。這是小目標檢測的共性問題。YOLOv5雖然有多尺度檢測但對于幾十像素的紅綠燈在復雜背景下依然容易丟失。應對思路數據層面確保訓練集包含足夠比例的小目標樣本并對其進行過采樣。標注時對于極小的目標可以適當放寬IoU要求或者采用更密集的標注策略。模型層面嘗試使用專門優化小目標的檢測器如YOLOv5-P2增加P2特征層或在YOLOv5的Neck部分加入注意力機制如CBAM、SE讓模型更關注小目標區域。檢測策略采用滑動窗口或圖像金字塔對輸入圖像進行多尺度檢測雖然會增加計算量但能顯著提升小目標召回率。可以只在檢測置信度低的區域或特定尺度上使用。坑三嵌入式部署難題。在RV1106、RK3568這類邊緣設備上直接運行PyTorch模型和完整的OpenCV Python代碼幾乎不可能。應對思路模型轉換與量化將訓練好的PyTorch模型導出為ONNX格式然后使用設備廠商提供的工具鏈如RKNN Toolkit for RK3568轉換為適配自家NPU的格式并進行INT8量化大幅提升推理速度。工程語言重構將核心算法用C重寫。使用libtorchPyTorch C前端進行模型推理使用OpenCV C接口進行圖像處理。這需要深厚的C和跨平臺編譯功底。流水線優化在嵌入式端可能需要對算法流水線做減法。例如在固定場景下可以預先確定紅綠燈的大致出現區域ROI只對這些區域進行檢測減少計算量。進階思考端到端方案 vs. 兩階段方案。我們目前采用的是“YOLOv5檢測 OpenCV狀態識別”的兩階段方案。一個自然的想法是能否訓練一個端到端的模型直接輸出“紅燈”、“綠燈”、“黃燈”和“無燈”可行性完全可以。你需要一個標注了具體燈狀態的數據集例如將“紅燈”作為一個類別“綠燈”作為另一個類別。然后使用YOLOv5或其他檢測器進行訓練。優缺點分析優點結構簡單推理一次即可得到最終結果可能更快。缺點數據要求高且標注成本大。需要精確標注每個燈的狀態并且要覆蓋各種光照、天氣、遮擋情況。模型需要同時學習“定位”和“精細顏色分類”任務更復雜在數據不足時容易過擬合或表現不佳。兩階段方案的優點在于解耦YOLOv5只需學習“這是不是燈”這個任務相對簡單數據也更容易獲取OpenCV的顏色分析規則雖然需要調參但不依賴大量數據且可解釋性強便于針對特定場景快速調整。在實際項目中選擇哪種方案取決于你的核心約束條件是追求極致的精度和魯棒性可能傾向于兩階段并可對第二階段進行升級還是追求極致的部署簡便性和速度在數據充足的前提下可以考慮端到端。對于大多數從零開始的團隊從兩階段方案入手逐步迭代優化是一條更穩妥、更可控的路徑。這個“基于YOLOv5OpenCV”的項目包正是為你提供了這樣一個扎實的起點。本文還有配套的精品資源點擊獲取