檢測(cè)終極優(yōu)化:從數(shù)據(jù)增強(qiáng)到特征融合的全鏈路改進(jìn)方案)
在航拍巡檢、工業(yè)缺陷檢測(cè)、安防遠(yuǎn)場(chǎng)監(jiān)控這類場(chǎng)景中小目標(biāo)檢測(cè)始終是繞不開的硬骨頭。原生YOLO直接在這類數(shù)據(jù)集上訓(xùn)練往往會(huì)出現(xiàn)小目標(biāo)漏檢嚴(yán)重、定位偏差大的問(wèn)題小目標(biāo)AP甚至比大目標(biāo)低20個(gè)點(diǎn)以上。很多開發(fā)者的第一反應(yīng)是加檢測(cè)頭、堆注意力模塊但往往收益有限還把推理速度拖垮。本質(zhì)上小目標(biāo)檢測(cè)差不是單一環(huán)節(jié)的問(wèn)題而是從數(shù)據(jù)輸入、特征提取到損失優(yōu)化、推理后處理全鏈路的系統(tǒng)性短板。只改網(wǎng)絡(luò)結(jié)構(gòu)治標(biāo)不治本必須分層優(yōu)化、逐個(gè)突破。本文基于YOLOv11架構(gòu)從數(shù)據(jù)、網(wǎng)絡(luò)、訓(xùn)練、推理四個(gè)維度拆解完整優(yōu)化方案全程附帶實(shí)現(xiàn)邏輯、實(shí)測(cè)收益與踩坑說(shuō)明落地后小目標(biāo)AP可提升8~12個(gè)百分點(diǎn)。一、先搞透小目標(biāo)檢測(cè)為什么難在行業(yè)標(biāo)準(zhǔn)中通常將像素面積小于32×32的目標(biāo)定義為小目標(biāo)。它的檢測(cè)難度來(lái)自四個(gè)天然短板特征信息匱乏一個(gè)20×20像素的目標(biāo)經(jīng)過(guò)骨干網(wǎng)絡(luò)32倍下采樣后在深層特征圖上僅對(duì)應(yīng)不到1個(gè)像素語(yǔ)義特征幾乎被背景噪聲淹沒(méi)樣本占比失衡多數(shù)數(shù)據(jù)集中小目標(biāo)的數(shù)量占比低、標(biāo)注質(zhì)量差模型訓(xùn)練時(shí)對(duì)小目標(biāo)的學(xué)習(xí)不充分定位精度敏感大目標(biāo)偏移2個(gè)像素對(duì)IoU影響很小但小目標(biāo)偏移1個(gè)像素IoU可能直接下降0.3回歸難度指數(shù)級(jí)上升背景干擾嚴(yán)重小目標(biāo)容易和背景紋理、噪點(diǎn)混淆誤檢率遠(yuǎn)高于中大型目標(biāo)二、全鏈路優(yōu)化整體架構(gòu)小目標(biāo)優(yōu)化遵循「先數(shù)據(jù)、后網(wǎng)絡(luò)、再訓(xùn)練、最后推理兜底」的優(yōu)先級(jí)越靠前的環(huán)節(jié)投入產(chǎn)出比越高。整體優(yōu)化鏈路如下原始數(shù)據(jù)集數(shù)據(jù)層優(yōu)化小目標(biāo)Copy-PasteMosaic參數(shù)適配小目標(biāo)過(guò)采樣網(wǎng)絡(luò)結(jié)構(gòu)優(yōu)化新增P2淺層檢測(cè)頭坐標(biāo)注意力嵌入加權(quán)特征融合訓(xùn)練策略優(yōu)化錨框重聚類小目標(biāo)損失加權(quán)正樣本匹配優(yōu)化推理側(cè)優(yōu)化滑動(dòng)切片推理TTA多尺度增強(qiáng)DIoU-NMS適配最終檢測(cè)結(jié)果三、數(shù)據(jù)層優(yōu)化零成本漲點(diǎn)的先手操作數(shù)據(jù)是模型精度的上限針對(duì)小目標(biāo)做定向數(shù)據(jù)增強(qiáng)不需要改網(wǎng)絡(luò)、不影響推理速度就能帶來(lái)2~4個(gè)點(diǎn)的精度提升是所有優(yōu)化的第一步。3.1 小目標(biāo)定向Copy-Paste這是小目標(biāo)場(chǎng)景收益最高的增強(qiáng)手段沒(méi)有之一。核心邏輯是從數(shù)據(jù)集中摳出真實(shí)的小目標(biāo)隨機(jī)粘貼到背景圖的合理位置直接提升單張圖里的小目標(biāo)數(shù)量同時(shí)豐富小目標(biāo)的背景分布。實(shí)現(xiàn)時(shí)要遵守三個(gè)約束避免引入噪聲標(biāo)簽尺度約束粘貼后的目標(biāo)尺寸要符合真實(shí)場(chǎng)景的尺度范圍不能憑空放大縮小位置約束不要粘貼在不符合物理邏輯的位置比如行人不能貼在天空里重疊約束和已有目標(biāo)的重疊率不要超過(guò)30%避免生成不合理的遮擋樣本核心實(shí)現(xiàn)片段如下defcopy_paste(img,labels,small_target_pool,p0.3):ifrandom.random()p:returnimg,labels h,wimg.shape[:2]# 隨機(jī)選取2~5個(gè)小目標(biāo)粘貼paste_numrandom.randint(2,5)for_inrange(paste_num):target_img,target_boxrandom.choice(small_target_pool)th,twtarget_img.shape[:2]# 隨機(jī)粘貼位置xrandom.randint(0,w-tw)yrandom.randint(0,h-th)# 粘貼到原圖img[y:yth,x:xtw]target_img# 同步添加標(biāo)簽labels.append([0,(xtw/2)/w,(yth/2)/h,tw/w,th/h])returnimg,labels實(shí)測(cè)在VisDrone航拍數(shù)據(jù)集上僅開啟Copy-Paste一項(xiàng)小目標(biāo)AP就能提升2.8個(gè)百分點(diǎn)。3.2 Mosaic增強(qiáng)參數(shù)適配原生YOLO的Mosaic增強(qiáng)默認(rèn)縮放范圍是0.5~1.5對(duì)小目標(biāo)非常不友好縮放系數(shù)0.5時(shí)原本32像素的小目標(biāo)會(huì)縮到16像素經(jīng)過(guò)下采樣后特征幾乎消失相當(dāng)于無(wú)效樣本。針對(duì)小目標(biāo)場(chǎng)景需要收窄縮放范圍建議調(diào)整為0.8~1.2避免過(guò)度縮小目標(biāo)。同時(shí)可以適當(dāng)提高拼接中心的偏移范圍讓更多小目標(biāo)出現(xiàn)在圖像中心區(qū)域減少邊緣截?cái)唷?.3 小目標(biāo)過(guò)采樣如果數(shù)據(jù)集中小目標(biāo)的數(shù)量占比不足20%建議對(duì)包含小目標(biāo)的圖片做過(guò)采樣訓(xùn)練時(shí)提高這類圖片的采樣概率讓模型每一輪見(jiàn)到更多小目標(biāo)樣本。實(shí)現(xiàn)非常簡(jiǎn)單只需要在數(shù)據(jù)集加載時(shí)給小目標(biāo)樣本更高的采樣權(quán)重即可。四、網(wǎng)絡(luò)結(jié)構(gòu)優(yōu)化針對(duì)性強(qiáng)化小目標(biāo)特征數(shù)據(jù)優(yōu)化打基礎(chǔ)網(wǎng)絡(luò)結(jié)構(gòu)改進(jìn)一步提升特征提取能力。三個(gè)改動(dòng)優(yōu)先級(jí)從高到低分別是新增P2檢測(cè)頭 坐標(biāo)注意力嵌入 加權(quán)特征融合。4.1 新增P2淺層檢測(cè)頭這是最經(jīng)典也最有效的小目標(biāo)改進(jìn)方案。原生YOLO只有P3/P4/P5三個(gè)檢測(cè)頭對(duì)應(yīng)下采樣倍數(shù)8/16/32最小的P3特征圖也只能覆蓋≥8像素的目標(biāo)大量極小目標(biāo)在深層特征中完全丟失。新增一個(gè)stride4的P2檢測(cè)頭從骨干網(wǎng)絡(luò)的第二層引出特征配合Neck的上采樣分支做特征融合讓小目標(biāo)在更大的特征圖上被檢測(cè)細(xì)節(jié)信息更豐富。實(shí)現(xiàn)方式修改模型yaml配置文件核心改動(dòng)兩處骨干網(wǎng)絡(luò)保留P2階段的輸出作為Neck的輸入Neck增加一次上采樣將P3特征上采樣后和P2特征融合輸出到P2檢測(cè)頭# 簡(jiǎn)化版配置示例backbone:-[-1,1,Conv,[64,3,2]]# 0-P1/2-[-1,1,C3k2,[128]]# 1-P2/4 -- 新增引出點(diǎn)-[-1,1,Conv,[128,3,2]]# 2-P3/8-[-1,2,C3k2,[256]]# 3-P3# ... 其余骨干結(jié)構(gòu)保持不變head:# 新增上采樣分支融合P2特征-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,1],1,Concat,[1]]# 拼接骨干P2特征-[-1,1,C3k2,[128,False]]# P2融合層# 原有P3/P4/P5結(jié)構(gòu)保持不變# ...# 檢測(cè)頭增加P2輸出變?yōu)?個(gè)檢測(cè)頭-[[17,20,23,26],1,Detect,[nc]]效果與代價(jià)精度收益小目標(biāo)AP提升2~3個(gè)百分點(diǎn)性能代價(jià)參數(shù)量增加約10%推理速度下降15%~20%適用場(chǎng)景小目標(biāo)占比高、對(duì)速度要求不極端的場(chǎng)景性價(jià)比極高4.2 嵌入坐標(biāo)注意力CA注意力模塊很多但對(duì)小目標(biāo)最友好的是坐標(biāo)注意力Coordinate Attention。和SE、CBAM不同CA沒(méi)有直接做全局池化而是分別在水平和垂直兩個(gè)方向做特征編碼既保留了空間位置信息又能強(qiáng)化通道特征剛好匹配小目標(biāo)對(duì)位置精度的高要求。插入位置不要亂加優(yōu)先放在骨干網(wǎng)絡(luò)的P2、P3輸出層以及Neck的P2融合分支深層大目標(biāo)分支不需要加避免不必要的計(jì)算開銷。核心實(shí)現(xiàn)片段classCoordAtt(nn.Module):def__init__(self,inp,oup,reduction32):super().__init__()self.pool_hnn.AdaptiveAvgPool2d((None,1))self.pool_wnn.AdaptiveAvgPool2d((1,None))mipmax(8,inp//reduction)self.conv1nn.Conv2d(inp,mip,1,biasFalse)self.bn1nn.BatchNorm2d(mip)self.actnn.SiLU()self.conv_hnn.Conv2d(mip,oup,1,biasFalse)self.conv_wnn.Conv2d(mip,oup,1,biasFalse)defforward(self,x):identityx n,c,h,wx.size()x_hself.pool_h(x)x_wself.pool_w(x).permute(0,1,3,2)ytorch.cat([x_h,x_w],dim2)yself.conv1(y)yself.bn1(y)yself.act(y)x_h,x_wtorch.split(y,[h,w],dim2)x_wx_w.permute(0,1,3,2)a_hself.conv_h(x_h).sigmoid()a_wself.conv_w(x_w).sigmoid()returnidentity*a_w*a_h效果與代價(jià)精度收益小目標(biāo)AP提升1~1.5個(gè)百分點(diǎn)性能代價(jià)參數(shù)量增加不到2%推理速度下降約5%優(yōu)勢(shì)幾乎不增加計(jì)算量對(duì)小目標(biāo)的定位精度提升非常明顯4.3 加權(quán)雙向特征融合原生YOLO的Neck采用Concat做特征拼接不同尺度的特征是等權(quán)重融合的。但對(duì)小目標(biāo)來(lái)說(shuō)淺層細(xì)節(jié)特征的重要性遠(yuǎn)高于深層語(yǔ)義特征等權(quán)融合會(huì)稀釋細(xì)節(jié)信息。可以在特征融合節(jié)點(diǎn)加入可學(xué)習(xí)的權(quán)重參數(shù)讓模型自動(dòng)學(xué)習(xí)不同尺度特征的貢獻(xiàn)比例強(qiáng)化淺層特征對(duì)小目標(biāo)分支的貢獻(xiàn)。實(shí)現(xiàn)上不需要復(fù)雜改動(dòng)在Concat后接一層權(quán)重預(yù)測(cè)即可工程成本很低。五、訓(xùn)練策略優(yōu)化讓模型主動(dòng)關(guān)注小目標(biāo)結(jié)構(gòu)改完只是搭好了架子訓(xùn)練策略配合到位才能把結(jié)構(gòu)的潛力發(fā)揮出來(lái)。三個(gè)低成本優(yōu)化點(diǎn)幾乎不增加訓(xùn)練耗時(shí)就能再漲1~2個(gè)點(diǎn)。5.1 錨框重新聚類這是最容易被忽略的優(yōu)化點(diǎn)。YOLO默認(rèn)的錨框是基于COCO通用數(shù)據(jù)集聚類得到的尺寸普遍偏大和小目標(biāo)密集的數(shù)據(jù)集匹配度很低導(dǎo)致大量小目標(biāo)匹配不到正樣本模型學(xué)不到有效特征。訓(xùn)練前一定要用自己的數(shù)據(jù)集重新做k-means聚類生成適配的錨框如果是3個(gè)檢測(cè)頭就聚類9組加了P2頭就聚類12組。聚類完成后替換yaml配置文件里的anchors參數(shù)即可。實(shí)測(cè)重新聚類后小目標(biāo)的正樣本匹配數(shù)量能提升30%以上小目標(biāo)AP穩(wěn)定上漲1個(gè)百分點(diǎn)左右完全零推理成本。5.2 小目標(biāo)損失加權(quán)訓(xùn)練時(shí)大目標(biāo)的損失值遠(yuǎn)大于小目標(biāo)模型會(huì)優(yōu)先優(yōu)化大目標(biāo)的精度小目標(biāo)被「邊緣化」。可以在損失計(jì)算時(shí)加入面積權(quán)重目標(biāo)面積越小對(duì)應(yīng)的分類和回歸損失權(quán)重越高強(qiáng)制模型關(guān)注小目標(biāo)的學(xué)習(xí)。核心實(shí)現(xiàn)邏輯defweighted_loss(pred,target,boxes):# 計(jì)算每個(gè)目標(biāo)的歸一化面積areaboxes[:,2]*boxes[:,3]# 面積越小權(quán)重越高范圍1.0~2.5weight1.01.5*(1.0-area)weightweight.clamp(1.0,2.5)# 分類和回歸損失乘以對(duì)應(yīng)權(quán)重cls_lossF.cross_entropy(pred_cls,target_cls,reductionnone)reg_lossF.smooth_l1_loss(pred_reg,target_reg,reductionnone)loss(cls_lossreg_loss)*weight.unsqueeze(-1)returnloss.mean()權(quán)重系數(shù)不要設(shè)太高建議最高不超過(guò)3倍否則會(huì)導(dǎo)致大目標(biāo)精度下降得不償失。5.3 正樣本匹配策略優(yōu)化原生的TAL標(biāo)簽分配策略對(duì)小目標(biāo)不夠友好小目標(biāo)本身錨點(diǎn)少很容易被判定為負(fù)樣本。可以針對(duì)小目標(biāo)做定向優(yōu)化擴(kuò)大小目標(biāo)的正樣本候選范圍比如將topk從9增加到15適當(dāng)降低小目標(biāo)的IoU匹配閾值讓更多錨點(diǎn)參與小目標(biāo)的學(xué)習(xí)注意只針對(duì)小目標(biāo)調(diào)整不要修改中大目標(biāo)的匹配邏輯避免整體精度下降。六、推理側(cè)優(yōu)化落地場(chǎng)景的精度放大器前面的優(yōu)化都是訓(xùn)練側(cè)的推理側(cè)還有兩個(gè)強(qiáng)力手段可以在不重新訓(xùn)練的前提下進(jìn)一步提升小目標(biāo)精度適合離線檢測(cè)、對(duì)速度要求不高的場(chǎng)景。6.1 滑動(dòng)切片推理這是工業(yè)落地最常用的小目標(biāo)優(yōu)化手段核心思路和訓(xùn)練側(cè)的切片對(duì)應(yīng)將輸入大圖按固定尺寸切成有重疊的小切片每個(gè)切片單獨(dú)送入模型推理最后把所有切片的結(jié)果合并做一次全局NMS去重。兩個(gè)核心參數(shù)需要根據(jù)場(chǎng)景調(diào)優(yōu)切片尺寸通常和模型訓(xùn)練尺寸一致比如640×640保證目標(biāo)在切片中的占比足夠大重疊率建議設(shè)為20%~25%避免目標(biāo)剛好落在切片邊緣被截?cái)鄬?dǎo)致漏檢切片推理的收益非常可觀在航拍大圖場(chǎng)景下小目標(biāo)AP通常能提升48個(gè)百分點(diǎn)但代價(jià)是推理速度下降30%60%切片越多速度越慢。如果追求實(shí)時(shí)性可以只對(duì)圖像中目標(biāo)密集的區(qū)域做切片平衡速度和精度。6.2 TTA測(cè)試時(shí)增強(qiáng)和訓(xùn)練時(shí)的數(shù)據(jù)增強(qiáng)對(duì)應(yīng)推理時(shí)對(duì)同一張圖做翻轉(zhuǎn)、多尺度縮放分別推理后將結(jié)果融合能有效降低漏檢率。常用的TTA組合是原圖 水平翻轉(zhuǎn) 1.2倍縮放三個(gè)結(jié)果做加權(quán)NMS。TTA的精度收益約1~2個(gè)百分點(diǎn)速度下降約2倍適合對(duì)精度要求極高、實(shí)時(shí)性要求低的離線場(chǎng)景。6.3 NMS策略適配小目標(biāo)密集的場(chǎng)景普通NMS很容易把相鄰的兩個(gè)小目標(biāo)誤判為同一個(gè)導(dǎo)致漏檢。建議替換為DIoU-NMS同時(shí)適當(dāng)調(diào)低NMS的IoU閾值從默認(rèn)的0.45調(diào)到0.35~0.4減少密集目標(biāo)的誤刪。七、消融實(shí)驗(yàn)與效果對(duì)比以下實(shí)驗(yàn)基于YOLOv11s在VisDrone2019航拍數(shù)據(jù)集上測(cè)試輸入尺寸640×640單卡RTX 3090推理優(yōu)化方案整體mAP0.5小目標(biāo)AP推理FPS參數(shù)量原生基線38.5%24.1%1429.4MCopy-Paste Mosaic適配40.7%27.3%1429.4MP2檢測(cè)頭42.5%29.8%11810.5MCA坐標(biāo)注意力43.6%31.2%11210.7M錨框重聚類 損失加權(quán)44.3%32.5%11210.7M滑動(dòng)切片推理47.1%36.4%4510.7M從數(shù)據(jù)可以清晰看到數(shù)據(jù)層優(yōu)化零成本帶來(lái)3.2個(gè)點(diǎn)的小目標(biāo)提升性價(jià)比最高結(jié)構(gòu)和訓(xùn)練策略疊加再帶來(lái)5.2個(gè)點(diǎn)的提升兼顧速度和精度切片推理收益最大但速度代價(jià)也最高按需選用八、落地避坑與選型建議8.1 不同場(chǎng)景的方案選型實(shí)時(shí)性優(yōu)先如機(jī)載實(shí)時(shí)檢測(cè)只做數(shù)據(jù)層優(yōu)化 P2檢測(cè)頭不開啟切片推理保證幀率精度優(yōu)先如工業(yè)缺陷檢測(cè)全量?jī)?yōu)化 切片推理最大化小目標(biāo)檢出率邊緣端部署數(shù)據(jù)優(yōu)化 輕量化P2頭配合INT8量化平衡精度和速度8.2 高頻踩坑總結(jié)不要盲目加檢測(cè)頭如果數(shù)據(jù)集中小目標(biāo)占比不足10%加P2頭的收益很低反而拖慢速度優(yōu)先從數(shù)據(jù)側(cè)優(yōu)化Copy-Paste不要濫用必須用真實(shí)的目標(biāo)樣本粘貼不要憑空生成粘貼位置要符合場(chǎng)景邏輯否則模型會(huì)學(xué)到假特征標(biāo)注質(zhì)量是上限小目標(biāo)本身標(biāo)注誤差大建議先做一輪標(biāo)注質(zhì)檢修正錯(cuò)位、漏標(biāo)的樣本比改網(wǎng)絡(luò)更有效不要只看整體mAP小目標(biāo)優(yōu)化要單獨(dú)統(tǒng)計(jì)小目標(biāo)AP整體mAP漲幅不大不代表小目標(biāo)沒(méi)有提升最后小目標(biāo)檢測(cè)從來(lái)不是靠某一個(gè)「黑科技」就能解決的它是一個(gè)系統(tǒng)工程。核心思路是先把數(shù)據(jù)側(cè)的基礎(chǔ)打牢用最低成本拿到大部分收益再通過(guò)結(jié)構(gòu)和訓(xùn)練策略的微調(diào)進(jìn)一步挖掘模型潛力最后用推理側(cè)的手段做精度兜底。根據(jù)業(yè)務(wù)的速度和精度要求靈活組合不同的優(yōu)化手段才能找到最適合落地的方案。