據集:YOLO訓練與部署實戰(zhàn))
項目標題: 航拍校園操場人體檢測數(shù)據集 | YOLO航拍人體檢測數(shù)據集1. 項目概述為什么選校園操場這個場景做航拍人體檢測絕大多數(shù)人第一反應是去爬取公開的航拍行人數(shù)據集比如VisDrone、HRNet系列或者用DOTA里的“person”類別湊數(shù)。但真到自己做項目落地時你會發(fā)現(xiàn)這些公開數(shù)據跟你的實際應用場景之間隔著一條巨大的鴻溝——航拍高度不同、視角不同、操場這種半開放場景的人群分布形態(tài)也跟街景、園區(qū)完全不一樣。我這次做的這個數(shù)據集定位非常明確針對校園操場這一特定場景的高空俯拍人體檢測。場景聚焦在操場、田徑場、籃球場這類開闊場地無人機飛行高度在20米到60米之間拍攝角度以接近垂直的俯拍和稍帶傾角的斜俯拍為主。這個視角下的人體目標平均尺寸只有幾十個像素密集人群場景下人員之間還有大量相互遮擋和常規(guī)地面攝像頭的人體檢測完全是兩碼事。這個項目適合誰參考如果你正在做智慧校園、體育考勤自動化、大型活動人流統(tǒng)計、安防巡檢這類應用或者你手里有一臺無人機想自己采集數(shù)據訓練檢測模型那么這套數(shù)據集的建設思路和訓練流程可以直接復用。整篇文章我會把數(shù)據采集、標注規(guī)范、YOLO系列模型的訓練調參、常見坑位、部署要點全部拆開講盡量做到你照著走一遍就能出結果。2. 數(shù)據集構建采集策略與標注規(guī)范2.1 采集設計高度、角度、光照的三重覆蓋數(shù)據集的源頭質量決定了模型性能的上限。我這次采集選了一個標準的400米跑道操場加兩個籃球場作為主場景用消費級四旋翼無人機掛載4K相機在三個維度上做了刻意設計。第一是高度分層。無人機分別在20米、30米、45米、60米四個典型高度懸停拍攝對應人員目標在畫面中占比約15%到3%不等。為什么要做這個分層因為實際部署時無人機的高度很難恒定為某一個值遇到操場周邊有旗桿、樹木、看臺這類障礙物時飛手往往需要臨時提升高度繞飛如果模型只在單一尺度下訓練高度一變目標尺寸跟著變檢測率立刻下降。第二是角度覆蓋。正射視角鏡頭垂直向下和目標斜射視角鏡頭與地面法線呈15度到45度夾角各占一半比例。正射視角下人的輪廓接近一個橢圓頭肩特征被壓縮斜射視角下能看到人的側面輪廓和運動趨勢。兩類視角混合訓練模型才會對鏡頭姿態(tài)變化有魯棒性。實際操作中斜射視角容易把操場邊上的籃球架、看臺座椅也拍進去這恰好增加了背景負樣本的多樣性。第三是光照和天氣。上午、中午、傍晚各時段各采一批陰天和晴天各采一批同時盡量避開影子很長的正午強光時段影子會把兩個人連成一片標注難度極大。最終整理下來共采集有效視頻約6小時按每隔5幀抽一幀的方式做抽幀得到原始圖片4800余張?zhí)蕹摻埂娺\動模糊、遮擋超過70%的極端幀后保留有效圖片共3920張。2.2 標注規(guī)范YOLO格式下的人體邊界框細節(jié)標注使用的是LabelImg工具輸出YOLO txt格式類別只設一個——“person”。YOLO格式的標注內容每行是“class x_center y_center width height”坐標均為歸一化后的0到1之間的小數(shù)。這里有幾個特別容易踩的細節(jié)單獨拎出來講一下。關于標注邊界的確定我參考了COCO數(shù)據集的標注慣例但做了微調。單人目標完整可見時框從頭頂外沿到腳底外沿左右貼合身體外輪廓邊緣不額外加margin。這樣處理的好處是邊界框貼合度高訓練時IoU計算更準確壞處是稍微偏一點就掉精度。實際操作中我要求標注員統(tǒng)一把框的四個頂點貼住目標的外接矩形內緣寧略小勿偏大。多目標遮擋時只要目標的可視面積超過整體的40%就單獨框出來低于40%的不標避免標注噪聲干擾。還有一個很多教程不會提的點對極高密度人群區(qū)域的處理。比如課間操時幾百人扎堆在草坪上YOLO格式本身允許一個圖片里有多行標注但密集區(qū)域一個個全框出來需要極大的耐心而且人挨人的情況下邊界框高度重疊模型訓練出來會出現(xiàn)大量冗余檢測框。我的處理策略是密集人群區(qū)域按“可見頭部肩部輪廓”標上限可見目標隊伍中完全被遮擋到只剩一條腿或一只手的人不標注。這樣既控制標注成本又不會教模型去學習錯誤的形狀特征。2.3 數(shù)據統(tǒng)計與劃分最終數(shù)據集的統(tǒng)計結果如下表所示統(tǒng)計項數(shù)值有效圖片總數(shù)3920張標注目標總數(shù)約5.8萬個單張最多目標數(shù)215個單張平均目標數(shù)約14.8個小目標像素面積32×32占比約61%訓練集 / 驗證集 / 測試集3120 / 400 / 400劃分時我特意用了按拍攝片段劃分而不是按單張隨機劃分。同一個視頻片段里相鄰幀內容高度相似如果隨機分訓練集和驗證集里會出現(xiàn)大量“同卵雙胞胎”驗證指標虛高換到真場景立刻露餡。按片段劃分才能真實反映模型面對未見畫面的泛化能力。3. YOLO模型訓練全流程拆解3.1 模型選型與預訓練權重處理YOLO系列發(fā)展到現(xiàn)在版本很多我最終選用的是YOLOv8n和YOLOv8m兩個尺寸分別做對比實驗。為什么不用更大的YOLOv8l或x因為航拍高空場景是小目標密集場景大模型的容量優(yōu)勢主要體現(xiàn)在特征表達力上但在輸入分辨率受限的情況下大模型帶來的提升有限推理開銷卻呈指數(shù)級增長。實際產品部署要考慮邊緣設備或低功耗主機的算力v8n做實時檢測、v8m做離線精準分析兩個檔位就足夠覆蓋絕大多數(shù)需求。預訓練權重的選擇也有講究。YOLOv8官方發(fā)布的預訓練權重是在COCO數(shù)據集上訓練的COCO包含80個類別其中有person類。直接加載這個權重做遷移學習模型已經具備很好的通用特征提取能力和基本的人體形狀認知。在下載權重時要注意選擇與模型結構對應的文件yolov8n.pt對應nano結構yolov8m.pt對應medium結構別搞混了。我自己試過一次用v8m的權重啟動v8n的模型配置報錯半天才發(fā)現(xiàn)是尺寸不匹配。還有一點訓練時PyTorch版本和Ultralytics版本要配套。我用的是ultralytics 8.1.x配合PyTorch 2.1.x用官方requirements安裝即可。如果你用的PyTorch是2.2及以上注意檢查一下CUDA版本的匹配關系否則訓練時可能出現(xiàn)莫名其妙的顯存分配錯誤。3.2 訓練參數(shù)配置與損失函數(shù)調優(yōu)訓練配置文件在ultralytics框架下可以完全通過命令行參數(shù)指定。我的baseline參數(shù)如下yolo train datacampus_person.yaml modelyolov8n.pt epochs300 batch32 imgsz640 patience40 device0 optimizerSGD lr00.01 lrf0.01 momentum0.937 weight_decay0.0005 warmup_epochs3.0 box7.5 cls0.5 dfl1.5這里面最值得說的是box、cls、dfl這三個損失權重。YOLOv8的總損失是分類損失cls、邊界框回歸損失box和DFL分布損失dfl的加權和。默認值分別是0.5、1.0、1.5但對于本數(shù)據集的高密度小目標場景我把邊界框回歸的權重提高到7.5分類權重降到0.5。原因是小目標本來就像素少位置偏差幾個像素IoU就掉得厲害必須讓模型優(yōu)先學會把框“放準”而不是糾結于區(qū)分不同類別反正只有一個類別分類壓力本身不大。DFL權重保持1.5用于精細化邊界框的四邊定位。數(shù)據增強參數(shù)我也做了調整。航拍俯拍圖不存在翻轉不對稱的問題因為人的形態(tài)不會因為左右翻轉而改變所以fliplr0.5和flipud0.5都可以開。scale0.4控制訓練時隨機縮放比例這個值不建議開太大高空場景本身的尺度差異已由多高度采集覆蓋了訓練時再大比例縮放反而會讓小目標縮得更小、更難以學習。mosaic1.0默認開啟這個必須保留它對增強小目標上下文信息非常有效但在最后30個epoch我建議通過mosaic0關掉它避免模型因為由四張圖拼出的“假背景”而學偏。3.3 訓練過程實錄我用的是一張RTX 309024GB顯存跑YOLOv8mbatch size設到32imgsz640。第一次跑的時候loss下降曲線前100個epoch一路走低到接近收斂但從驗證集指標看mAP50漲到0.87以后就上不去了明顯是模型容量不夠換v8m之后mAP50到了0.92。還有個細節(jié)值得關注驗證集的小目標指標和整體指標差距。YOLOv8的訓練日志里會輸出不同尺寸目標的AP數(shù)據包括small面積小于32×32和medium介于32×32和96×96之間。我這個數(shù)據集小目標占六成以上訓練完看結果時如果只盯著整體mAP50可能忽略小目標AP值偏低的問題。實際訓練中發(fā)現(xiàn)v8n的小目標AP只到0.78v8m能到0.88這個差距在真實高空場景里體感非常明顯——很多多人聚集區(qū)域的目標直接漏檢。訓練完成后記得用驗證集做一次置信度閾值分析。默認置信度閾值是0.25在這個數(shù)據集上驗證集的PR曲線顯示閾值調到0.35時能有效過濾掉看臺座椅、樹木陰影造成的一批誤檢同時召回率只損失一個點左右。這個操作在部署階段對提升用戶體驗很有幫助。很多人訓練完不調置信度閾值直接默認值上線誤檢一堆綠色框在樹上晃體驗極差。4. 訓練與推理中的典型問題排查實錄4.1 小目標漏檢為什么模型對遠處的人群視而不見航拍人體檢測最大的痛點是目標尺寸太小。YOLOv8默認輸入分辨率是640×640在這個分辨率下一個站在50米高空下的成人只有大約12×28像素經過骨干網絡4次下采樣后特征圖上的尺寸僅剩約3×7像素在最高層特征圖上幾乎不可見。解決方案除了前面提到的用更高輸入分辨率imgsz960或1280重新訓練外還可以利用YOLOv8的檢測頭改進策略。v8的檢測頭本身已經使用了anchor-free設計對小目標比v5友好但仍有優(yōu)化空間。我這里用的一個有效做法是訓練時輸入尺寸設960推理時保持960輸入顯存不夠就減小batch。實測v8m在960分辨率下小目標AP從0.88提升到0.91但這個方案對顯存壓力大一個batch8時單卡24GB勉強夠用。另一個思路是分塊檢測Tiling把原圖切成左上、右上、左下、右下四個帶重疊區(qū)的子圖分別送入模型推理后再合并結果。這個方法在小目標檢測比賽中很常見對無人機畫面效果顯著但會增加約3到4倍的推理耗時適合離線分析或單路低要求實時場景。4.2 混淆矩陣總和不為1先別慌訓練完看驗證集混淆矩陣發(fā)現(xiàn)所有格子的數(shù)值加起來不為1有人會以為是計算錯誤。實際上YOLO輸出的混淆矩陣默認是歸一化后的百分比格式每個類別行的數(shù)值代表該類別的真實樣本中被預測為各類別的比例背景background單獨占一行而且右下角代表“真反例”的格子通常是空著或極大的數(shù)字不做歸一化處理。再加上閾值小于0.5才算誤檢模型預測得分本身有連續(xù)性誤差所以各行加起來不嚴格等于1是非常正常的。看混淆矩陣時真正該關注的是person類別對角線上的值高不高召回率背景類別有沒有大量樣本被誤判為person誤檢率。我本次訓練完的混線矩陣里person對person的命中率是0.92背景被誤檢為person的比例是0.03屬于可接受范圍。如果背景誤檢比例超過0.1建議增加負樣本圖片一起參與訓練。4.3 訓練中BN層崩潰BatchNorm崩潰有次換服務器重跑訓練發(fā)現(xiàn)前30個epoch里loss直接NAN日志中出現(xiàn)“BN running_var”異常。排查后發(fā)現(xiàn)是batch size設得太小batch8而模型前一晚的權重是在batch32下訓練的BN統(tǒng)計量與新的batch不匹配加上學習率設定偏高導致數(shù)值不穩(wěn)定。這個問題的處理方式有兩條路將batch調回32以上同時調低lr0到0.005讓BN統(tǒng)計量有足夠多穩(wěn)定樣本重新計算加載預訓練權重后先凍結骨干網絡只訓練檢測頭跑幾個epoch等loss穩(wěn)定后再解凍全模型訓練。這個策略對顯存有限的用戶非常友好。另外值得提到的是YOLO訓練中BN的momentum參數(shù)默認是0.1如果數(shù)據集的分布劇烈變化比如從正常光照突然換成大量過曝欠曝樣本BN統(tǒng)計量的更新速度可能跟不上表現(xiàn)為中間階段驗證集指標大幅震蕩??梢栽诔瑓⑽募袑omentum調到0.03左右犧牲一點收斂速度換穩(wěn)定性。4.4 人群密集區(qū)域重復檢測框過多課間操場景下幾百人密集排列模型輸出時會出現(xiàn)一個目標對應多個框的情況。NMS非極大值抑制默認IoU閾值是0.7但高密度場景下真目標的框相互之間IoU本來就高NMS會誤殺掉部分正確框造成漏檢。解決辦法有兩個方向。第一把預測時的agnostic_nms設為True讓NMS不區(qū)分類別只按IoU做抑制——因為本場景只有一個類別這個設置不會產生副作用效果是能有效壓制同目標區(qū)域的重復框。第二把nms_iou閾值從默認0.7調到0.5左右讓框之間做到更激進的抑制。代價是如果兩個真實目標間距很近、框高度重疊激進抑制可能把其中一個正確框也干掉。實際測試中0.5到0.6之間效果最好需要根據自己的數(shù)據實際情況多試幾次。5. 部署實踐與落地擴展5.1 模型導出與TensorRT加速訓練好的權重文件最終要落地部署至少繞不開模型導出這一步。YOLOv8官方支持直接導出為ONNX、TensorRT engine等格式y(tǒng)olo export modelruns/detect/train/weights/best.pt formatonnx opset12 dynamicTrue yolo export modelruns/detect/train/weights/best.pt formatengine device0 halfTrue導出TensorRT engine時halfTrue啟用FP16精度。我在部署方案中實測FP16精度下mAP掉0.5個百分點左右但推理速度提升約1.8倍對航拍這類實時性要求高的場景完全值得。值得特別說明的是TensorRT對輸入分辨率非常敏感。一個AI模型在導出成TensorRT engine時如果沒有開啟動態(tài)shapedynamicTrue那么推理時的輸入尺寸必須與導出時固定尺寸完全一致否則會報錯或直接跑不了。實際操作中要提前確定推理分辨率不要想著“我訓練640導出一個640的engine然后部署時用960跑”這是完全行不通的。5.2 多路視頻流的并發(fā)推理設計航拍項目部署時常見需求是操場上有若干定點攝像頭或者一臺無人機同時回傳1080p視頻流后端對這些流做實時人流量統(tǒng)計。這里涉及“單卡能支持多少路視頻流”的算力規(guī)劃問題。結合T4顯卡16GB顯存用TensorRT FP16跑YOLOv8m輸入640×640理論單幀推理耗時約10到12毫秒。但1080p視頻是25fps意味著每幀需要40毫秒內完成一幀才不丟幀。這時關鍵瓶頸不在模型推理速度而在于4K/1080p輸入的預處理解碼、縮放、歸一化耗時——這一步如果放在CPU上跑單路就要占用30毫秒以上加上推理時間直接就超預算了。合理的調度方案是每路視頻流分一個線程線程內先用GPU的torchvision.ops.nms或OpenCV的CUDA版本做統(tǒng)一預處理N路視頻幀通過批處理方式打包成一個大batch統(tǒng)一推理。實測T4配合這種批處理方式的極限是在25fps下支持約6到8路1080p視頻流的實時檢測。若需要更高路數(shù)建議降低到720p輸入或換成YOLOv8s/n級別的模型。這些數(shù)據供參考具體路數(shù)要用自己的顯卡實測校驗單純按推理耗時換算往往會讓人低估預處理帶來的壓力。5.3 從檢測到應用校園場景的三大落地方向檢測模型本身只是前端能力結合業(yè)務邏輯才能形成完整閉環(huán)?;谶@個航拍校園操場人體檢測數(shù)據集我梳理了三個可落地的應用方向。第一是課間操與體育課的出勤統(tǒng)計。利用俯拍畫面做實時人數(shù)統(tǒng)計對比系統(tǒng)排課名單自動生成缺席預警。相比傳統(tǒng)地面攝像頭航拍俯視視角不受前排遮擋影響覆蓋率接近100%。這需要額外對操場做區(qū)域標定不同的班級區(qū)域通過多邊形羅克區(qū)Region of Interest劃分后再做人數(shù)計數(shù)。第二是運動軌跡分析與安全事故預警。利用多幀檢測框中心點做時間序列追蹤如ByteTrack算法如果某個目標長時間停留在原地沒移動判定為異常狀態(tài)并觸發(fā)預警。這個玩法對單張圖片檢測的精度要求沒有太高但對追蹤的幀間匹配穩(wěn)定性要求很高需要在部署時調整ByteTrack的匹配閾值。第三是大型校園活動的熱力圖生成。比如運動會開幕式或畢業(yè)典禮這類人員大規(guī)模聚集場景把檢測框的中心點做核密度估計后投影到操場俯瞰圖上生成實時人流熱力圖幫助安保人員識別人群過度密集區(qū)域輔助分流決策。6. 效率提升技巧與踩坑心得6.1 標注效率翻倍的三條經驗標注高空俯拍數(shù)據集的體驗跟標注地面視角完全不一樣。地面視角人能看出清晰的“站立的人”的形狀俯拍視角的人更像“帶頭的橢圓”標注員看多了極易眼疲勞。我試下來的幾條經驗很有用先自動標注再人工修正。拿一個已經訓練好的模型哪怕是用公開數(shù)據集訓練的低性能模型跑一遍全部圖片導出偽標簽然后標注員在偽標簽基礎上修正。這個流程能節(jié)省60%以上的標注工作量。注意人工修正時要格外小心自動標注中的系統(tǒng)性錯誤比如模型習慣把同色衣服的相鄰人合并成一個框這種錯誤要人工一個個拆開。做好預分類。把圖片按目標密度分為高、中、低三檔安排不同熟練度的標注員分開處理。高密度圖一張能標幾十分鐘低密度圖幾秒就完事混合分配低效且容易讓標注員疲勞。定期抽檢。我每完成200張就隨機抽20張讓另一人復核計算框與框之間的平均IoU作為一致性指標。低于0.85就組織重新培訓標注員防止標注口徑漂移。6.2 圖片預處理的兩個細節(jié)訓練前我用了一個很多人忽略但至關重要的處理對原始4K圖做圖像去畸變。低端無人機的鏡頭普遍存在明顯的徑向畸變操場邊線的直線在畫面邊緣會變成弧線。如果不矯正畸變就送進模型訓練模型會把畸變特征當作“操場場景特征”記住影響泛化能力。我的做法是先用OpenCV的相機標定流程算每臺無人機鏡頭的畸變系數(shù)然后統(tǒng)一做去畸變預處理再縮放為訓練分辨率。另外所有圖片統(tǒng)一做了自動白平衡校正。無人機的自動白平衡在不同光照環(huán)境下差異很大尤其是黃昏時畫面整體偏黃早上偏藍。通過灰世界假設算法把色溫統(tǒng)一到基準值減少模型對色彩的過擬合。6.3 擴展思路多模態(tài)與更多場景的融合這個數(shù)據集目前只有圖像模態(tài)但航拍場景天然適合融合更多數(shù)據源。比如后續(xù)可以加入無人機的GPS定位信息與IMU姿態(tài)角結合相機內外參把每個人體檢測框反投影到操場平面坐標上直接輸出每位學生的經緯度位置。這個方向再往前一步可以將多臺無人機或定點攝像頭的檢測結果做跨視角融合生成完整的操場三維人流動態(tài)。如果想把數(shù)據集做得更“通用”我還建議加入以下兩類場景負樣本一是操場無人時段圖中只有跑道線、草坪紋路沒有任何人這能顯著降低誤檢率二是在操場周邊出現(xiàn)施工圍擋、臨時帳篷等異形結構物的圖片迫使模型區(qū)分“人形”和“大型立體物體邊緣”。這兩類圖不增加人體樣本數(shù)量但對魯棒性的提升非??捎^。最后再分享一個我在實際使用中發(fā)現(xiàn)的細節(jié)實時推理時如果視頻流是從無人機的圖傳鏈路拉取的畫面碼率經常不穩(wěn)定偶爾會出現(xiàn)花屏或高壓縮偽影。在這種條件下把輸入圖片先做一次輕度的中值濾波降噪能明顯減少錯誤檢測框。代價是每幀增加約2毫秒處理時間在算力允許時是個性價比很高的操作。