據(jù)集:VOC+YOLO雙格式1300張,4類目標(biāo)直接開訓(xùn))
簡介本數(shù)據(jù)集面向電力巡檢、輸電線路智能監(jiān)控方向的算法工程師與深度學(xué)習(xí)研究者用于訓(xùn)練和驗(yàn)證輸電線異物目標(biāo)檢測模型。數(shù)據(jù)覆蓋氣球、風(fēng)箏、鳥巢、垃圾四類典型異物共1300張jpg圖片每張均配有對(duì)應(yīng)的VOC格式xml與YOLO格式txt標(biāo)注標(biāo)注工具為labelImg采用矩形框方式總框數(shù)1319個(gè)其中鳥巢871框、風(fēng)箏181框、氣球160框、垃圾107框類別分布差異明顯貼近真實(shí)巡檢場景。壓縮包為7z格式內(nèi)含2000個(gè)文件以1300個(gè)xml與700個(gè)txt標(biāo)注文件為主整體約831.71MB目錄結(jié)構(gòu)清晰便于直接接入YOLO或VOC訓(xùn)練流程。需注意約15%的圖片經(jīng)過數(shù)據(jù)增強(qiáng)處理可提升模型泛化能力。目前已有971人學(xué)習(xí)下載適合快速搭建異物檢測基線、開展對(duì)比實(shí)驗(yàn)或擴(kuò)充自有數(shù)據(jù)集。1. 輸電線異物檢測數(shù)據(jù)集1300 張 VOCYOLO 雙格式4 類目標(biāo)直接開訓(xùn)輸電線異物檢測這個(gè)場景真正卡住大多數(shù)團(tuán)隊(duì)的從來不是模型結(jié)構(gòu)而是數(shù)據(jù)。鳥巢、風(fēng)箏、塑料薄膜、氣球這四類東西掛在導(dǎo)線上背景是天空、桿塔、樹林、建筑尺度跨度大、樣本還偏少自己從零標(biāo)一批光標(biāo)注成本就夠喝一壺。這份數(shù)據(jù)集給的是 1300 張已經(jīng)標(biāo)好的圖同時(shí)提供 Pascal VOC 的 XML 和 YOLO 的 TXT 兩套標(biāo)注4 個(gè)類別拿來就能直接進(jìn)訓(xùn)練流程。它適合兩類人一類是想快速驗(yàn)證 YOLO 系列在電力巡檢場景下效果的算法工程師另一類是做輸電線路智能巡檢落地、需要一份能跑通 baseline 的工程團(tuán)隊(duì)。VOC 和 YOLO 雙格式意味著你不用再寫轉(zhuǎn)換腳本省掉最容易出錯(cuò)的一步。2. VOC 與 YOLO 雙格式拆解標(biāo)注結(jié)構(gòu)、類別映射與選型理由2.1 兩套標(biāo)注到底差在哪Pascal VOC 格式的核心是每張圖對(duì)應(yīng)一個(gè) XML 文件里面用object節(jié)點(diǎn)描述每個(gè)目標(biāo)包含name類別名、bndboxxmin、ymin、xmax、ymax 四個(gè)絕對(duì)像素坐標(biāo)。YOLO 格式則是每張圖對(duì)應(yīng)一個(gè) TXT 文件每行一個(gè)目標(biāo)格式是class_id x_center y_center width height后四個(gè)值都是相對(duì)整圖寬高的歸一化值范圍 0 到 1。這兩種格式的差異不只是坐標(biāo)表達(dá)還牽扯到訓(xùn)練框架的讀取邏輯。VOC 的絕對(duì)坐標(biāo)在圖像增強(qiáng)比如隨機(jī)縮放、裁剪時(shí)需要重新計(jì)算而 YOLO 的歸一化坐標(biāo)在 resize 后天然保持比例這也是 Ultralytics 系框架默認(rèn)吃 YOLO 格式的原因。數(shù)據(jù)集同時(shí)給兩套等于把「用 mmdetection 走 VOC」和「用 YOLOv5/v8 走 YOLO」兩條路都鋪好了。對(duì)比項(xiàng)VOC (XML)YOLO (TXT)坐標(biāo)類型絕對(duì)像素 (xmin,ymin,xmax,ymax)歸一化中心點(diǎn)寬高類別表示字符串類別名整數(shù) class_id一圖多目標(biāo)多個(gè)object節(jié)點(diǎn)多行文本常用框架mmdetection、Detectron2Ultralytics YOLO 系列增強(qiáng)友好度需同步變換坐標(biāo)resize 后自動(dòng)適配2.2 4 類別映射與類別不平衡4 個(gè)類別在電力巡檢里是高頻異物鳥巢、風(fēng)箏、塑料薄膜含地膜、大棚膜、氣球。這四類在真實(shí)場景里的出現(xiàn)頻率并不均勻鳥巢和風(fēng)箏相對(duì)多氣球和薄膜偏少。拿到數(shù)據(jù)集第一件事不是直接開訓(xùn)而是先統(tǒng)計(jì)每個(gè)類別的框數(shù)量確認(rèn)有沒有某一類少到影響收斂。常見做法是寫個(gè)統(tǒng)計(jì)腳本遍歷 labels 目錄下的 TXT按 class_id 累加。如果發(fā)現(xiàn)某類樣本數(shù)不到總數(shù)的 5%就要考慮在訓(xùn)練時(shí)用類別權(quán)重或者對(duì)少數(shù)類做過采樣。這一步不做訓(xùn)出來的模型大概率對(duì)薄膜和氣球幾乎無響應(yīng)mAP 被多數(shù)類拉高實(shí)際巡檢時(shí)漏檢。import os from collections import Counter label_dir labels/train # YOLO 格式標(biāo)簽?zāi)夸?counter Counter() for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname)) as f: for line in f: line line.strip() if not line: continue cls_id int(line.split()[0]) # 每行第一個(gè)字段是類別 id counter[cls_id] 1 # 輸出每個(gè)類別的框數(shù)量用于判斷類別不平衡 for cls_id in sorted(counter): print(fclass {cls_id}: {counter[cls_id]} boxes)這段腳本的邏輯很直接逐文件讀 TXT取每行首字段作為類別 id 累加。參數(shù)上唯一要注意的是label_dir要指向 YOLO 格式的標(biāo)簽?zāi)夸洸皇?VOC 的 XML 目錄。跑完你會(huì)得到類似class 0: 620 boxes這樣的分布如果某一類只有幾十個(gè)框后面訓(xùn)練配置里就得針對(duì)性處理。2.3 目錄組織與 data.yaml 配置YOLO 訓(xùn)練要求固定的目錄結(jié)構(gòu)images/train、images/val、labels/train、labels/val圖片和標(biāo)簽同名不同后綴。數(shù)據(jù)集解壓后如果 VOC 和 YOLO 是分開的兩個(gè)文件夾需要先把 YOLO 那套按 train/val 分好。常見做法是按 8:2 或 7:3 切分切分時(shí)用固定隨機(jī)種子保證可復(fù)現(xiàn)。# data.yaml —— Ultralytics YOLO 訓(xùn)練配置 path: /data/transmission_line # 數(shù)據(jù)集根目錄 train: images/train # 訓(xùn)練集圖片相對(duì)路徑 val: images/val # 驗(yàn)證集圖片相對(duì)路徑 nc: 4 # 類別數(shù)本數(shù)據(jù)集為 4 names: # 類別名順序必須與 class_id 對(duì)應(yīng) 0: nest 1: kite 2: plastic_film 3: balloonnc和names的順序必須和標(biāo)注文件里的 class_id 嚴(yán)格一致這是最容易翻車的地方。如果 VOC 的 XML 里類別名順序和 YOLO 的 class_id 映射對(duì)不上訓(xùn)出來的模型會(huì)把鳥巢認(rèn)成氣球。建議先用一小批圖做可視化驗(yàn)證把框畫回原圖上看類別對(duì)不對(duì)再開始正式訓(xùn)練。3. 從解壓到跑通 baselineYOLOv8 訓(xùn)練全流程與參數(shù)設(shè)置3.1 環(huán)境準(zhǔn)備與數(shù)據(jù)校驗(yàn)訓(xùn)練前先把環(huán)境搭好。Ultralytics 的 YOLOv8 對(duì) PyTorch 版本有要求常見組合是 Python 3.9、PyTorch 1.13 或 2.x、CUDA 11.7/11.8。裝完框架后不要急著 train先做一次數(shù)據(jù)校驗(yàn)確認(rèn)圖片能正常讀取、標(biāo)簽沒有越界坐標(biāo)。# 安裝 ultralytics pip install ultralytics # 快速校驗(yàn)數(shù)據(jù)集用 YOLO 自帶校驗(yàn)會(huì)檢查標(biāo)簽格式和圖片可讀性 yolo checksyolo checks會(huì)輸出環(huán)境信息和數(shù)據(jù)集的基本檢查結(jié)果。如果標(biāo)簽里有坐標(biāo)超過 1.0 或者負(fù)數(shù)訓(xùn)練時(shí)不會(huì)報(bào)錯(cuò)但會(huì)靜默丟棄導(dǎo)致實(shí)際參與訓(xùn)練的目標(biāo)變少。所以校驗(yàn)這一步不能省尤其是別人標(biāo)的數(shù)據(jù)集標(biāo)注質(zhì)量參差不齊是常態(tài)。3.2 訓(xùn)練命令與關(guān)鍵參數(shù)baseline 用 YOLOv8n 或 YOLOv8s 起步1300 張圖不算大n 版本能在單卡上很快跑完一輪先確認(rèn)流程通不通再換大模型。# 以 YOLOv8s 為例輸入 640batch 16訓(xùn)練 100 epoch yolo detect train \ datadata.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ device0 \ projectruns/transmission \ nameexp1參數(shù)逐個(gè)說imgsz640是輸入分辨率輸電線異物里鳥巢和風(fēng)箏尺度中等640 夠用如果薄膜這種小目標(biāo)漏檢多可以提到 1024 但顯存要跟上。batch16在 8G 顯存上跑 640 分辨率基本安全顯存不夠就降到 8。lr00.01是初始學(xué)習(xí)率YOLOv8 默認(rèn)用 SGD 時(shí)這個(gè)值合適如果換 AdamW 要降到 0.001 量級(jí)。patience20是早停20 輪驗(yàn)證指標(biāo)不升就停避免過擬合。device0指定第一塊 GPU。3.3 訓(xùn)練過程監(jiān)控與指標(biāo)解讀訓(xùn)練啟動(dòng)后重點(diǎn)看三個(gè)指標(biāo)box_loss、cls_loss、mAP50。box_loss 下降說明框回歸在收斂cls_loss 下降說明分類在學(xué)mAP50 是 IoU 閾值 0.5 下的平均精度。輸電線異物檢測里鳥巢和風(fēng)箏通常 mAP 能到 0.8 以上薄膜和氣球因?yàn)闃颖旧?、目?biāo)小可能只有 0.5 到 0.6這是數(shù)據(jù)分布決定的不是模型問題。如果訓(xùn)練到 30 輪左右 mAP 還在 0.2 以下先別懷疑模型回去查標(biāo)簽。常見原因是類別 id 映射錯(cuò)了或者圖片和標(biāo)簽文件名沒對(duì)上比如圖片叫001.jpg標(biāo)簽叫001.txt但實(shí)際內(nèi)容對(duì)不上。用yolo detect predict跑幾張訓(xùn)練集圖片看預(yù)測框和真實(shí)框是否重合能快速定位是數(shù)據(jù)問題還是訓(xùn)練問題。# 用訓(xùn)練好的權(quán)重在驗(yàn)證集上跑預(yù)測可視化檢查 yolo detect predict \ modelruns/transmission/exp1/weights/best.pt \ sourceimages/val \ conf0.25 \ saveTrueconf0.25是置信度閾值低于這個(gè)值的框不顯示。檢查時(shí)重點(diǎn)看漏檢和誤檢漏檢多說明模型沒學(xué)好或者目標(biāo)太小誤檢多說明背景干擾大或者閾值太低。這一步是判斷數(shù)據(jù)集能不能用的關(guān)鍵指標(biāo)好看但可視化一塌糊涂的情況并不少見。4. 避坑與排查標(biāo)注、格式、訓(xùn)練里最容易翻車的五件事4.1 現(xiàn)象訓(xùn)練 loss 正常下降但 mAP 始終為 0原因類別 id 和 names 映射錯(cuò)位或者標(biāo)簽文件里 class_id 超出了nc范圍。YOLO 對(duì)越界 class_id 不報(bào)錯(cuò)直接忽略該目標(biāo)導(dǎo)致模型學(xué)不到任何有效分類。解決用 2.2 的統(tǒng)計(jì)腳本確認(rèn) class_id 最大值小于nc再用可視化腳本把標(biāo)簽框畫回原圖逐類核對(duì)類別名。確認(rèn)無誤后再重新訓(xùn)練。4.2 現(xiàn)象圖片能讀但標(biāo)簽全部丟失原因YOLO 要求圖片和標(biāo)簽同名且在同一級(jí)目錄結(jié)構(gòu)下如果圖片是.jpg而標(biāo)簽是.JPG.txt或者放在不匹配的路徑框架找不到標(biāo)簽。解決寫腳本統(tǒng)一文件名去掉多余后綴確保images/train/001.jpg對(duì)應(yīng)labels/train/001.txt。批量重命名前先備份改錯(cuò)了還能回滾。4.3 現(xiàn)象VOC 轉(zhuǎn) YOLO 后框位置整體偏移原因VOC 的坐標(biāo)是 1-based 還是 0-based 取決于標(biāo)注工具有些工具 xmin 從 1 開始轉(zhuǎn) YOLO 時(shí)沒減 1導(dǎo)致整體偏移一個(gè)像素。更常見的是歸一化時(shí)用了錯(cuò)誤的圖像寬高比如用了縮放后的尺寸而不是原圖尺寸。解決轉(zhuǎn)換腳本里統(tǒng)一用原圖寬高做歸一化并在轉(zhuǎn)換后隨機(jī)抽 10 張圖可視化對(duì)比。偏移一個(gè)像素在大目標(biāo)上不明顯在小目標(biāo)上可能就是 IoU 從 0.6 掉到 0.4。4.4 現(xiàn)象訓(xùn)練到一半顯存爆了原因imgsz或batch設(shè)太大或者驗(yàn)證階段沒有限制 batch。YOLOv8 訓(xùn)練和驗(yàn)證的顯存占用不同驗(yàn)證時(shí)如果val_batch沒設(shè)默認(rèn)可能偏大。解決先把batch降到 8 或 4imgsz保持 640。如果還爆檢查是不是有其他進(jìn)程占著顯存。訓(xùn)練命令里加val_batch8限制驗(yàn)證階段的 batch 大小。4.5 現(xiàn)象模型對(duì)薄膜和氣球幾乎不響應(yīng)原因這兩類樣本數(shù)太少模型被多數(shù)類主導(dǎo)少數(shù)類的梯度被淹沒。解決訓(xùn)練時(shí)加類別權(quán)重或者在數(shù)據(jù)加載階段對(duì)少數(shù)類做復(fù)制過采樣。Ultralytics 不直接支持類別權(quán)重常見做法是手動(dòng)復(fù)制少數(shù)類的圖片和標(biāo)簽讓各類框數(shù)量大致均衡。復(fù)制時(shí)注意 train/val 要同步別只復(fù)制訓(xùn)練集導(dǎo)致驗(yàn)證集分布不一致。5. 進(jìn)階技巧用 VOC 原始標(biāo)注做交叉驗(yàn)證與模型選型數(shù)據(jù)集給了 VOC 和 YOLO 兩套標(biāo)注大多數(shù)人只用 YOLO 那套VOC 那套就閑置了。其實(shí) VOC 的 XML 可以用來做一件很有價(jià)值的事交叉驗(yàn)證標(biāo)注一致性。具體做法是寫一個(gè)腳本把 VOC 的 XML 解析成 YOLO 格式再和數(shù)據(jù)集自帶的 YOLO 標(biāo)簽逐框?qū)Ρ瓤磧商讟?biāo)注是否一致。如果發(fā)現(xiàn)某些圖的兩套標(biāo)注框數(shù)量或位置差異很大說明標(biāo)注本身有歧義這些圖在訓(xùn)練時(shí)可能引入噪聲可以考慮剔除或重新標(biāo)。import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, img_w, img_h): 把 VOC XML 轉(zhuǎn)成 YOLO 格式的列表用于和自帶 YOLO 標(biāo)簽對(duì)比 tree ET.parse(xml_path) root tree.getroot() boxes [] for obj in root.findall(object): cls_name obj.find(name).text bndbox obj.find(bndbox) xmin float(bndbox.find(xmin).text) ymin float(bndbox.find(ymin).text) xmax float(bndbox.find(xmax).text) ymax float(bndbox.find(ymax).text) # 轉(zhuǎn)成歸一化中心點(diǎn)寬高 xc (xmin xmax) / 2.0 / img_w yc (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h boxes.append((cls_name, xc, yc, w, h)) return boxes這段代碼的核心是把 VOC 的絕對(duì)坐標(biāo)轉(zhuǎn)成 YOLO 的歸一化坐標(biāo)參數(shù)img_w和img_h必須是原圖尺寸不能是縮放后的。轉(zhuǎn)換完拿兩套框做 IoU 對(duì)比IoU 低于 0.5 的就算不一致統(tǒng)計(jì)不一致比例。如果比例超過 5%這批數(shù)據(jù)在訓(xùn)練前就得先清洗。另一個(gè)進(jìn)階用法是模型選型。1300 張圖、4 類目標(biāo)屬于中小規(guī)模數(shù)據(jù)集。YOLOv8n 和 YOLOv8s 通常夠用但如果部署端是邊緣設(shè)備n 版本更合適如果追求精度且算力充足可以試 YOLOv8m。選型時(shí)不要只看 mAP還要看推理速度。用yolo detect val跑一遍驗(yàn)證集同時(shí)記錄每張圖的推理耗時(shí)綜合精度和速度再定。# 驗(yàn)證模型精度和速度 yolo detect val \ modelruns/transmission/exp1/weights/best.pt \ datadata.yaml \ imgsz640 \ batch8 \ device0驗(yàn)證輸出里會(huì)包含mAP50、mAP50-95和每張圖的預(yù)處理、推理、后處理耗時(shí)。輸電線巡檢如果走無人機(jī)實(shí)時(shí)回傳推理耗時(shí)超過 50ms 就要考慮換更小的模型或者用 TensorRT 加速。這些決策都建立在數(shù)據(jù)集跑通、指標(biāo)可信的基礎(chǔ)上而這份雙格式數(shù)據(jù)集正好把最耗時(shí)的數(shù)據(jù)準(zhǔn)備環(huán)節(jié)省掉了。從那以后我每次拿到新數(shù)據(jù)集第一件事都是先跑類別統(tǒng)計(jì)和可視化校驗(yàn)確認(rèn)標(biāo)簽沒問題再開訓(xùn)這個(gè)習(xí)慣幫我省下了至少三次白跑一整晚的算力。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取