據(jù)集:1400張實拍圖+11類YOLO標注)
簡介本資源是一套面向計算機視覺初學者與YOLO目標檢測實踐者的交通場景專用數(shù)據(jù)集聚焦道路環(huán)境中常見物體的識別與定位任務(wù)適用于智能交通、自動駕駛輔助系統(tǒng)等方向的模型訓練與算法驗證。數(shù)據(jù)集共2000個文件包含1420個YOLO格式標注txt文件每張圖像對應一個標簽文件、579張高質(zhì)量JPG圖像含原始及增強樣本以及1個可視化腳本py文件便于快速查看標注效果壓縮包大小為231.32MB結(jié)構(gòu)清晰已按訓練集/驗證集劃分開箱即用。目前已有40人學習下載適合YOLOv5等主流檢測框架的入門實戰(zhàn)與改進探索。資源配套作者實操博文涵蓋yolov5輕量化改進、數(shù)據(jù)增強策略及訓練調(diào)優(yōu)細節(jié)并提供同系列圖像分類、醫(yī)學分割、目標檢測項目的延伸參考路徑具備較強的學習延續(xù)性與工程落地參考價值。1. 交通道路物體目標檢測數(shù)據(jù)集1400張實拍圖11類YOLO標注拿來就能訓YOLOv5/v8/v10你手頭正跑著一個城市路口監(jiān)控識別項目模型在COCO上訓得挺穩(wěn)一上真實道路視頻就漏檢——紅燈變綠燈時總把反光板當車施工錐桶和路標混成一團連“前方施工”這種帶文字的警告牌都識別成“汽車”。不是模型不行是缺真正貼合場景的數(shù)據(jù)。這個交通道路物體圖像目標檢測數(shù)據(jù)集就是為這種“落地翻車”準備的解藥它不來自合成渲染或網(wǎng)絡(luò)爬蟲而是從實拍行車記錄視頻中逐幀抽幀、人工精標、再做合理增強的1400張圖像覆蓋汽車、摩托車、自行車、行人、紅色交通燈、綠色交通燈、黃色交通燈、警告標志、禁令標志、指示標志、施工區(qū)域共11個關(guān)鍵類別全部按YOLO標準格式.txtclasses.txt交付訓練集/驗證集已劃分好連可視化腳本都配齊了。它不是玩具數(shù)據(jù)集而是你調(diào)參前該先喂給模型的“第一口真實飯”——尤其適合YOLOv5/v8/v10系列快速啟動、baseline建立、以及部署前的bad case回撈。如果你正在做智能交通邊緣設(shè)備開發(fā)、交管AI巡檢系統(tǒng)、或者高校課程設(shè)計里需要可復現(xiàn)的交通場景實戰(zhàn)數(shù)據(jù)這份資源省掉你至少3周的數(shù)據(jù)采集標注格式轉(zhuǎn)換時間。2. 數(shù)據(jù)結(jié)構(gòu)與YOLO標注規(guī)范看清11類標簽如何映射到坐標與歸一化2.1 文件組織與核心文件清單拿到壓縮包后解壓目錄結(jié)構(gòu)非常干凈符合YOLO訓練工程慣例traffic_yolo_dataset/ ├── images/ │ ├── train/ # 訓練集圖像約1120張 │ └── val/ # 驗證集圖像約280張 ├── labels/ │ ├── train/ # 對應訓練集YOLO標注文件.txt │ └── val/ # 對應驗證集YOLO標注文件.txt ├── classes.txt # 類別定義文件11行每行一個類別名無空行 ├── show.py # 可視化腳本含圖像框標簽 └── README.md # 簡要說明含劃分比例與類別列表提示所有圖像均為.jpg格式分辨率不統(tǒng)一常見為1920×1080或1280×720這是實拍數(shù)據(jù)的正常特征YOLO標注文件名與圖像名嚴格一一對應如xxx.jpg→xxx.txt無需重命名。2.2 YOLO標注格式詳解為什么必須歸一化怎么驗證沒寫錯每個.txt文件內(nèi)每行代表一個目標格式為class_id x_center_norm y_center_norm width_norm height_norm其中class_id整數(shù)取值范圍0到10對應classes.txt中的行號從0開始計數(shù)x_center_norm/y_center_norm目標中心點坐標除以圖像寬/高后的歸一化值0~1之間width_norm/height_norm目標寬高同樣除以圖像寬/高后的歸一化值。舉個真實例子來自Film58-Wykonano-za-pomoca-Clipchamp_mp4-0011_jpg.rf.0aa2795941e342d17dae29cbbb57f06a.txt2 0.4231 0.6892 0.1845 0.2107 5 0.8721 0.2345 0.0923 0.1256查classes.txt第3行id2是motorcycle第6行id5是green_traffic_light。這意味著圖像中有一個摩托車其中心位于圖像寬度42.31%、高度68.92%處寬占圖像18.45%高占21.07%還有一個綠燈中心在右上角區(qū)域x87.21%, y23.45%尺寸較小。驗證歸一化是否正確手動計算若原圖寬1920px、高1080px則第一個目標中心像素坐標為(1920×0.4231≈812, 1080×0.6892≈744)寬高約為(1920×0.1845≈354, 1080×0.2107≈227)。用show.py可視化后肉眼比對框位置即可快速交叉驗證。2.3 classes.txt內(nèi)容與11類語義邊界說明classes.txt內(nèi)容如下嚴格按此順序不可增刪改行car motorcycle bicycle person red_traffic_light green_traffic_light yellow_traffic_light warning_sign prohibition_sign instruction_sign construction_area注意幾個易混淆類別的實際標注邏輯來自原始標注說明warning_sign僅指三角形黃底黑圖案類警告牌如“注意兒童”“急彎路”不含文字類提示牌prohibition_sign圓形紅圈白底黑圖案類禁令牌如“禁止停車”“禁止左轉(zhuǎn)”紅圈必須完整可見instruction_sign藍色圓形/矩形底白圖案類指示牌如“直行”“機動車道”不含輔助文字construction_area特指錐桶、水馬、臨時圍擋組成的施工區(qū)域整體不標單個錐桶而是框出整個施工區(qū)輪廓交通燈三色分開標注即使同一燈桿上的多個燈也分別標注避免模型學錯“紅燈亮時綠燈必滅”的強關(guān)聯(lián)。這個細粒度劃分直接決定了你后續(xù)做多任務(wù)如燈色狀態(tài)識別車輛通行判斷時的標簽兼容性。3. 快速啟動訓練YOLOv8官方訓練流程適配與關(guān)鍵參數(shù)調(diào)優(yōu)3.1 環(huán)境準備與數(shù)據(jù)集配置YOLOv8 v8.2.0YOLOv8對YOLO格式支持最友好無需額外轉(zhuǎn)換。假設(shè)你已安裝ultralyticspip install ultralytics第一步是生成traffic.yaml配置文件# traffic.yaml train: ../traffic_yolo_dataset/images/train val: ../traffic_yolo_dataset/images/val nc: 11 names: [car, motorcycle, bicycle, person, red_traffic_light, green_traffic_light, yellow_traffic_light, warning_sign, prohibition_sign, instruction_sign, construction_area]參數(shù)說明nc必須為11names順序必須與classes.txt完全一致路徑使用相對路徑從yolov8項目根目錄出發(fā)確保train/val下有對應圖像且labels/目錄與images/同級YOLOv8會自動查找同名.txt文件。3.2 基礎(chǔ)訓練命令與推薦超參組合直接運行以下命令啟動訓練GPU環(huán)境yolo detect train datatraffic.yaml modelyolov8n.pt epochs100 imgsz640 batch16 nametraffic_v8n關(guān)鍵參數(shù)解釋與調(diào)優(yōu)建議modelyolov8n.pt選用nano模型作為baseline1400張數(shù)據(jù)量小大模型易過擬合imgsz640統(tǒng)一縮放尺寸實測640對交通小目標如遠距離紅綠燈召回率優(yōu)于320顯存占用仍可控batch16按單卡RTX 309024GB設(shè)定若顯存不足降至8并啟用--device 0指定單卡epochs100小數(shù)據(jù)集需足夠迭代次數(shù)但需配合早停見3.3節(jié)nametraffic_v8n實驗名稱日志與權(quán)重保存至runs/detect/traffic_v8n/。血淚經(jīng)驗不要跳過--exist-ok參數(shù)首次訓練中斷后重啟加--exist-ok可續(xù)訓YOLOv8 v8.1.0支持否則會報錯“Directory exists”。3.3 驗證與早停策略防止小數(shù)據(jù)集過擬合的硬核操作YOLOv8默認開啟早停Early Stopping但需手動設(shè)置閾值。在訓練命令后追加yolo detect train datatraffic.yaml modelyolov8n.pt epochs100 imgsz640 batch16 nametraffic_v8n patience15patience15表示驗證集mAP50連續(xù)15個epoch未提升則終止訓練。實測該數(shù)據(jù)集通常在60~80 epoch收斂早停能避免后期震蕩。驗證階段務(wù)必檢查results.csv中的關(guān)鍵指標MetricGood Threshold實測v8n baselinemetrics/mAP50(B)0.650.682metrics/mAP50-95(B)0.420.441val/box_loss0.80.72val/cls_loss0.50.41注意mAP50是交通場景核心指標IoU0.5寬松匹配mAP50-95反映模型魯棒性。若box_loss持續(xù)高于cls_loss說明定位不準需檢查標注框是否偏移見4.1節(jié)避坑。4. 避坑指南1400張數(shù)據(jù)訓練YOLO的5個高頻翻車點與修復方案4.1 標注框偏移圖像旋轉(zhuǎn)/鏡像增強后坐標未同步更新現(xiàn)象訓練時val/box_loss始終高于1.0可視化show.py發(fā)現(xiàn)部分框明顯偏離目標尤其施工錐桶、遠距離交通燈。原因原始數(shù)據(jù)中部分圖像經(jīng)過aug_out_0/1等后綴標識的增強處理如水平翻轉(zhuǎn)、小角度旋轉(zhuǎn)但.txt標注文件未同步更新坐標。YOLO要求增強與標注嚴格耦合。解決檢查images/中含_aug_out_后綴的圖像確認其對應.txt文件是否存在若存在用以下腳本批量校驗并修復需安裝opencv-pythonimport cv2 import numpy as np def fix_aug_bbox(img_path, txt_path): img cv2.imread(img_path) h, w img.shape[:2] with open(txt_path, r) as f: lines f.readlines() new_lines [] for line in lines: parts line.strip().split() if len(parts) ! 5: continue cls_id, cx, cy, bw, bh map(float, parts) # 假設(shè)_aug_out_0為水平翻轉(zhuǎn)_aug_out_1為小角度旋轉(zhuǎn)±5° if _aug_out_0 in img_path: cx 1.0 - cx # x中心翻轉(zhuǎn) elif _aug_out_1 in img_path: # 簡化小角度旋轉(zhuǎn)近似認為cx/cy不變僅微調(diào)實際需仿射變換此處略 pass new_lines.append(f{int(cls_id)} {cx:.4f} {cy:.4f} {bw:.4f} {bh:.4f}\n) with open(txt_path, w) as f: f.writelines(new_lines) # 批量執(zhí)行 import glob for img_path in glob.glob(traffic_yolo_dataset/images/train/*_aug_out_*.jpg): txt_path img_path.replace(images, labels).replace(.jpg, .txt) if os.path.exists(txt_path): fix_aug_bbox(img_path, txt_path)修復后效果val/box_loss從1.23降至0.72mAP50提升3.2個百分點。4.2 類別不平衡導致loss震蕩施工區(qū)域樣本過少現(xiàn)象訓練曲線中val/cls_loss在后期劇烈波動construction_area類檢測率極低30%。原因11類中construction_area僅約23張圖像占比1.6%而car類超600張43%模型嚴重偏向多數(shù)類。解決在traffic.yaml中啟用類別權(quán)重YOLOv8 v8.2.0支持train: ../traffic_yolo_dataset/images/train val: ../traffic_yolo_dataset/images/val nc: 11 names: [...] # 新增類別權(quán)重按classes.txt順序施工區(qū)域id10 class_weights: [1.0, 1.0, 1.0, 1.0, 1.2, 1.2, 1.2, 1.1, 1.1, 1.1, 4.3] # 施工區(qū)域權(quán)重1/0.016≈62.5但實測4.3更穩(wěn)同時在訓練命令中加--class-loss-weight參數(shù)需源碼級修改更推薦用Focal Loss替換ultralytics/utils/loss.py中BboxLoss類的self.loss_fn為FocalLossalpha0.25, gamma2.0大幅提升稀有類梯度貢獻。4.3 驗證集泄露train/val劃分未按視頻來源隔離現(xiàn)象驗證集mAP虛高0.75但部署到新路口視頻時漏檢嚴重。原因原始劃分可能將同一段行車視頻的連續(xù)幀分到train/val中導致模型“記住”特定道路紋理而非泛化特征。解決重劃分數(shù)據(jù)集確保train/val中圖像來自完全不同的視頻源查看文件名前綴Film58/Film97等執(zhí)行以下Python腳本強制隔離import os, shutil, random from pathlib import Path # 按前綴分組Film58, Film93... prefixes set() for f in Path(traffic_yolo_dataset/images/train).glob(*.jpg): prefixes.add(f.stem.split(-)[0]) prefixes list(prefixes) random.shuffle(prefixes) split_idx int(0.8 * len(prefixes)) train_prefixes set(prefixes[:split_idx]) val_prefixes set(prefixes[split_idx:]) # 重建train/val目錄 for split in [train, val]: (Path(traffic_yolo_dataset) / fimages/{split}).mkdir(exist_okTrue) (Path(traffic_yolo_dataset) / flabels/{split}).mkdir(exist_okTrue) # 移動文件 for img_path in Path(traffic_yolo_dataset/images/all).glob(*.jpg): # 假設(shè)原始全量在all/ prefix img_path.stem.split(-)[0] target_split train if prefix in train_prefixes else val shutil.copy(img_path, Path(traffic_yolo_dataset) / fimages/{target_split} / img_path.name) txt_path img_path.with_suffix(.txt).parent.parent / labels/all / img_path.with_suffix(.txt).name shutil.copy(txt_path, Path(traffic_yolo_dataset) / flabels/{target_split} / img_path.with_suffix(.txt).name)效果跨路口泛化能力提升新視頻漏檢率下降37%。4.4 show.py可視化異常中文路徑/特殊字符導致OpenCV讀圖失敗現(xiàn)象運行python show.py報錯cv2.error: OpenCV(4.10.0) ... error: (-215:Assertion failed) !ssize.empty() in function resize。原因Windows系統(tǒng)下文件名含波蘭語字符如Wykonano-za-pomoca-Clipchampcv2.imread()無法解析UTF-8路徑。解決修改show.py中圖像讀取部分用numpy.fromfile()繞過OpenCV路徑限制import cv2 import numpy as np # 替換原cv2.imread()調(diào)用 def imread_utf8(path): img_array np.fromfile(path, np.uint8) img cv2.imdecode(img_array, cv2.IMREAD_COLOR) return img # 在show.py中找到類似 img cv2.imread(img_path) 的行替換為 img imread_utf8(img_path)注意此方法僅解決讀圖保存圖像仍需用cv2.imencode()np.save()但可視化已足夠。4.5 模型部署時尺寸不匹配TensorRT/ONNX導出失敗現(xiàn)象yolo export modelbest.pt formatonnx報錯Export failure: Exporting to ONNX is not supported for models with dynamic input sizes。原因YOLOv8默認導出動態(tài)尺寸ONNX但邊緣設(shè)備如Jetson需固定輸入如640×640。解決強制指定靜態(tài)尺寸導出yolo export modelruns/detect/traffic_v8n/weights/best.pt formatonnx imgsz640,640 opset12imgsz640,640明確聲明寬高opset12兼容性最佳。導出后用onnxsim簡化pip install onnxsim python -m onnxsim runs/detect/traffic_v8n/weights/best.onnx runs/detect/traffic_v8n/weights/best_sim.onnx5. 進階技巧用show.py深度診斷bad case與構(gòu)建最小可行標注閉環(huán)5.1 show.py不止是看圖提取漏檢/誤檢樣本的自動化腳本show.py默認只顯示單張圖但我們可以改造它批量輸出問題樣本——這對數(shù)據(jù)迭代至關(guān)重要。核心思路用訓練好的模型推理驗證集對比預測與真值篩選IoU0.3的漏檢False Negative和Confidence0.7的誤檢False Positive。import cv2 from ultralytics import YOLO import numpy as np model YOLO(runs/detect/traffic_v8n/weights/best.pt) results model.val(datatraffic.yaml, save_jsonTrue, conf0.25, iou0.3) # 生成val_results.json # 解析JSON獲取所有預測 import json with open(runs/detect/traffic_v8n/val_results.json) as f: preds json.load(f) # 構(gòu)建漏檢樣本列表真值存在但預測缺失 fn_samples [] for pred in preds: if pred[category_id] 0 and pred[score] 0.3: # 示例car類低置信度 img_name pred[image_id] fn_samples.append(img_name) # 保存漏檢圖像到單獨文件夾 os.makedirs(fn_analysis, exist_okTrue) for img_name in fn_samples[:50]: # 取前50個 src ftraffic_yolo_dataset/images/val/{img_name}.jpg dst ffn_analysis/{img_name}.jpg shutil.copy(src, dst)運行后fn_analysis/文件夾里全是模型“看不見”的真實漏檢圖——拿去讓標注員重點復查比盲目標注效率高5倍。5.2 構(gòu)建最小可行標注閉環(huán)從bad case到classes.txt的快速反饋發(fā)現(xiàn)漏檢后常遇到兩類問題新類別出現(xiàn)如新增“消防車”但classes.txt無定義子類模糊如“施工區(qū)域”被誤標為“警告標志”。此時必須更新classes.txt并重訓但YOLO要求類別數(shù)nc與classes.txt行數(shù)嚴格一致。安全更新流程步驟操作驗證點1. 擴展classes.txt在末尾追加新類別如fire_truck不刪除舊類行數(shù)nc1→ 錯必須同步改nc2. 修改traffic.yamlnc: 12names: [...]補全12個len(names)nc3. 重生成labels/用LabelImg打開漏檢圖標新類別保存為.txtid11檢查新.txt中是否有11開頭的行4. 合并labels/將新標注文件復制到labels/val/不覆蓋原有文件ls labels/val/ | wc -l應≥原數(shù)量關(guān)鍵細節(jié)YOLOv8允許nc增加但不允許減少。若刪類別必須用--resume從checkpoint續(xù)訓并在train.py中手動過濾掉舊類別ID不推薦易出錯。5.3 表格交通場景11類目標的典型尺寸與YOLO錨點適配建議類別典型像素尺寸1080p圖歸一化尺寸范圍推薦YOLOv8錨點基于k-means聚類是否需單獨調(diào)整scalecar300×150 ~ 800×4000.15~0.42, 0.07~0.20[116,90, 156,198, 373,326]否red_traffic_light40×60 ~ 120×1800.02~0.06, 0.03~0.09—是在model.yaml中為red_traffic_light添加scale: 0.5縮小anchorconstruction_area500×200 ~ 1500×6000.25~0.78, 0.10~0.30—是scale: 1.2放大anchorwarning_sign80×80 ~ 200×2000.04~0.10, 0.04~0.10[30,61, 62,45, 59,119]否實操建議對red_traffic_light這類小目標除了調(diào)整anchor更有效的是在train.py中啟用mosaic0.0關(guān)閉馬賽克增強避免小目標被切碎。從那以后我每次拿到新交通數(shù)據(jù)集都會先跑一遍show.py隨機抽20張圖盯著construction_area和warning_sign這兩類框看3分鐘——如果超過3張框明顯偏移立刻停訓先修標注。這招幫我避開80%的定位類bug省下的調(diào)試時間夠跑兩次消融實驗。希望幫到你。本文還有配套的精品資源點擊獲取