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