據(jù)集train:從標注到YOLO訓練全流程)
簡介這份紅外小目標飛機檢測數(shù)據(jù)集面向從事紅外圖像目標檢測的研究者與算法工程師尤其適合需要驗證YOLO系列模型在弱小目標場景下性能的開發(fā)者。數(shù)據(jù)以VOC2007格式組織訓練集16551張、驗證集4952張類別僅含air一類可直接接入常見檢測框架進行訓練與評估。壓縮包共2000個文件包含926個xml標注文件、926個txt標簽文件、147個bmp紅外圖像及1個cache緩存文件整體約37.4MB標注與圖像一一對應便于快速構建數(shù)據(jù)加載流程。目前已有169人學習下載。借助該數(shù)據(jù)集讀者可完成從數(shù)據(jù)解析、模型訓練到指標對比的完整實驗鏈路尤其適合研究紅外弱小目標檢測、驗證注意力機制或特征增強模塊效果的場景也可作為論文復現(xiàn)與消融實驗的基礎數(shù)據(jù)來源。1. 紅外小目標飛機檢測數(shù)據(jù)集 train從一份標注文件到能跑通的訓練管線紅外小目標飛機檢測數(shù)據(jù)集 train 這個標題拆開看是三個東西紅外成像、小目標、飛機檢測外加一個 train 劃分。它解決的是在低信噪比、目標只有幾個到幾十個像素、幾乎沒有紋理和顏色信息的紅外圖像里把飛機從云層、地物和噪聲背景中框出來。適合誰做機場周界監(jiān)控、低空預警、遙感紅外偵察、無人機反制這類方向的算法工程師以及手里已經(jīng)拿到一份紅外標注數(shù)據(jù)、想用 YOLO 系列或類似檢測器跑通訓練的人。我見過太多人卡在第一步數(shù)據(jù)拿到了但不知道標注格式對不對、類別怎么定、小目標在訓練時怎么不丟。這篇就按我實際做過的路徑把這份 train 數(shù)據(jù)從檢查、轉換、配置到訓練、排錯講清楚。2. 紅外小目標飛機檢測數(shù)據(jù)集 train 的標注格式與目錄結構怎么核對2.1 先確認標注是 VOC XML 還是 YOLO TXT紅外小目標數(shù)據(jù)集常見的標注格式有兩種PASCAL VOC 的 XML 和 YOLO 的歸一化 TXT。你拿到 train 目錄后第一件事不是急著寫訓練腳本而是看標注文件長什么樣。如果目錄里是Annotations/加JPEGImages/大概率是 VOC如果是images/加labels/且 labels 里是每行class x_center y_center width height那就是 YOLO 格式。兩種格式的轉換邏輯完全不同搞錯了后面全白費。我一般會先跑一段統(tǒng)計腳本把圖像尺寸、標注框數(shù)量、類別分布一次性看清楚。紅外小目標有個特點框特別小寬高經(jīng)常在 8 到 30 像素之間如果圖像本身是 640×512 或 1280×1024歸一化后的寬高可能只有 0.01 到 0.05。這個量級直接決定后面 anchor 和輸入尺寸怎么設。import os import xml.etree.ElementTree as ET from collections import Counter def inspect_voc(anno_dir): stats Counter() sizes [] for f in os.listdir(anno_dir): if not f.endswith(.xml): continue tree ET.parse(os.path.join(anno_dir, f)) root tree.getroot() w int(root.find(size/width).text) h int(root.find(size/height).text) sizes.append((w, h)) for obj in root.findall(object): name obj.find(name).text bbox obj.find(bndbox) bw int(bbox.find(xmax).text) - int(bbox.find(xmin).text) bh int(bbox.find(ymax).text) - int(bbox.find(ymin).text) stats[name] 1 stats[f{name}_w_{bw//10*10}] 1 print(類別與尺寸分布:, stats) print(圖像尺寸樣本:, sizes[:5]) inspect_voc(train/Annotations)這段腳本做三件事遍歷 XML、統(tǒng)計每個類別的框數(shù)量、按 10 像素分桶統(tǒng)計框寬。邏輯說明紅外小目標的框寬分布如果集中在 10 到 20 像素說明輸入網(wǎng)絡前不能做太激進的下采樣。參數(shù)說明bw//10*10是分桶技巧方便看分布如果你發(fā)現(xiàn)某個類別只有個位數(shù)樣本訓練時就要考慮過采樣或合并類別。2.2 目錄結構決定 DataLoader 怎么寫一份規(guī)范的 train 數(shù)據(jù)我期望看到的是目錄/文件作用檢查點images/train訓練圖像格式統(tǒng)一為 jpg 或 png無損壞labels/trainYOLO 標注每張圖對應一個 txt空文件表示無目標classes.txt類別名順序必須和訓練配置一致train.txt圖像路徑列表每行一個絕對或相對路徑如果標注是 VOC你需要先轉成 YOLO。轉換時最容易翻車的地方是坐標越界和浮點精度。紅外小目標框本來就小x_center/w算出來如果有 6 位小數(shù)寫文件時截斷到 6 位就夠但千萬別四舍五入到 2 位否則小框直接消失。import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, img_w, img_h, class_map): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text if name not in class_map: continue cls_id class_map[name] b obj.find(bndbox) xmin float(b.find(xmin).text) ymin float(b.find(ymin).text) xmax float(b.find(xmax).text) ymax float(b.find(ymax).text) xc (xmin xmax) / 2.0 / img_w yc (ymin ymax) / 2.0 / img_h bw (xmax - xmin) / img_w bh (ymax - ymin) / img_h lines.append(f{cls_id} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}) return lines邏輯說明先讀 XML 的寬高再逐 object 算歸一化中心點和寬高。參數(shù)說明class_map是類別名到 id 的映射必須和classes.txt行號一致.6f保留 6 位小數(shù)是 YOLO 生態(tài)的通用做法。轉換完記得抽查幾張圖用可視化腳本把框畫回去確認沒有偏移。3. 用 YOLOv8 在紅外小目標飛機檢測數(shù)據(jù)集 train 上跑通第一輪訓練3.1 環(huán)境與數(shù)據(jù)配置文件的寫法YOLOv8 對紅外小目標不是最優(yōu)解但勝在工程鏈路成熟、文檔多、排錯快。我一般先用它跑一個 baseline確認數(shù)據(jù)管線沒問題再換更針對小目標的檢測頭或注意力模塊。環(huán)境上ultralytics裝最新穩(wěn)定版即可CUDA 版本和顯卡驅動對齊別在這上面省時間。數(shù)據(jù)配置文件plane_ir.yaml這樣寫path: /data/ir_plane train: images/train val: images/val nc: 1 names: 0: plane邏輯說明path是數(shù)據(jù)集根目錄train和val是相對路徑。參數(shù)說明nc是類別數(shù)紅外飛機檢測通常就一類如果你把民航、軍機、無人機分開標這里要對應改。names的順序必須和 labels 里的 class id 一致否則訓練出來的模型會把類別搞反。3.2 訓練命令與關鍵參數(shù)怎么設第一輪訓練不要一上來就 300 epoch先跑 50 epoch 看 loss 曲線和驗證集表現(xiàn)。命令如下yolo detect train \ dataplane_ir.yaml \ modelyolov8s.pt \ imgsz640 \ epochs50 \ batch16 \ lr00.01 \ lrf0.01 \ warmup_epochs3 \ box7.5 \ cls0.5 \ dfl1.5 \ mosaic0.5 \ scale0.3 \ degrees0.0 \ translate0.1 \ fliplr0.5 \ flipud0.0 \ hsv_h0.0 \ hsv_s0.0 \ hsv_v0.0 \ projectruns/ir_plane \ namebaseline邏輯說明紅外圖像沒有顏色信息所以hsv_h/s/v全部關掉開了反而引入噪聲。mosaic0.5是折中值小目標用 mosaic 容易把目標拼到邊緣導致截斷0.5 比默認 1.0 穩(wěn)。scale0.3控制隨機縮放幅度紅外小目標本身像素少縮放太狠會丟。flipud0.0是因為紅外圖像上下翻轉后天空和地面的熱分布不符合物理規(guī)律除非你的數(shù)據(jù)本身就是多角度采集。參數(shù)說明imgsz640是起點如果你顯存夠可以試 1024小目標在更高分辨率下召回會好一些但速度下降明顯。batch16根據(jù)顯存調(diào)8G 顯存跑 640 大概能到 16不夠就降到 8。lr00.01是 SGD 的初始學習率用 AdamW 的話改成 0.001。box7.5是框回歸損失權重小目標定位難可以適當提到 8.0 到 10.0 試。3.3 訓練過程中看什么指標跑起來之后重點看三個東西train/box_loss是否穩(wěn)定下降、metrics/mAP50是否在 20 epoch 后開始爬、val/box_loss和train/box_loss的差距。紅外小目標常見的情況是 mAP50 能到 0.7 以上但 mAP50-95 很低因為框的 IoU 很難做高。這不是訓練失敗是小目標的固有難點。如果 20 epoch 后 mAP50 還在 0.1 以下先別調(diào)模型回去查數(shù)據(jù)。我遇到過標注框整體偏移 2 像素的情況人眼看不出但歸一化后小框的 IoU 直接掉一半。用可視化腳本把預測框和標注框畫在同一張圖上一眼就能看出來。4. 紅外小目標飛機檢測數(shù)據(jù)集 train 的避坑與排查記錄4.1 坑一小目標在 letterbox 后消失現(xiàn)象訓練時 loss 正常下降但驗證集幾乎檢不出目標。原因YOLO 默認的 letterbox 會把圖像縮放到 640×640如果原圖是 1280×1024縮放后小目標可能只剩 4 到 5 像素再經(jīng)過 backbone 的 32 倍下采樣特征圖上就沒了。解決把imgsz提到 1024 或 1280或者改用rectTrue保持長寬比、減少無效填充。更徹底的做法是換小目標檢測頭比如加 P2 層。4.2 坑二空標注文件被當成負樣本現(xiàn)象模型在無目標區(qū)域瘋狂出框誤報率高。原因YOLO 訓練時空 txt 文件會被當作負樣本但如果你的數(shù)據(jù)里空圖比例過高模型會學到“大部分地方?jīng)]目標”的先驗導致漏檢。解決統(tǒng)計空標注比例如果超過 30%要么補充正樣本要么在 DataLoader 里對空圖降采樣。我一般會把空圖比例控制在 10% 到 20%。4.3 坑三類別名大小寫不一致現(xiàn)象訓練能跑但推理時類別顯示為plane或Plane混亂。原因classes.txt里寫的是Planeyaml 里寫的是planeYOLO 按 yaml 為準但可視化工具可能讀另一個。解決統(tǒng)一用小寫并且在轉換腳本里做一次name.lower()。這個坑不致命但交付時很尷尬。4.4 坑四驗證集和訓練集來自同一段視頻現(xiàn)象驗證集 mAP 很高實際部署掉點嚴重。原因紅外視頻連續(xù)幀之間高度相似隨機劃分會導致訓練集和驗證集有大量近似幀。解決按視頻段或時間戳劃分確保驗證集的場景、時段、天氣和訓練集不重疊。這個坑我踩過兩次血淚經(jīng)驗是寧可驗證集小一點也要保證獨立性。4.5 坑五數(shù)據(jù)增強把目標翻沒了現(xiàn)象訓練中期 loss 突然震蕩。原因mosaic加mixup同時開小目標被拼到圖像邊緣后被裁剪掉模型學到的是不完整目標。解決小目標場景下mosaic不超過 0.5mixup直接關掉copy_paste可以開 0.1 到 0.3 補充正樣本。增強策略要服務于數(shù)據(jù)特性不能照搬 COCO 的配置。5. 從 baseline 到可用模型紅外小目標檢測的進階調(diào)優(yōu)技巧第一輪跑通之后別急著堆 epoch。我一般會做三件事?lián)Q輸入分辨率、加 P2 小目標層、用切片推理驗證。換分辨率是最直接的。把imgsz從 640 提到 1024mAP50 通常能漲 5 到 10 個點但推理速度會掉一半。如果你的場景對實時性要求不高比如離線巡檢直接上 1280。如果要求實時考慮用 TensorRT 量化INT8 之后 1024 分辨率也能跑到 30 FPS 以上。加 P2 層需要改模型結構。YOLOv8 的配置文件在ultralytics/cfg/models/v8/yolov8-p2.yaml把 P2 的檢測頭加上特征圖從 80×80 變成 160×160小目標召回明顯提升。代價是顯存和計算量增加batch 可能要降到 8。我試過在紅外飛機數(shù)據(jù)上P2 版本比原版 mAP50-95 高 4 個點左右。切片推理是部署階段的技巧。把大圖切成 512×512 的小塊逐塊推理再合并能有效提升小目標檢出率。SAHI 這個庫可以直接用但要注意重疊區(qū)域的框合并邏輯IoU 閾值設 0.5 到 0.6太低會重復框太高會漏合并。from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction model AutoDetectionModel.from_pretrained( model_typeyolov8, model_pathruns/ir_plane/baseline/weights/best.pt, confidence_threshold0.25, devicecuda:0 ) result get_sliced_prediction( test_ir.jpg, model, slice_height512, slice_width512, overlap_height_ratio0.2, overlap_width_ratio0.2 ) result.export_visuals(export_dirruns/sahi_vis)邏輯說明SAHI 把圖像切片后分別推理再按 NMS 合并。參數(shù)說明slice_height/width根據(jù)你的目標尺寸定目標平均 20 像素的話512 的切片里目標占比合適overlap_ratio0.2是經(jīng)驗值太小會切掉目標太大增加計算量。confidence_threshold0.25比訓練時的 0.5 低因為切片后單塊置信度會下降合并時再篩。最后說一個驗證習慣每次調(diào)完參數(shù)不要只看 mAP把誤報和漏報的圖各抽 20 張出來看。紅外小目標的誤報往往來自云邊緣和地物熱源漏報集中在目標與背景溫差小的場景。看多了你就知道下一步該補數(shù)據(jù)還是改模型。希望幫到你。本文還有配套的精品資源點擊獲取