核心問題
- ?小目標檢測性能差:?? 盡管通用目標檢測器(如 Faster R-CNN, YOLO, SSD)在常規目標上表現出色,但在檢測微小目標(如 AI-TOD 基準定義的:非常小目標 2-8 像素,小目標 8-16 像素,較小目標 16-32 像素)時性能急劇下降。
- ?根本原因:?? 微小目標極其有限的像素導致其特征表示非常微弱且缺乏區分度。深度神經網絡的下采樣過程導致信息丟失,這對微小目標尤其致命,使它們在特征圖上幾乎與背景無法區分(如圖 1(b) 所示)。
- ?現有方法的不足:?? 現有的解決方案(如尺度感知特征融合、注意力機制、模仿學習)部分緩解了問題,但未能有效解決由極度有限像素引起的弱表示問題。注意力機制尤其容易受到微小目標稀疏像素的影響,導致注意力圖不可靠。
解決方案:FIP-GDE 框架
論文提出了一種名為 ?Feature ?Information driven ?Position ?Gaussian ?Distribution ?Estimation (FIP-GDE) 的即插即用架構,旨在增強因信息丟失而變得微弱和難以區分的區域(即微小目標)。核心思想是從像素級信息量的角度出發來識別需要增強的區域。
-
?像素特征信息建模 (Pixels Feature Information Modeling - PFIM)??
- ?目標:?? 無監督地識別圖像中信息量豐富的區域(通常是顯著目標,包括微小目標)。
- ?原理:?? 基于信息論(香農熵)。信息量?
I(x) = -log?p(x)
,信息量大的區域(顯著目標)出現概率?p(x)
?小,信息量小(平滑背景)出現概率大。 - ?方法:??
- 對底層特征圖?
P?
(記為?y
)進行量化(添加均勻噪聲模擬訓練)。 - 使用 CNN 參數估計模塊預測每個像素元素的均值圖?
μ
?和尺度圖?σ
(代表其高斯分布的參數)。 - ?關鍵創新:?? 最小化信息熵損失 (Information Entropy Loss -?
L_IE
)?。該損失是量化特征??
?的整體編碼成本(比特數)的反映:L_IE = Σ? -log? p??(??|μ?, σ?)
。 - ?優化過程的作用:?? 最小化?
L_IE
?促使網絡學習?y
?的分布模型,使其能高效壓縮特征。在此過程中,信息量大的區域(如目標)需要更多的編碼比特(成本高),而背景區域需要的比特少(成本低)。
- 對底層特征圖?
- ?輸出 - 信息圖 (Information Map?
σ
):??- 預測的尺度圖?
σ
?被發現與信息量圖(每個像素的編碼成本)高度正相關,且視覺上更顯著(如圖 3(b) 所示)。 σ
?值大的區域對應信息量大、需要增強的顯著區域(目標)。- 使用?
σ
?初步增強?P?
:y? = y ? (1 + Mean(σ))
(Mean
?為通道維度平均)。
- 預測的尺度圖?
?
?2.位置高斯分布預測 (Position Gaussian Distribution Prediction - PGDP)??
- ?目標:?? 提供監督信號,使信息圖?
σ
?和增強過程更關注微小目標。微小目標需要在分布圖中獲得比普通目標更高的強度值。 - ?核心組件 - 位置高斯分布圖 (Position Gaussian Distribution Map?
M_GT
):??- 使用高斯混合模型 (Gaussian Mixture Model)?? 建模。每個目標實例對應一個高斯分量。
- ?關鍵創新 (縮放因子?
α?
):?? 高斯分量的協方差矩陣?Σ?^box
?根據目標框的大小動態調整:Σ?^box = diag((w?/α?)2, (h?/α?)2)
。 α?
?取值:非常小目標 (vt) = 4, 小目標 (t) = 6, 較小目標 (s) = 8, 普通目標 = 10。這導致微小目標的協方差更小,在分布圖中峰值更高?(如圖 4 所示)。- 最終?
M_GT
?通過組合所有高斯分量、乘以實例數?N
?并應用閾值處理來增強前景背景對比度獲得。
- ?預測模塊:??
- 使用多尺度特征?
P?, P?, P?
?來預測?M_GT
。 - ?關鍵設計:?? 將信息圖?
σ
??作為先驗知識引導預測。輸入為?[P? + (1/4)σ, P? + (1/2)σ, P? + σ]
?(1/4
,?1/2
?表示下采樣)。 - 網絡結構包含卷積、反卷積和跨層連接(如圖 2 所示),輸出三個尺度的預測圖?
M_pd?, M_pd?, M_pd?
。 - 使用加權均方誤差損失 (
L_pred
) 進行深度監督,對目標區域(值 > 閾值?th
)賦予更高權重(10 vs 背景的 0.1)。
- 使用多尺度特征?
- ?協同作用:???
σ
?指導?M_pd
?的預測;反過來,優化?L_pred
?也有助于生成能更好識別微小目標信息豐富區域的?σ
。 - ?增強:?? 使用預測的?
M_pd?
?增強?P?
:y? = y ? (1 + M_pd?)
。
?
-
?特征融合與最終輸出?
- 將兩個增強特征?
y?
?(由?σ
?增強) 和?y?
?(由?M_pd?
?增強) 分別送入 ?CBAM (Convolutional Block Attention Module)?? 模塊進行進一步的空間和通道注意力優化。 - 將兩個經過注意力優化的特征圖按元素相加 (Element-wise Addition)?? 融合,得到最終的增強特征圖?
P?'
。 P?'
?替換原始 FPN 中的?P?
,送入檢測頭執行檢測任務。
- 將兩個增強特征?
-
?損失函數?
總損失函數結合了檢測損失、信息熵損失和分布圖預測損失:
L = L_det + λ?L_IE + λ?L_pred
?(λ?=0.01
,?λ?=1.0
)
實驗結果
-
?數據集:?? 在三個公開的小目標檢測數據集上進行了廣泛實驗:VisDrone2019, AI-TOD, AI-TODv2。
-
?評估指標:?? 遵循 AI-TOD 基準,包括 AP, AP?.?, AP?.??, APvt?(非常小目標), APt?(小目標), APs?(較小目標)。
-
?主要發現:??
- ?顯著提升:?? 作為即插即用模塊集成到多種主流檢測器(Faster R-CNN, Cascade R-CNN, DetectoRS, RFLA)中,均帶來了顯著性能提升,尤其在檢測微小目標(APvt, APt)上提升最大(例如,在 VisDrone 上 Faster R-CNN 的 APt?提升 5.8 點)。
- ?SOTA 性能:?? 當與 RFLA 結合時,在 VisDrone2019 上取得了所有指標的最佳性能(AP=29.0, APvt=7.4)。在 AI-TOD 和 AI-TODv2 上,與 DetectoRS 結合也獲得了極具競爭力的結果(通常是最好或次好)。
- ?超越現有方法:?? 性能優于近期專門針對小目標檢測的方法(如 NWD-RKA, RFLA, SR-TOD, Salience DETR),證明了提出方法的優越性。特別指出 SR-TOD 的差異圖依賴圖像復原質量且會損失信息,而 FIP-GDE 直接在特征圖層面識別信息損失區域。
-
?消融研究 (Ablation Study):??
- ?模塊有效性:?? PFIM 和 PGDP 模塊均獨立有效,結合使用效果最佳。
- ?分布圖建模:?? 提出的基于目標大小動態調整?
α?
?的高斯建模方法優于固定縮放因子、二值掩碼或自注意力生成權重圖。 - ?先驗引導:?? 將?
σ
?通過?P? + (scale)σ
?的方式添加到輸入進行引導效果最佳。 - ?融合策略:?? 元素相加融合?
y?
?和?y?
?效果優于元素相乘或拼接。
-
?分析:??
- ?信息圖有效性:?? 可視化(圖 5, 圖 6(a))和信息熵損失分析(比特每像素 bpp 與場景密集度正相關,如圖 7 所示)證明了 PFIM 能有效捕獲信息量大的顯著區域和目標的空間結構。
- ?分布圖有效性:?? 可視化(圖 6(b))表明預測的分布圖?
M_pd?
?能清晰區分前景背景,并賦予微小目標更高強度。最終增強特征?P?'
(圖 6(c))中的目標更顯著,檢測結果(圖 6(f))也證明了能檢測出更多困難的微小目標。
- ?信息圖有效性:?? 可視化(圖 5, 圖 6(a))和信息熵損失分析(比特每像素 bpp 與場景密集度正相關,如圖 7 所示)證明了 PFIM 能有效捕獲信息量大的顯著區域和目標的空間結構。
?
主要貢獻
- 首次從像素級信息量的角度提出增強微小目標弱特征表示的方法,通過最小化信息熵損失無監督地生成注意力信息圖?
σ
。 - 引入由高斯混合模型建模的位置高斯分布圖??
M_GT
,并創新性地根據目標大小動態調整高斯分量協方差,使微小目標獲得更高強度。 - 構建了以信息圖為先驗指導的多尺度分布圖預測模塊,協同調制信息圖和分布圖聚焦于微小目標。
- 提出的 FIP-GDE 框架是即插即用的,可靈活集成到類似 FPN 的檢測器中,在三個公開數據集上的大量實驗證明了其有效性和優越性,超越了當前最先進的方法。
核心代碼實現
1. 像素特征信息建模模塊(PFIM)
?
import torch
import torch.nn as nn
import torch.nn.functional as Fclass PFIM(nn.Module):def __init__(self, in_channels):super().__init__()# 參數估計網絡:預測高斯分布的μ和σself.param_net = nn.Sequential(nn.Conv2d(in_channels, 64, 3, padding=1),nn.ReLU(),nn.Conv2d(64, in_channels * 2, 3, padding=1) # 輸出μ和σ)def forward(self, y):"""y: 輸入特征圖 [B, C, H, W]返回: 信息熵損失, 增強特征y1, 信息圖σ"""# 1. 參數估計params = self.param_net(y) # [B, 2*C, H, W]mu, sigma = torch.split(params, params.size(1)//2, dim=1)sigma = torch.exp(sigma) # 確保正值# 2. 量化處理(添加均勻噪聲)if self.training:y_hat = y + torch.rand_like(y) - 0.5 # U(-0.5, 0.5)else:y_hat = torch.round(y) # 推理時直接取整# 3. 計算似然概率(公式5)upper = (y_hat + 0.5 - mu) / sigmalower = (y_hat - 0.5 - mu) / sigmap_yhat = self.std_normal_cdf(upper) - self.std_normal_cdf(lower)# 4. 計算信息熵損失(公式7)p_yhat = torch.clamp(p_yhat, min=1e-10) # 避免log(0)loss_IE = -torch.log2(p_yhat).sum()# 5. 生成信息圖(通道平均)info_map = sigma.mean(dim=1, keepdim=True) # [B, 1, H, W]# 6. 特征初步增強(公式8)y1 = y * (1 + info_map)return loss_IE, y1, info_mapdef std_normal_cdf(self, x):"""標準正態分布累積函數近似"""return 0.5 * (1 + torch.erf(x / torch.sqrt(torch.tensor(2.0))))
2. 位置高斯分布預測模塊(PGDP)
class PGDP(nn.Module):def __init__(self, in_channels):super().__init__()# 多尺度融合網絡(P2-P4)self.conv_p2 = nn.Conv2d(in_channels, 64, 3, padding=1)self.conv_p3 = nn.Conv2d(in_channels, 64, 3, padding=1)self.conv_p4 = nn.Conv2d(in_channels, 64, 3, padding=1)# 上采樣和融合層self.upsample = nn.ModuleList([nn.ConvTranspose2d(64, 64, 4, stride=2, padding=1),nn.ConvTranspose2d(64, 64, 4, stride=2, padding=1)])# 預測頭self.pred_head = nn.Sequential(nn.Conv2d(64 * 3, 64, 3, padding=1),nn.ReLU(),nn.Conv2d(64, 1, 1) # 輸出單通道分布圖)def forward(self, p2, p3, p4, info_map):"""輸入: p2, p3, p4 - 多尺度特征圖 [B, C, H, W]info_map - 信息圖 [B, 1, H, W]返回: 預測分布圖M_pd2, 增強特征y2"""# 1. 信息圖下采樣適配各尺度info_p4 = F.interpolate(info_map, size=p4.shape[2:]) * 0.25info_p3 = F.interpolate(info_map, size=p3.shape[2:]) * 0.5# 2. 特征與信息圖融合p4_in = self.conv_p4(p4 + info_p4)p3_in = self.conv_p3(p3 + info_p3)p2_in = self.conv_p2(p2 + info_map)# 3. 上采樣和特征融合p4_up = self.upsample[0](p4_in) # P4->P3尺寸p3_fused = p3_in + p4_upp3_up = self.upsample[1](p3_fused) # P3->P2尺寸p2_fused = torch.cat([p2_in, p3_up, p3_up], dim=1)# 4. 預測最終分布圖M_pd2 = torch.sigmoid(self.pred_head(p2_fused))# 5. 特征增強y2 = p2 * (1 + M_pd2)return M_pd2, y2
3. 特征增強與融合模塊
class FeatureEnhancer(nn.Module):def __init__(self, in_channels):super().__init__()# CBAM注意力模塊(簡化實現)self.channel_att = nn.Sequential(nn.AdaptiveAvgPool2d(1),nn.Conv2d(in_channels, in_channels//8, 1),nn.ReLU(),nn.Conv2d(in_channels//8, in_channels, 1),nn.Sigmoid())self.spatial_att = nn.Sequential(nn.Conv2d(2, 1, 7, padding=3),nn.Sigmoid())def forward(self, y1, y2):"""輸入: PFIM增強特征y1, PGDP增強特征y2返回: 融合后的增強特征P2'"""# 1. 分別應用CBAM注意力y1_att = self.cbam(y1)y2_att = self.cbam(y2)# 2. 特征融合(元素相加)y_fused = y1_att + y2_attreturn y_fuseddef cbam(self, x):"""簡化版CBAM"""# 通道注意力channel_att = self.channel_att(x)x_channel = x * channel_att# 空間注意力avg_out = torch.mean(x_channel, dim=1, keepdim=True)max_out, _ = torch.max(x_channel, dim=1, keepdim=True)spatial_att = self.spatial_att(torch.cat([avg_out, max_out], dim=1))return x_channel * spatial_att
4. 整體框架集成
class FIPGDE(nn.Module):def __init__(self, backbone_channels):super().__init__()# 實例化核心模塊self.pfim = PFIM(backbone_channels)self.pgdp = PGDP(backbone_channels)self.enhancer = FeatureEnhancer(backbone_channels)# 損失權重self.lambda1 = 0.01self.lambda2 = 1.0def forward(self, p2, p3, p4, gt_bboxes=None):"""輸入: p2, p3, p4 - FPN特征圖gt_bboxes - 訓練時提供GT框用于生成M_GT返回: 增強后的P2'特征, 總損失"""# 1. PFIM模塊loss_IE, y1, info_map = self.pfim(p2)# 2. PGDP模塊M_pd2, y2 = self.pgdp(p2, p3, p4, info_map)# 3. 計算PGDP損失(訓練時)loss_pred = 0if gt_bboxes is not None:M_GT = self.generate_M_GT(gt_bboxes, p2.shape)# 加權MSE損失(公式13)mask = (M_GT > self.threshold).float()weights = mask * 10 + (1 - mask) * 0.1loss_pred = F.mse_loss(M_pd2, M_GT, reduction='none')loss_pred = (loss_pred * weights).mean()# 4. 特征增強與融合p2_prime = self.enhancer(y1, y2)# 5. 總損失total_loss = loss_IE * self.lambda1 + loss_pred * self.lambda2return p2_prime, total_lossdef generate_M_GT(self, gt_bboxes, feat_shape):"""生成位置高斯分布圖(公式9-12)gt_bboxes: [N, 5] (batch_idx, x1, y1, x2, y2)feat_shape: [B, C, H, W]"""# 初始化M_GT為零矩陣B, _, H, W = feat_shapeM_GT = torch.zeros(B, 1, H, W, device=gt_bboxes.device)# 遍歷所有GT框for box in gt_bboxes:b, x1, y1, x2, y2 = boxb = int(b)# 計算中心點(映射到特征圖坐標)cx = ((x1 + x2) / 2) / 4 # P2尺寸是原圖1/4cy = ((y1 + y2) / 2) / 4w = (x2 - x1) / 4h = (y2 - y1) / 4# 確定縮放因子α(基于目標大小)area = w * hif area < 8: alpha = 4 # very tinyelif area < 16: alpha = 6 # tinyelif area < 32: alpha = 8 # smallelse: alpha = 10 # general# 生成高斯分布(公式10)x_grid, y_grid = torch.meshgrid(torch.arange(W, device=M_GT.device), torch.arange(H, device=M_GT.device))gaussian = torch.exp(-(((x_grid - cx) / (w/alpha))?**2 + ((y_grid - cy) / (h/alpha))?**2))# 累加到M_GT(公式11)M_GT[b, 0] += gaussian# 后處理(公式12)M_GT *= len(gt_bboxes) / (B * len(gt_bboxes)) # 平均化threshold = M_GT.mean()M_GT = ((M_GT > threshold).float() * 0.5 + M_GT)return M_GT
論文地址:https://openaccess.thecvf.com/content/CVPR2025/papers/Bian_Feature_Information_Driven_Position_Gaussian_Distribution_Estimation_for_Tiny_Object_CVPR_2025_paper.pdf???????