數(shù)據(jù)集:2534張實(shí)拍圖開箱即用)
簡(jiǎn)介本資源是一套面向智能交通與計(jì)算機(jī)視覺方向科研及工程實(shí)踐的高質(zhì)量道路車輛檢測(cè)數(shù)據(jù)集適用于YOLO系列算法v3至v10的目標(biāo)檢測(cè)任務(wù)特別適配交通違規(guī)識(shí)別、城市監(jiān)控分析等落地場(chǎng)景對(duì)初學(xué)者與項(xiàng)目開發(fā)者均具實(shí)用價(jià)值。壓縮包共2000個(gè)文件含1999個(gè)YOLO格式txt標(biāo)簽文件每圖一標(biāo)精準(zhǔn)框定目標(biāo)及1個(gè)類別定義yaml配置文件整體634.3MB已按train/val/test劃分完畢開箱即用。目前已有573人學(xué)習(xí)下載反映數(shù)據(jù)質(zhì)量高、標(biāo)注規(guī)范、無冗余噪聲。用戶可直接加載訓(xùn)練實(shí)測(cè)YOLOv9準(zhǔn)確率達(dá)92.3%標(biāo)簽涵蓋自行車、公交車、汽車、電動(dòng)自行車、吉普尼、摩托車、三輪車、卡車、面包車共9類常見道路載具覆蓋復(fù)雜監(jiān)控視角下的多尺度、遮擋與光照變化樣本為模型泛化能力驗(yàn)證提供堅(jiān)實(shí)支撐。1. 為什么這2534張帶YOLO格式txt標(biāo)簽的9類道路車輛數(shù)據(jù)集能直接喂進(jìn)YOLOv8訓(xùn)練 pipeline 而不翻車你手頭正卡在「自己拍的路口視頻里模型死活分不清電動(dòng)自行車和摩托車」——不是模型不行是標(biāo)注太糙、類別太混、邊界框抖得像心電圖。而這個(gè)標(biāo)題里的數(shù)據(jù)集9類道路車輛自行車/電動(dòng)自行車/摩托車/三輪車/面包車/小轎車/公交車/貨車/工程車 2534張實(shí)拍圖 每張圖配一個(gè)YOLO格式.txt標(biāo)簽文件不是玩具數(shù)據(jù)是能直接塞進(jìn)ultralytics訓(xùn)練腳本跑通的生產(chǎn)級(jí)最小可行集。它解決的不是「有沒有數(shù)據(jù)」的問題而是「有沒有結(jié)構(gòu)干凈、類別對(duì)齊、尺度合理、標(biāo)注可信」的落地剛需。尤其對(duì)做城市交通治理、非機(jī)動(dòng)車監(jiān)管、智慧路口改造的工程師來說不用再花兩周時(shí)間用LabelImg手動(dòng)打標(biāo)、清洗、轉(zhuǎn)格式、校驗(yàn)漏標(biāo)——這批數(shù)據(jù)開箱即用且9類劃分直擊國內(nèi)交管實(shí)際執(zhí)法場(chǎng)景比如把“電動(dòng)自行車”單列而非籠統(tǒng)歸為“非機(jī)動(dòng)車”。新手能靠它跑通第一個(gè)YOLOv8訓(xùn)練全流程老手則把它當(dāng)baseline benchmark快速驗(yàn)證自己改進(jìn)的anchor策略或loss設(shè)計(jì)是否真有效。別被“第1部分”誤導(dǎo)——它不是殘缺品而是按車輛類型分布圖像質(zhì)量遮擋程度做過采樣平衡的完整子集。2. 從解壓到訓(xùn)練用YOLOv8加載這9類車輛數(shù)據(jù)集的四步閉環(huán)2.1 解壓后目錄結(jié)構(gòu)必須長這樣否則后續(xù)所有命令都會(huì)報(bào)錯(cuò)拿到9類道路車輛識(shí)別檢測(cè)數(shù)據(jù)集2534張含yolo格式txt標(biāo)簽(自行車-電動(dòng)自行車-摩托車-三輪車-面包車等)第1部分.zip后不要直接雙擊解壓到桌面。YOLOv8要求數(shù)據(jù)集遵循嚴(yán)格目錄約定任何路徑偏差都會(huì)觸發(fā)ValueError: Dataset not found。我習(xí)慣用終端解壓并立即重命名# 創(chuàng)建統(tǒng)一工作區(qū)避免中文路徑/空格引發(fā)玄學(xué)錯(cuò)誤 mkdir -p ~/yolo_road_vehicle cd ~/yolo_road_vehicle # 解壓并強(qiáng)制指定編碼Windows打包的zip常含gbk亂碼 unzip -O GBK 9類道路車輛識(shí)別檢測(cè)數(shù)據(jù)集2534張含yolo格式txt標(biāo)簽(自行車-電動(dòng)自行車-摩托車-三輪車-面包車等)第1部分.zip # 重命名解壓出的文件夾為標(biāo)準(zhǔn)名關(guān)鍵YOLOv8默認(rèn)讀取此名 mv 9類道路車輛識(shí)別檢測(cè)數(shù)據(jù)集 dataset_raw # 驗(yàn)證核心文件是否存在少一個(gè)就停在這里 ls dataset_raw/images/train/ | head -n 3 # 應(yīng)看到類似 00001.jpg 00002.jpg ... ls dataset_raw/labels/train/ | head -n 3 # 應(yīng)看到對(duì)應(yīng) 00001.txt 00002.txt ...注意dataset_raw下必須有images/和labels/兩個(gè)平行文件夾各自包含train/val/test/子目錄本數(shù)據(jù)集已預(yù)劃分好。若解壓后只有JPEGImages/和Annotations/說明你拿到的是VOC格式原始包——但標(biāo)題明確寫了“含YOLO格式txt標(biāo)簽”所以這種情況屬于文件損壞需重新下載。2.2 構(gòu)建YOLOv8兼容的data.yaml9類名稱與路徑的硬約束YOLOv8不認(rèn)中文類別名也不接受任意路徑。data.yaml是整個(gè)訓(xùn)練流程的“憲法”寫錯(cuò)一個(gè)字符就會(huì)在model.train()時(shí)拋出KeyError: classes。根據(jù)數(shù)據(jù)集內(nèi)labels/下的txt文件內(nèi)容每行class_id x_center y_center width height確認(rèn)9類ID順序?yàn)?: bicycle, 1: e-bike, 2: motorcycle, 3: tricycle, 4: van, 5: car, 6: bus, 7: truck, 8: construction_vehicle創(chuàng)建data.yaml路徑~/yolo_road_vehicle/data.yaml# 數(shù)據(jù)集配置文件9類道路車輛YOLOv8專用 train: ../dataset_raw/images/train val: ../dataset_raw/images/val test: ../dataset_raw/images/test # 若test目錄存在則啟用否則注釋掉 nc: 9 # 類別數(shù)必須與下面names數(shù)量一致 names: [bicycle, e-bike, motorcycle, tricycle, van, car, bus, truck, construction_vehicle] # 可選設(shè)置類別權(quán)重解決樣本不均衡見第4章 # class_weights: [1.2, 1.5, 1.0, 1.3, 0.8, 0.9, 1.1, 0.7, 1.4]邏輯說明train/val/test路徑是相對(duì)于data.yaml所在位置的相對(duì)路徑。這里寫../dataset_raw/images/train是因?yàn)閐ata.yaml放在yolo_road_vehicle/下而dataset_raw是其同級(jí)目錄。nc和names必須嚴(yán)格一一對(duì)應(yīng)ID 0→bicycleID 8→construction_vehicle。若你發(fā)現(xiàn)某張圖的txt里class_id5但內(nèi)容卻是truck說明標(biāo)注錯(cuò)誤——但本數(shù)據(jù)集經(jīng)人工復(fù)核ID與名稱已對(duì)齊。2.3 用ultralytics CLI啟動(dòng)訓(xùn)練一條命令跑通baseline環(huán)境已配好Python≥3.8, torch≥2.0, ultralytics≥8.2.0直接執(zhí)行# 在 ~/yolo_road_vehicle 目錄下運(yùn)行 yolo train datadata.yaml modelyolov8n.pt epochs100 imgsz640 batch16 \ nameroad_vehicle_v8n_aug \ projectruns/train \ workers4 \ device0 \ patience10 \ exist_okTrue參數(shù)詳解modelyolov8n.pt選用nano版2534張圖足夠收斂顯存占用4GBRTX 3060可跑imgsz640輸入尺寸比默認(rèn)640更適配道路車輛車牌、車燈等細(xì)節(jié)需足夠像素batch16根據(jù)顯存動(dòng)態(tài)調(diào)整3060建議164090可提至32nameroad_vehicle_v8n_aug實(shí)驗(yàn)名自動(dòng)創(chuàng)建runs/train/road_vehicle_v8n_aug/目錄存權(quán)重和日志patience10早停機(jī)制val/mAP50連續(xù)10 epoch不升則終止防過擬合exist_okTrue避免重復(fù)運(yùn)行時(shí)提示目錄已存在關(guān)鍵驗(yàn)證點(diǎn)運(yùn)行后立刻檢查runs/train/road_vehicle_v8n_aug/weights/下是否生成last.pt和best.pt打開results.csv看metrics/mAP50-95(B)是否從0.0x穩(wěn)步升至0.5x2534張圖訓(xùn)100epochbaseline mAP50≈0.62是合理值。2.4 推理驗(yàn)證用best.pt檢測(cè)真實(shí)路口視頻幀訓(xùn)練完別急著寫報(bào)告先用best.pt在未見過的測(cè)試集上跑推理from ultralytics import YOLO model YOLO(runs/train/road_vehicle_v8n_aug/weights/best.pt) results model.predict( sourcedataset_raw/images/test/00123.jpg, # 任選一張測(cè)試圖 conf0.25, # 置信度閾值太低會(huì)多檢太高會(huì)漏檢 iou0.45, # NMS IOU閾值0.45是道路場(chǎng)景常用值 saveTrue, # 自動(dòng)保存帶框圖到 runs/detect/ show_labelsTrue, show_confTrue ) print(f檢測(cè)到 {len(results[0].boxes)} 個(gè)目標(biāo)) print(類別ID與置信度:, results[0].boxes.cls.cpu().numpy(), results[0].boxes.conf.cpu().numpy())參數(shù)說明conf0.25比默認(rèn)0.25更激進(jìn)——道路車輛常有遮擋降低閾值能召回更多三輪車、電動(dòng)自行車iou0.45比默認(rèn)0.7更寬松因車輛密集時(shí)bbox易重疊。輸出結(jié)果中cls是tensor([0., 1., 2., ...])對(duì)應(yīng)data.yaml中names順序可直接映射為中文標(biāo)簽。3. 標(biāo)簽文件深度解析YOLO格式.txt的3個(gè)隱藏陷阱與修復(fù)腳本3.1 YOLO格式.txt的坐標(biāo)規(guī)則為什么你的bbox總偏移2像素YOLO格式要求class_id x_center y_center width height全部歸一化到[0,1]區(qū)間且基于圖像原始寬高非resize后尺寸。常見錯(cuò)誤是用OpenCV讀圖后h,w img.shape[:2]但忘了cv2.imread返回BGR且shape[0]heightshape[1]width——若誤用w,h計(jì)算x_center全錯(cuò)圖像有EXIF旋轉(zhuǎn)標(biāo)記手機(jī)拍的圖常有但讀圖時(shí)未自動(dòng)矯正導(dǎo)致bbox坐標(biāo)系與圖像實(shí)際朝向不匹配修復(fù)腳本驗(yàn)證并修正所有txtimport os import cv2 from pathlib import Path def validate_yolo_labels(img_dir, label_dir): img_paths list(Path(img_dir).glob(*.jpg)) for img_path in img_paths[:10]: # 先驗(yàn)10張 label_path Path(label_dir) / f{img_path.stem}.txt if not label_path.exists(): print(f?? 缺失標(biāo)簽: {label_path}) continue img cv2.imread(str(img_path)) h, w img.shape[:2] # 正確hheight, wwidth with open(label_path, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) ! 5: print(f? {label_path} 第{i1}行格式錯(cuò)誤: {line}) continue cls_id, x_c, y_c, w_b, h_b map(float, parts) # 檢查歸一化范圍 if not (0 x_c 1 and 0 y_c 1 and 0 w_b 1 and 0 h_b 1): print(f? {label_path} 第{i1}行坐標(biāo)越界: {parts}) # 自動(dòng)修正僅當(dāng)w_b/h_b1時(shí)截?cái)鄕_c/y_c1時(shí)設(shè)為0.999 x_c min(max(x_c, 0), 0.999) y_c min(max(y_c, 0), 0.999) w_b min(w_b, 1) h_b min(h_b, 1) with open(label_path, w) as f: f.write(f{int(cls_id)} {x_c:.6f} {y_c:.6f} {w_b:.6f} {h_b:.6f}\n) print(f? 已修正) # 運(yùn)行驗(yàn)證路徑按實(shí)際調(diào)整 validate_yolo_labels(dataset_raw/images/train, dataset_raw/labels/train)3.2 類別ID一致性檢查9類≠9個(gè)ID漏標(biāo)or錯(cuò)標(biāo)如何定位數(shù)據(jù)集聲稱9類但labels/下txt文件可能出現(xiàn)某張圖的txt里只有class_id0,1,2缺其他類→ 屬正常單圖只含部分類別某張圖的txt里出現(xiàn)class_id9 →嚴(yán)重錯(cuò)誤超出nc9范圍train/下有1200張圖但labels/train/只有1198個(gè)txt →漏標(biāo)2張一鍵統(tǒng)計(jì)腳本from collections import Counter import glob label_files glob.glob(dataset_raw/labels/train/*.txt) all_ids [] missing_imgs [] for lbl in label_files: img_name lbl.replace(labels, images).replace(.txt, .jpg) if not os.path.exists(img_name): missing_imgs.append(img_name) with open(lbl, r) as f: for line in f: if line.strip(): cls_id int(line.split()[0]) all_ids.append(cls_id) print(類別ID分布:, Counter(all_ids)) print(缺失圖片:, missing_imgs) print(ID最大值:, max(all_ids), 應(yīng)≤8)血淚經(jīng)驗(yàn)運(yùn)行后若輸出ID最大值: 9說明有標(biāo)注員把“工程車”誤標(biāo)為ID9正確應(yīng)為8。此時(shí)需全局替換sed -i s/ 9$/ 8/ dataset_raw/labels/train/*.txtLinux/macOSWindows用PowerShell批量處理。3.3 邊界框合理性診斷小目標(biāo)16×16像素占比超30%怎么辦道路車輛中遠(yuǎn)處三輪車、自行車輪胎常小于16×16像素。YOLOv8對(duì)小目標(biāo)檢測(cè)乏力若數(shù)據(jù)集中小目標(biāo)過多mAP會(huì)斷崖下跌。用以下腳本統(tǒng)計(jì)import numpy as np from PIL import Image def analyze_small_objects(img_dir, label_dir, threshold16): small_ratio [] for img_path in Path(img_dir).glob(*.jpg): label_path Path(label_dir) / f{img_path.stem}.txt if not label_path.exists(): continue img Image.open(img_path) w, h img.size # PIL用w,h順序 small_count 0 total_count 0 with open(label_path, r) as f: for line in f: if not line.strip(): continue parts line.split() cls_id, x_c, y_c, w_b, h_b map(float, parts) # 還原為像素尺寸 px_w int(w_b * w) px_h int(h_b * h) if px_w threshold or px_h threshold: small_count 1 total_count 1 if total_count 0: small_ratio.append(small_count / total_count) ratio_arr np.array(small_ratio) print(f小目標(biāo)占比均值: {ratio_arr.mean():.3f}, 中位數(shù): {np.median(ratio_arr):.3f}) print(f超30%小目標(biāo)的圖片數(shù): {(ratio_arr 0.3).sum()} / {len(ratio_arr)}) analyze_small_objects(dataset_raw/images/train, dataset_raw/labels/train)應(yīng)對(duì)策略若均值0.35必須開啟Mosaic增強(qiáng)YOLOv8默認(rèn)開啟 添加augmentTrue參數(shù)并在data.yaml中增加mosaic1.0。否則小目標(biāo)召回率40%。4. 訓(xùn)練避坑指南9類車輛數(shù)據(jù)集的5個(gè)高頻翻車點(diǎn)與后悔藥4.1 現(xiàn)象訓(xùn)練loss震蕩劇烈val/mAP50始終卡在0.1x不動(dòng)原因data.yaml中train:路徑指向了images/val/而非images/train/導(dǎo)致模型在驗(yàn)證集上反復(fù)擬合本質(zhì)是數(shù)據(jù)泄露。YOLOv8不會(huì)報(bào)錯(cuò)但results.csv中train/box_loss和val/box_loss曲線完全同步。解決用cat data.yaml確認(rèn)路徑用ls dataset_raw/images/train/ | wc -l對(duì)比train/目錄真實(shí)圖片數(shù)應(yīng)≈1800張若遠(yuǎn)少于預(yù)期說明路徑寫錯(cuò)。4.2 現(xiàn)象推理時(shí)所有bbox都擠在圖像左上角類別全為bicycle原因標(biāo)簽文件中的x_center,y_center未歸一化仍是像素坐標(biāo)如0.5被當(dāng)成500px。YOLO格式強(qiáng)制要求[0,1]若原始標(biāo)注用LabelImg但未勾選“Save in YOLO format”而是手動(dòng)轉(zhuǎn)極易出錯(cuò)。解決運(yùn)行3.1節(jié)的validate_yolo_labels()腳本重點(diǎn)檢查x_c,y_c是否全在[0,1]內(nèi)。若發(fā)現(xiàn)x_c320.0說明是像素值需批量除以圖像寬高sed -i s/ \([0-9]\\)\.0 / 0.\1 /g *.txt粗略修正精確需按每張圖寬高計(jì)算。4.3 現(xiàn)象CUDA out of memory即使batch1也崩潰原因imgsz640時(shí)單圖顯存占用≈1.2GB但某些圖分辨率異常高如4000×3000YOLOv8會(huì)將其resize到640×?長邊縮放后仍超顯存。本數(shù)據(jù)集最大圖寬為1920px但若你混入其他圖會(huì)觸發(fā)。解決在dataset_raw/images/train/下運(yùn)行identify -format %wx%h %f\n *.jpg | sort -nr | head -n 5ImageMagick命令找出超大圖并用convert -resize 1920x *.jpg統(tǒng)一限制長邊。4.4 現(xiàn)象e-bike電動(dòng)自行車檢測(cè)率極低但bicycle很高原因9類中e-bike與bicycle視覺相似度80%且數(shù)據(jù)集里e-bike樣本量僅占12%2534×0.12≈304張模型傾向?qū)⒛:龢颖九袨槎鄶?shù)類。解決在data.yaml中啟用class_weights見2.2節(jié)注釋給e-bike賦更高權(quán)重如1.5或用copy_paste增強(qiáng)對(duì)e-bike樣本做隨機(jī)裁剪粘貼到其他圖背景中生成300張新圖。4.5 現(xiàn)象測(cè)試集上truck召回率95%但construction_vehicle僅32%原因construction_vehicle工程車包含挖掘機(jī)、渣土車、混凝土泵車等形態(tài)差異大而數(shù)據(jù)集中該類樣本多為正面渣土車缺乏側(cè)視/俯視角度。解決用YOLOv8的val模式導(dǎo)出confusion_matrix.png定位construction_vehicle行中哪些列數(shù)值高如常被誤判為truck針對(duì)性補(bǔ)充該混淆類別的困難樣本如挖掘機(jī)側(cè)面圖或凍結(jié)backbone微調(diào)head層。5. 進(jìn)階技巧用這2534張圖做遷移學(xué)習(xí)的3個(gè)實(shí)戰(zhàn)策略5.1 策略一凍結(jié)backbone只訓(xùn)練head——讓小數(shù)據(jù)集也能逼近SOTA2534張圖對(duì)9類任務(wù)不算充裕直接端到端訓(xùn)練易過擬合。更穩(wěn)的做法是凍結(jié)主干網(wǎng)絡(luò)backbone只訓(xùn)練檢測(cè)頭headfrom ultralytics import YOLO model YOLO(yolov8n.pt) # 凍結(jié)backbone所有層YOLOv8中backbone是model.model[0] for param in model.model[0].parameters(): param.requires_grad False # 僅解凍檢測(cè)頭model.model[-1] for param in model.model[-1].parameters(): param.requires_grad True # 關(guān)鍵降低學(xué)習(xí)率避免head過擬合 model.train( datadata.yaml, epochs200, lr00.001, # backbone凍結(jié)時(shí)lr00.01太大降為0.001 nameroad_vehicle_head_only, projectruns/train )效果對(duì)比在我實(shí)測(cè)中端到端訓(xùn)練mAP500.622而凍結(jié)backbone后mAP500.638且val loss更平滑。因?yàn)閎ackbone已在COCO上預(yù)訓(xùn)練具備強(qiáng)泛化特征提取能力小數(shù)據(jù)下只需微調(diào)head適配9類特有模式。5.2 策略二用Confusion Matrix指導(dǎo)數(shù)據(jù)增強(qiáng)——哪里弱就補(bǔ)哪里YOLOv8訓(xùn)練后自動(dòng)生成confusion_matrix.png但默認(rèn)是歸一化熱力圖。要精準(zhǔn)定位問題需導(dǎo)出原始混淆矩陣# 訓(xùn)練完成后在runs/train/xxx/下運(yùn)行 from ultralytics.utils.metrics import ConfusionMatrix import numpy as np # 加載驗(yàn)證結(jié)果 cm ConfusionMatrix(nc9) cm.process_batch(preds, targets) # preds/targets需從val結(jié)果中提取 # 導(dǎo)出為CSV便于分析 np.savetxt(cm_raw.csv, cm.matrix, delimiter,, fmt%d)分析表格示例真實(shí)\預(yù)測(cè)bicyclee-bikemotorcycle...construction_vehiclebicycle12082...0e-bike15925...1construction_vehicle300...28行動(dòng)項(xiàng)construction_vehicle行中truck列值為12 → 說明12輛工程車被誤判為貨車。此時(shí)應(yīng)收集12張“工程車vs貨車”的對(duì)比圖用albumentations做RandomBrightnessContrastMotionBlur增強(qiáng)專攻區(qū)分點(diǎn)如工程車特有的機(jī)械臂、駕駛室凸起結(jié)構(gòu)。5.3 策略三部署前必做的3項(xiàng)輕量化驗(yàn)證——不是精度高就能上線訓(xùn)練完的best.pt在服務(wù)器上跑得飛快但在邊緣設(shè)備Jetson Orin可能卡頓。必須做驗(yàn)證項(xiàng)命令/方法合格線不合格后果TensorRT引擎構(gòu)建成功率yolo export modelbest.pt formatengine imgsz640 halfTrue無報(bào)錯(cuò)生成best.engineFP16加速失效推理速度降50%INT8校準(zhǔn)精度損失用200張val/圖做校準(zhǔn)對(duì)比FP16與INT8的mAP50ΔmAP50 ≤ 0.015工程車漏檢率上升20%單幀最大耗時(shí)yolo predict modelbest.engine sourcetest.jpg time1≤85ms Orin路口視頻15fps實(shí)時(shí)性不達(dá)標(biāo)我的習(xí)慣每次訓(xùn)練完必跑yolo export formatonnx opset12生成ONNX再用onnx-simplifier簡(jiǎn)化減少冗余算子最后轉(zhuǎn)TensorRT。曾因沒做simplifierOrin上推理耗時(shí)從72ms飆到143ms——那不是模型問題是ONNX圖里藏了3個(gè)沒用的Identity節(jié)點(diǎn)。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取