行人檢測數(shù)據(jù)集實(shí)戰(zhàn):從標(biāo)注校驗(yàn)到Y(jié)OLO模型訓(xùn)練避坑指南)
簡介面向無人機(jī)視覺與計(jì)算機(jī)視覺研究者、開發(fā)者的行人檢測數(shù)據(jù)集旨在為無人機(jī)航拍場景下的行人識(shí)別與避障提供高質(zhì)量訓(xùn)練材料。整個(gè)壓縮包共1895個(gè)文件包含630張jpg原圖、630個(gè)xml邊界框標(biāo)注、634個(gè)txt標(biāo)簽說明并附1個(gè)py預(yù)處理/轉(zhuǎn)換腳本包體約206.8MB。數(shù)據(jù)已劃分訓(xùn)練集、測試集和驗(yàn)證集圖像與標(biāo)注一一對(duì)應(yīng)覆蓋從數(shù)據(jù)準(zhǔn)備、格式轉(zhuǎn)換到模型訓(xùn)練、評(píng)估的完整鏈路可直接用于YOLO、Faster R-CNN、SSD等主流檢測框架免去自行采集和標(biāo)注的繁瑣工作。讀者既能據(jù)此驗(yàn)證航拍視角下的檢測效果也能通過對(duì)比實(shí)驗(yàn)分析不同模型性能同時(shí)學(xué)習(xí)PASCAL VOC風(fēng)格標(biāo)注與txt標(biāo)簽的組織方式。目前已有3956人學(xué)習(xí)下載適合無人機(jī)巡檢、安防監(jiān)控、智慧交通等場景下的算法研究與工程實(shí)踐。1. 無人機(jī)行人檢測數(shù)據(jù)集標(biāo)注好了不等于直接能用關(guān)鍵看這四件事一個(gè)“已標(biāo)注”的無人機(jī)行人檢測數(shù)據(jù)集聽起來像是拿到了現(xiàn)成的答案解壓、訓(xùn)練、出模型三步走完。但我在本地跑過幾個(gè)公開渠道能找到的無人機(jī)視角行人檢測數(shù)據(jù)集之后最大的感受是標(biāo)注好只是起點(diǎn)能不能讓模型真的在無人機(jī)畫面上把人檢出來取決于標(biāo)注質(zhì)量、視角分布、目標(biāo)尺寸和場景覆蓋這四件事。這也是為什么同樣用“已標(biāo)注”的數(shù)據(jù)集有人三天跑出能用的模型有人折騰兩周還在跟漏檢和誤檢搏斗。這篇文章要解決的就是把你從“拿到數(shù)據(jù)集”帶到“模型能落地”這段路。適合正在做無人機(jī)巡檢、安防監(jiān)控、智慧城市相關(guān)項(xiàng)目的開發(fā)者也適合剛?cè)腴T目標(biāo)檢測、想用現(xiàn)成數(shù)據(jù)集快速驗(yàn)證算法思路的同學(xué)。我會(huì)從數(shù)據(jù)集的構(gòu)成和標(biāo)注規(guī)范講起然后給出一套從數(shù)據(jù)校驗(yàn)到模型訓(xùn)練的可復(fù)現(xiàn)流程最后把高手才會(huì)注意的邊界條件和踩坑點(diǎn)拆開講。2. 數(shù)據(jù)集構(gòu)成與標(biāo)注規(guī)范先弄清楚“已標(biāo)注”到底標(biāo)注了什么拿到任何一個(gè)“已標(biāo)注”的無人機(jī)行人檢測數(shù)據(jù)集第一件事不是解壓跑腳本而是先看清楚它的目錄結(jié)構(gòu)和標(biāo)注格式。很多翻車現(xiàn)場都是從這里開始的看起來是同一套標(biāo)注格式實(shí)際用的時(shí)候才發(fā)現(xiàn)坐標(biāo)系統(tǒng)、類別編號(hào)、圖片尺寸記錄方式對(duì)不上白白浪費(fèi)一下午。2.1 數(shù)據(jù)來源與場景分布先判斷它適不適合你的任務(wù)無人機(jī)視角的行人檢測和普通監(jiān)控?cái)z像頭視角有本質(zhì)區(qū)別。監(jiān)控?cái)z像頭大多是俯仰角固定、目標(biāo)尺度相對(duì)穩(wěn)定無人機(jī)是俯視視角行人在畫面里通常是小目標(biāo)占比不到整張圖的百分之幾而且會(huì)隨飛行高度和速度發(fā)生劇烈的尺度變化。數(shù)據(jù)里如果大多數(shù)圖片的拍攝高度在30米以下、行人占比大那你拿去做50米高度的巡檢任務(wù)就會(huì)出現(xiàn)明顯漏檢。我一般拿到數(shù)據(jù)集先做三件事統(tǒng)計(jì)圖片分辨率分布、統(tǒng)計(jì)標(biāo)注框面積分布、統(tǒng)計(jì)每張圖的平均目標(biāo)數(shù)。這三個(gè)數(shù)字直接決定這個(gè)數(shù)據(jù)集適不適合當(dāng)前任務(wù)。標(biāo)注框面積分布特別值得看——如果絕大多數(shù)框的長邊小于64像素訓(xùn)練時(shí)需要重點(diǎn)考慮小目標(biāo)檢測策略如果數(shù)據(jù)和實(shí)際作業(yè)高度落差太大優(yōu)先找同場景的數(shù)據(jù)集或者自己補(bǔ)采。2.2 標(biāo)注格式與目錄結(jié)構(gòu)VOC、YOLO還是COCO常見的無人機(jī)行人檢測數(shù)據(jù)集有三種標(biāo)注形態(tài)Pascal VOC格式的XML文件、YOLO格式的TXT文件、COCO格式的JSON文件。三種格式的坐標(biāo)表達(dá)方式不同VOC和COCO都是絕對(duì)像素坐標(biāo)且用xmin、ymin、xmax、ymax這類方式記錄YOLO格式用的是歸一化的中心點(diǎn)坐標(biāo)和寬高。圖片尺寸記錄這件事也容易踩坑VOC的XML里帶有圖片寬高可以直接校驗(yàn)YOLO的TXT不帶尺寸信息如果原始圖片被縮放標(biāo)注坐標(biāo)會(huì)全軍覆沒。我習(xí)慣用下面這條命令先摸清目錄結(jié)構(gòu)再?zèng)Q定怎么下手# 查看數(shù)據(jù)集目錄樹限制層級(jí)為3 cd dataset_root tree -L 3 -d # 統(tǒng)計(jì)圖片數(shù)量、XML/TXT/JSON標(biāo)注文件數(shù)量 find . -name *.jpg | wc -l find . -name *.xml | wc -l輸出結(jié)果能告訴你數(shù)據(jù)集是原始結(jié)構(gòu)還是已經(jīng)做了劃分。如果是劃分好的通常有train、val、test三個(gè)目錄但不少數(shù)據(jù)集只分了兩部分需要自己再切一次驗(yàn)證集。# 統(tǒng)計(jì)標(biāo)注框尺寸分布的Python腳本片段 # 這里按照YOLO格式的txt標(biāo)注為例 import os from collections import Counter img_width, img_height 1920, 1080 size_bins Counter() label_dir labels/train for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fp: for line in fp: _, cx, cy, w, h line.strip().split() pixel_w float(w) * img_width pixel_h float(h) * img_height if pixel_w 32 or pixel_h 32: size_bins[tiny] 1 elif pixel_w 96 or pixel_h 96: size_bins[small] 1 else: size_bins[large] 1 print(size_bins)這段腳本的關(guān)鍵作用是提前暴露目標(biāo)尺度分布。如果tiny類占比超過一半后面訓(xùn)練必須啟用多尺度訓(xùn)練和更高分辨率的輸入圖。代碼里img_width和img_height需要改成你手里數(shù)據(jù)的真實(shí)值不確定的話用Python的PIL庫批量讀取一張圖確認(rèn)。標(biāo)注文件的格式如果是VOC或者COCO解析邏輯要相應(yīng)改成XML或JSON取值但判斷思路是一樣的。3. 把數(shù)據(jù)集跑起來從解壓到可視化校驗(yàn)的一條龍操作數(shù)據(jù)集的目錄結(jié)構(gòu)摸清了標(biāo)注格式也確認(rèn)了接下來不能直接進(jìn)訓(xùn)練。先做可視化校驗(yàn)這是整個(gè)流程里最便宜的一道后悔藥把標(biāo)注框畫到原圖上人眼看一遍就能發(fā)現(xiàn)坐標(biāo)偏移、類別錯(cuò)標(biāo)、框沒貼住目標(biāo)這些問題。省下的是后面訓(xùn)練半天發(fā)現(xiàn)loss不下降的排查時(shí)間。3.1 先做數(shù)據(jù)劃分與文件完整性檢查訓(xùn)練前一定要?jiǎng)澐謹(jǐn)?shù)據(jù)。不要直接拿所有圖片訓(xùn)練否則你連模型過擬合還是欠擬合都判斷不了。常見做法是訓(xùn)練集、驗(yàn)證集、測試集按7:2:1劃分。如果數(shù)據(jù)集本身劃分好了檢查一遍文件是否齊整——圖片和標(biāo)注文件一一對(duì)應(yīng)是這步的重點(diǎn)。# 檢查圖片與標(biāo)注文件是否一一對(duì)應(yīng) import os from pathlib import Path def check_pairs(img_dir, label_dir): imgs {Path(f).stem for f in os.listdir(img_dir) if f.endswith((.jpg, .jpeg, .png))} labels {Path(f).stem for f in os.listdir(label_dir) if f.endswith(.txt)} img_only imgs - labels label_only labels - imgs print(f缺標(biāo)注的圖片數(shù): {len(img_only)}) print(f缺圖片的標(biāo)注數(shù): {len(label_only)}) # 打印前5個(gè)缺標(biāo)注的圖片名方便定位 for name in list(img_only)[:5]: print(missing label:, name) check_pairs(images/train, labels/train)這段代碼用意是暴露配對(duì)問題。很多數(shù)據(jù)集從網(wǎng)盤下載后會(huì)出現(xiàn)文件缺失或文件名被截?cái)嘀苯佑猛暾臄?shù)據(jù)集訓(xùn)練會(huì)讓模型在加載時(shí)報(bào)錯(cuò)或者默認(rèn)跳過某些圖片。缺標(biāo)注的圖片一定要從訓(xùn)練集里剔除否則訓(xùn)練過程中會(huì)隨機(jī)報(bào)錯(cuò)而且報(bào)錯(cuò)信息往往不直觀只顯示一個(gè)DataLoader worker崩潰。剔除缺標(biāo)注圖片的方法不復(fù)雜把上面腳本里img_only里的文件移到另一個(gè)目錄或者生成一個(gè)保留清單。我一般直接把訓(xùn)練清單寫成文本訓(xùn)練腳本讀取這個(gè)清單來加載圖片這樣比物理移動(dòng)文件更靈活后面增刪樣本也方便。3.2 用可視化腳本給標(biāo)注框畫出來坐標(biāo)對(duì)不對(duì)一眼便知校驗(yàn)標(biāo)注正確性最快的方式就是畫框。下面這段腳本讀取YOLO格式標(biāo)注并畫在圖上輸出到preview目錄。代碼里做了坐標(biāo)越界判斷這是從踩坑里學(xué)來的不少數(shù)據(jù)集的標(biāo)注框有極小概率越界如果不加保護(hù)后續(xù)變成COCO或VOC格式時(shí)數(shù)值會(huì)異常。# 可視化YOLO標(biāo)注輸出效果預(yù)覽圖 import cv2 import os import numpy as np def draw_yolo_boxes(img_path, label_path, out_dir): img cv2.imread(img_path) h, w img.shape[:2] colors [(0, 255, 0), (0, 0, 255), (255, 0, 0)] with open(label_path) as fp: for line in fp: parts line.strip().split() if len(parts) ! 5: continue cls int(parts[0]) cx, cy, bw, bh map(float, parts[1:]) # 反歸一化還原像素坐標(biāo) x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) # 越界裁剪 x1, y1 max(0, x1), max(0, y1) x2, y2 min(w, x2), min(h, y2) cv2.rectangle(img, (x1, y1), (x2, y2), colors[cls % len(colors)], 2) cv2.putText(img, fcls-{cls}, (x1, max(0, y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, colors[cls % len(colors)], 1) os.makedirs(out_dir, exist_okTrue) cv2.imwrite(os.path.join(out_dir, os.path.basename(img_path)), img) # 遍歷前50張訓(xùn)練圖做預(yù)覽 img_dir images/train label_dir labels/train for i, fname in enumerate(os.listdir(img_dir)): if i 50: break stem os.path.splitext(fname)[0] lbl os.path.join(label_dir, stem .txt) if os.path.exists(lbl): draw_yolo_boxes(os.path.join(img_dir, fname), lbl, preview)從預(yù)覽圖里最容易發(fā)現(xiàn)的幾個(gè)問題框整體偏移說明坐標(biāo)歸一化基準(zhǔn)不對(duì)某些框?qū)捀邽?說明標(biāo)注文件損壞類別編號(hào)大量超出預(yù)期說明數(shù)據(jù)集里可能混入了其他類別的樣本。這批預(yù)覽圖務(wù)必肉眼過一遍至少抽看訓(xùn)練集、驗(yàn)證集、測試集各一部分。我見過有人在這個(gè)環(huán)節(jié)發(fā)現(xiàn)整個(gè)數(shù)據(jù)集的標(biāo)注都沒有貼住行人而是框住了背景這種問題不提前發(fā)現(xiàn)訓(xùn)練再久也不會(huì)有好結(jié)果。4. 用數(shù)據(jù)集訓(xùn)練檢測模型完整流程與關(guān)鍵參數(shù)校驗(yàn)沒問題就到了正式訓(xùn)練環(huán)節(jié)。多數(shù)人拿到“已標(biāo)注”的無人機(jī)行人檢測數(shù)據(jù)集目標(biāo)是把模型訓(xùn)練到一個(gè)能用的水平。這個(gè)部分我以YOLO系列為例展開這也是目前無人機(jī)目標(biāo)檢測里最主流的方案兼顧速度和精度。訓(xùn)練流程上覆蓋從選模型到判讀訓(xùn)練曲線的完整路徑。4.1 模型選型與數(shù)據(jù)格式適配模型選型的核心邏輯是算力有限就優(yōu)先考慮YOLO系列的輕量版本需要極致精度且推理設(shè)備允許大模型再往上加。無人機(jī)場景通常是在嵌入式設(shè)備或者邊緣計(jì)算盒子上跑推理參數(shù)規(guī)模太大會(huì)帶來幀率壓力。經(jīng)驗(yàn)值是在30萬像素級(jí)別的輸入分辨率下輕量版能做到實(shí)時(shí)標(biāo)準(zhǔn)版有明顯精度優(yōu)勢但速度下降明顯。數(shù)據(jù)格式適配這一步是把第3章校驗(yàn)通過的YOLO格式TXT和圖片組織成訓(xùn)練框架要求的目錄結(jié)構(gòu)。不同框架對(duì)數(shù)據(jù)組織方式要求不同但訓(xùn)練集和驗(yàn)證集的圖、標(biāo)分別放兩個(gè)目錄是最通用的做法# YOLO系訓(xùn)練框架通用的數(shù)據(jù)目錄布局 datasets/ drone_person/ images/ train/ # 訓(xùn)練集圖片 val/ # 驗(yàn)證集圖片 labels/ train/ # 訓(xùn)練集標(biāo)注txt val/ # 驗(yàn)證集標(biāo)注txt data.yaml # 數(shù)據(jù)配置文件data.yaml是訓(xùn)練入口里面記錄類別數(shù)、類別名和路徑。寫這個(gè)文件時(shí)有個(gè)高頻坑路徑最好寫絕對(duì)路徑或者使用相對(duì)當(dāng)前工作目錄的路徑不要寫一個(gè)看起來對(duì)但實(shí)際不存在的路徑。# data.yaml 內(nèi)容示例 path: /home/user/datasets/drone_person train: images/train val: images/val nc: 1 names: [person]這個(gè)文件的難點(diǎn)不在格式在于理解path字段的基準(zhǔn)意義。很多框架會(huì)基于path拼接train和val的路徑如果你把train寫成/home/user/datasets/...這種絕對(duì)路徑框架會(huì)拼出一串錯(cuò)誤的地址。建議先寫相對(duì)路徑images/train然后在命令行驗(yàn)證路徑拼接結(jié)果??蚣軉?dòng)時(shí)會(huì)打印實(shí)際加載的圖片路徑掃一眼就能確認(rèn)。4.2 訓(xùn)練啟動(dòng)與參數(shù)調(diào)整訓(xùn)練啟動(dòng)命令看著簡單但參數(shù)怎么設(shè)直接決定結(jié)果上限。我常用的訓(xùn)練命令如下# 以YOLO系框架為例啟動(dòng)訓(xùn)練 yolo train \ modelyolov8s.pt \ datadata.yaml \ epochs100 \ imgsz1280 \ batch16 \ lr00.01 \ mosaic0.5逐個(gè)說參數(shù)考慮imgsz1280是應(yīng)對(duì)無人機(jī)小目標(biāo)的關(guān)鍵設(shè)置。很多現(xiàn)成教程默認(rèn)給640但無人機(jī)畫面里的行人只有幾十個(gè)像素分辨率太低會(huì)直接抹掉細(xì)節(jié)。顯存夠就上1280不夠就降到960。mosaic0.5是馬賽克增強(qiáng)的概率無人機(jī)行人數(shù)據(jù)集如果場景比較單一把增強(qiáng)概率降下來能避免訓(xùn)練分布和真實(shí)分布偏離太多。lr0初始學(xué)習(xí)率0.01是一個(gè)穩(wěn)妥起點(diǎn)如果訓(xùn)練曲線震蕩明顯就降到0.005。# 訓(xùn)練后驗(yàn)證模型效果 yolo val \ modelruns/detect/train/weights/best.pt \ datadata.yaml這里的best.pt是訓(xùn)練過程中在驗(yàn)證集上精度最高的模型權(quán)重不是最后一輪的last.pt。用best做驗(yàn)證能反映真實(shí)可用精度。驗(yàn)證輸出里主要看mAP50、mAP50-95這兩個(gè)指標(biāo)。對(duì)無人機(jī)行人檢測來說mAP50的意義更大因?yàn)樾腥藱z測的判斷標(biāo)準(zhǔn)通??虻貌畈欢嗑托胁恍枰袼丶?jí)精確mAP50-95考察的是更嚴(yán)格的框質(zhì)量如果這個(gè)數(shù)值過低而mAP50不低說明模型的框定位偏粗糙可以考慮在后續(xù)迭代里調(diào)整回歸損失的權(quán)重。4.3 訓(xùn)練曲線的判讀方法訓(xùn)練過程輸出兩張關(guān)鍵曲線loss曲線和驗(yàn)證指標(biāo)曲線。loss曲線里訓(xùn)練loss下降而驗(yàn)證loss不降反升是過擬合的典型信號(hào)兩個(gè)loss都在下降但速度很慢大概率是學(xué)習(xí)率太小或者數(shù)據(jù)增強(qiáng)過重。驗(yàn)證指標(biāo)曲線里mAP50在前20個(gè)epoch快速上升、后面緩慢爬升是正常節(jié)奏如果前10個(gè)epoch完全沒有上升跡象回查數(shù)據(jù)yaml和標(biāo)簽格式可能更高效。我一般會(huì)盯著前20個(gè)epoch的loss曲線做判斷而不是等100個(gè)epoch全跑完。前20輪如果訓(xùn)練loss和驗(yàn)證loss同步下降這組參數(shù)就是健康的讓它繼續(xù)跑就行如果驗(yàn)證loss在20輪內(nèi)出現(xiàn)了持續(xù)上升就可以直接停掉調(diào)參不浪費(fèi)后面的幾十輪時(shí)間。這也是遇到過太多次訓(xùn)練數(shù)小時(shí)、結(jié)果發(fā)現(xiàn)標(biāo)簽坐標(biāo)是反的過程之后養(yǎng)成的習(xí)慣。5. 無人機(jī)行人檢測避坑指南五個(gè)高頻問題與排查路徑這個(gè)數(shù)據(jù)集方向上幾乎每個(gè)坑都會(huì)讓訓(xùn)練時(shí)間翻倍。以下五條是從實(shí)際操作里反復(fù)踩出來的每條都按現(xiàn)象、原因、解決三個(gè)層次來寫。5.1 小目標(biāo)漏檢嚴(yán)重模型幾乎對(duì)遠(yuǎn)處的行人無感現(xiàn)象訓(xùn)練后的模型對(duì)近距離行人檢測效果尚可但畫面里的遠(yuǎn)距離行人大量漏檢甚至完全不報(bào)。驗(yàn)證集上mAP50不低但實(shí)際飛高之后效果立刻劣化。原因訓(xùn)練數(shù)據(jù)里小目標(biāo)樣本占比高但模型輸入分辨率不足網(wǎng)絡(luò)下采樣后小目標(biāo)特征被卷積層抹掉了。多數(shù)模型的下采樣倍率是32倍輸入640時(shí)一個(gè)32像素的行人在最終特征圖上只有1個(gè)像素點(diǎn)幾乎不可能被檢出。解決三步走。第一步把imgsz提升到1280讓同樣一個(gè)行人占據(jù)更多像素第二步開啟多尺度訓(xùn)練讓模型見過不同尺寸的行人第三步如果仍然漏檢用基于錨點(diǎn)的檢測頭并單獨(dú)調(diào)高小目標(biāo)層的權(quán)重。5.2 標(biāo)注框和圖片分辨率對(duì)不上坐標(biāo)明顯偏移現(xiàn)象可視化預(yù)覽時(shí)所有框集體向左上偏移而且遠(yuǎn)處小目標(biāo)的框偏得格外明顯。原因數(shù)據(jù)集里圖片原始分辨率是4000x3000但標(biāo)注坐標(biāo)是基于縮略圖1500x1000做的訓(xùn)練時(shí)直接讀取原始圖片導(dǎo)致坐標(biāo)換算錯(cuò)誤。這類問題在從網(wǎng)盤下載的多個(gè)來源混合數(shù)據(jù)集里特別常見。解決檢查圖片的真實(shí)尺寸并用它作為反歸一化的基準(zhǔn)。不要信文件命名里的尺寸信息用Python的PIL或OpenCV讀一遍。如果發(fā)現(xiàn)混用批量將圖片統(tǒng)一縮放到標(biāo)注坐標(biāo)對(duì)應(yīng)的尺寸或者把標(biāo)注坐標(biāo)重新?lián)Q算到圖片實(shí)際尺寸。5.3 負(fù)樣本太少誤檢成群出現(xiàn)現(xiàn)象模型把屋頂、車輛、樹冠頻繁識(shí)別成行人而且誤檢位置集中在某些特定紋理區(qū)域。原因數(shù)據(jù)集中絕大多數(shù)圖片都包含行人純背景幀幾乎沒有。模型學(xué)到的是“有紋理的局部區(qū)域像行人”而不是真正區(qū)分行人的結(jié)構(gòu)特征。解決從無人的巡檢視頻里抽幀加入20%到30%作為負(fù)樣本標(biāo)注文件留空即可。這是成本最低又最有效的防誤檢手段。加入負(fù)樣本后模型會(huì)學(xué)會(huì)“在沒有行人時(shí)輸出空檢測”而不是硬找出一個(gè)框。5.4 類別不平衡導(dǎo)致訓(xùn)練不收斂現(xiàn)象損失函數(shù)持續(xù)震蕩驗(yàn)證mAP在一兩個(gè)點(diǎn)之間來回跳模型輸出的類別概率傾向于某一類比如背景類。原因數(shù)據(jù)集中某些類別樣本極少檢測頭對(duì)這類目標(biāo)的梯度貢獻(xiàn)被大類別淹沒。在行人數(shù)據(jù)集里這往往表現(xiàn)為“行人和騎行的人混在一起但其中一類數(shù)量很少”。解決最簡單的做法是給不同類別設(shè)置不同的loss權(quán)重或者在采樣器里做類別重采樣。另一個(gè)可行方案是把稀有類別合并到大類別里——如果你的任務(wù)不要求區(qū)分這兩個(gè)子類合并是更務(wù)實(shí)的做法。5.5 訓(xùn)練集和驗(yàn)證集分布不一致現(xiàn)象訓(xùn)練loss下降漂亮驗(yàn)證集mAP也很高但模型在真實(shí)場景里表現(xiàn)稀爛。換了一批圖片測試后精度掉了一半以上。原因數(shù)據(jù)劃分時(shí)沒有做隨機(jī)化或者是按時(shí)間順序切分導(dǎo)致驗(yàn)證集和訓(xùn)練集場景高度相似驗(yàn)證結(jié)果虛高。更隱蔽的情況是如果數(shù)據(jù)集里包含同一個(gè)場景的連續(xù)幀隨機(jī)劃分會(huì)讓相似的畫面同時(shí)出現(xiàn)在訓(xùn)練集和驗(yàn)證集嚴(yán)重的“數(shù)據(jù)泄露”會(huì)讓指標(biāo)失真。解決按視頻序列劃分?jǐn)?shù)據(jù)同一個(gè)視頻來源的幀只能出現(xiàn)在一個(gè)集合里。只需要在劃分前按文件名前綴分組再對(duì)組進(jìn)行劃分就能避免這個(gè)問題。這樣評(píng)估結(jié)果才真正反映模型面對(duì)新場景時(shí)的表現(xiàn)。6. 把數(shù)據(jù)集的價(jià)值最大化三個(gè)讓模型更進(jìn)一步的技巧當(dāng)你已經(jīng)在“已標(biāo)注”的數(shù)據(jù)集上跑通了基線模型接下來這三個(gè)技巧能讓模型的實(shí)用性和精度再上一個(gè)臺(tái)階。這三個(gè)技巧用到最多的場景是模型已經(jīng)能用、但距離實(shí)際作業(yè)要求還差一口氣的時(shí)候。第一個(gè)技巧是多尺度訓(xùn)練與推理聯(lián)動(dòng)。訓(xùn)練時(shí)開啟多尺度每輪迭代隨機(jī)從某個(gè)尺度范圍內(nèi)采樣輸入尺寸讓模型適應(yīng)行人尺度的變化。推理時(shí)用TTA測試時(shí)增強(qiáng)把原圖和縮放后的圖分別送進(jìn)模型推理再融合結(jié)果。這個(gè)組合能讓小目標(biāo)檢測的mAP提升大約3到5個(gè)點(diǎn)代價(jià)是推理耗時(shí)增加。實(shí)測中TTA對(duì)無人機(jī)場景的收益特別明顯因?yàn)樾腥说慕^對(duì)尺寸在飛行高度變化時(shí)會(huì)劇烈波動(dòng)。第二個(gè)技巧是利用偽標(biāo)注迭代優(yōu)化。把已訓(xùn)練模型拿到目標(biāo)場景的新視頻上跑一遍推理得到一批帶置信度的檢測結(jié)果人工篩選高置信度框作為偽標(biāo)注加入訓(xùn)練集。這個(gè)過程能顯著提升模型在新場景的適應(yīng)能力。篩選標(biāo)準(zhǔn)要高置信度至少0.8以上并且經(jīng)過人工抽檢確認(rèn)。一輪偽標(biāo)注迭代大約能讓新場景的recall提升10%以上。我在項(xiàng)目中試過用這個(gè)方法讓模型的場景遷移成本降低了七成但要注意每輪迭代后都要重新劃分?jǐn)?shù)據(jù)集避免數(shù)據(jù)泄露。第三個(gè)技巧是可視化特征圖來定位失敗原因。訓(xùn)練結(jié)束后選取一張漏檢圖片把網(wǎng)絡(luò)中間層的特征圖可視化出來觀察小目標(biāo)區(qū)域在網(wǎng)絡(luò)深層是否還有響應(yīng)。如果響應(yīng)微弱說明網(wǎng)絡(luò)在這個(gè)尺度上已經(jīng)丟失了目標(biāo)信息如果響應(yīng)強(qiáng)烈但最終輸出沒有框則問題多半出在檢測頭或者后處理階段。這類排查比盲調(diào)參數(shù)高效得多能直接把優(yōu)化方向從“玄學(xué)調(diào)參”變成“針對(duì)修復(fù)”。我自己的教訓(xùn)是每次拿到新數(shù)據(jù)集先花一個(gè)小時(shí)做第2、3章的校驗(yàn)再開始訓(xùn)練這樣后面省下的時(shí)間通常是三倍以上。哪怕數(shù)據(jù)是官方發(fā)布的“精品數(shù)據(jù)集”也值得走一遍這個(gè)流程。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取