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