论文标题: HS-FPN: High Frequency and Spatial Perception FPN for Tiny Object Detection
论文链接: https://arxiv.org/abs/2402.10116
代码链接: https://github.com/ShiZican/HS-FPN


01 研究动机

特征金字塔网络(FPN)通过融合多尺度特征,极大地提升了通用目标检测的性能。然而,在处理“微小目标检测”(Tiny Object Detection, TOD)任务时,FPN 仍面临严峻挑战。根据论文的分析,其核心问题可归结为三点:

  1. 特征信息匮乏:微小目标本身像素面积小,经过骨干网络的多次下采样后,其在特征图上的表示可能仅剩几个像素,有效特征信息严重不足。FPN虽融合了多层特征,但并未直接增强微小目标自身的特征表达。
  2. 网络关注度不足:微小目标的特征响应微弱,易被背景噪声淹没。FPN对各层特征采用统一的处理方式(如1x1卷积、特征相加),缺乏对微小目标特征的特殊“关照”,无法有效聚焦于这些关键但微弱的信号。
  3. 空间感知能力缺失:FPN通过简单的逐像素相加来融合高层与低层特征。这种方式忽略了特征的空间依赖关系,尤其是在上采样过程中可能引入的像素偏移,会导致微小目标的特征在不同层级间无法精确对齐。

为解决上述问题,该研究从频域分析和空间依赖建模两个角度出发,提出了一个新颖的特征金字塔网络——HS-FPN

02 HS-FPN 整体架构

HS-FPN的整体结构与FPN相似,保留了自底向上和自顶向下的双路径设计。其核心创新在于横向连接(Lateral Connection)部分,引入了两个关键模块:高频感知模块(HFP)空间依赖感知模块(SDP)

HS-FPN 整体架构。HFP模块用于增强当前层特征,SDP模块则在融合高低层特征时引入空间感知

  • 自底向上:骨干网络(如ResNet)提取不同阶段的特征图 { C 2 , C 3 , C 4 , C 5 } \{C_2, C_3, C_4, C_5\} {C2,C3,C4,C5}
  • 自顶向下:高层特征图 P i + 1 P_{i+1} Pi+1 经过上采样后,与经过增强的当前层特征图 C i C_i Ci 进行融合,生成新的金字塔特征 P i P_i Pi
  • 横向连接创新
    1. C i C_i Ci 首先通过 HFP 模块,以增强其中微小目标的特征表达。
    2. 增强后的 C i C_i Ci 与上采样后的 P i + 1 P_{i+1} Pi+1 一同送入 SDP 模块,以建立跨层级的空间依赖关系,精确融合特征。

03 核心模块详解

3.1 高频感知模块 (High Frequency Perception, HFP)

HFP模块旨在解决FPN特征信息匮乏和关注度不足的问题。其设计灵感来源于传统图像处理:微小目标的边缘、纹理等细节信息主要对应频域中的高频分量,而大面积的平滑背景则对应低频分量。通过增强高频信号,可以有效凸显微小目标。

设计思路:高频信息提取 → 双路径注意力(通道与空间)→ 特征融合

HFP 模块设计图

  1. 高频响应生成 (High Frequency Response Generation)

    • 输入特征图 C i C_i Ci 首先通过离散余弦变换 (DCT) 转换到频域。
    • 应用一个预设的高通滤波器 (High-Pass Filter),该滤波器是一个二值矩阵,通过屏蔽左上角的低频区域,仅保留右下角的高频信息。
    • 最后通过逆离散余弦变换 (iDCT) 将保留的高频信息转换回空间域,得到高频响应图 F i F_i Fi F i F_i Fi 的维度与 C i C_i Ci 相同。
  2. 双路径注意力机制 (Dual-path Attention)

    • 通道路径 (Channel Path):高频响应图 F i F_i Fi 富含微小目标的特征信息。通过对其进行全局平均池化(GAP)和全局最大池化(GMP)来提取通道统计量,再经过卷积层生成通道注意力权重 u C P u_{CP} uCP。该权重作用于原始特征图 C i C_i Ci,使得网络能够重点关注那些包含更多微小目标信息的特征通道。
    • 空间路径 (Spatial Path):直接利用高频响应图 F i F_i Fi 作为空间掩码。通过一个1x1卷积聚合 F i F_i Fi 的通道信息,生成空间注意力权重 u S P u_{SP} uSP。将其与原始特征图 C i C_i Ci 逐像素相乘,能够强化微小目标所在的空间区域,抑制背景干扰。
  3. 特征融合与输出

    • 将通道路径和空间路径的输出特征相加,并经过一个3x3卷积和归一化处理,进一步整合信息并稳定分布。
    • 最终输出增强后的特征图 C i H F P C_i^{HFP} CiHFP,其维度与输入 C i C_i Ci 保持一致,确保了模块的即插即用性。

3.2 空间依赖感知模块 (Spatial Dependency Perception, SDP)

SDP模块旨在解决FPN缺乏空间感知能力的问题,尤其用于修正上采样带来的特征错位。它借鉴了Transformer中的注意力机制,但计算方式有所不同。

SDP 模块概览

  • 输入:经过HFP增强的当前层特征 C i C_i Ci 和上采样后的高层特征 P i + 1 u P_{i+1}^u Pi+1u
  • 计算过程
    1. 通过三个独立的1x1卷积,分别从 C i C_i Ci 生成Query (Q),从 P i + 1 u P_{i+1}^u Pi+1u 生成Key (K) 和 Value (V)。
    2. 将Q, K, V划分为若干个特征块 (Feature Blocks)
    3. 每个特征块内部,计算Q中每个像素与K中所有像素的相似度,得到注意力矩阵。这是一种块内像素级的交叉注意力。
    4. 该注意力矩阵随后作用于V,生成加权后的新特征。
    5. 最后,将所有处理后的特征块拼接回原始尺寸,并与输入特征 C i C_i Ci 相加,得到富含空间依赖信息的融合特征。

这个过程的数学表达如下,其中 j j j 代表第 j j j 个特征块:
a j = Softmax ( q j × k j T C ) , 1 ≤ j ≤ n a_j = \text{Softmax}\left(\frac{q_j \times k_j^T}{\sqrt{C}}\right), \quad 1 \le j \le n aj=Softmax(C qj×kjT),1jn

公式1: SDP 模块中注意力矩阵的计算(源自论文 Formula 3)。

SDP通过在局部区域内精确匹配高低层特征,有效缓解了因上采样导致的像素不对齐问题,并利用高层特征丰富的语义信息来指导和丰富低层的微小目标特征。

04 实验效果与分析

4.1 模块有效性验证(消融实验)

论文在AI-TOD数据集上进行了详细的消融实验,验证了HFP及其各组件(通道路径CP、空间路径SP)以及SDP模块的有效性。

各组件在AI-TOD测试集上的效果

  • 基线 (Baseline):标准的FPN(表1第一行),AP为20.2。
  • HFP效果:单独加入HFP模块后(第四行),AP提升至22.4(+2.2),其中对微小目标( A P t AP_t APt)和小型目标( A P s AP_s APs)的提升尤为显著。这證明了HFP通过增强高频特征,确实改善了对小目标的检测能力。
  • SDP效果:单独加入SDP模块后(第五行),AP提升至21.3(+1.1),说明建模空间依赖关系是有效的。
  • HS-FPN (HFP+SDP):当HFP和SDP同时使用时(最后一行),AP达到了23.6(+3.4),取得了最佳性能,显示了两个模块之间的协同增益效应。

4.2 特征可视化

通过可视化HFP处理前后的特征图,可以直观地看到其增强效果。

HFP处理前后P2层特征图的可视化对比
从图4可以看出,原始特征图(左)中,微小目标的响应非常微弱,几乎淹没在背景中。经过HFP模块处理后(右),目标的特征响应被显著增强,轮廓更加清晰,与背景的区分度也更高。

05 代码使用方式

HS-FPN被设计为FPN的直接替代品,可以轻松集成到现有的基于MMDetection的目标检测框架中。

适用范围:最适用于微小目标检测任务,如遥感影像分析、无人机视觉、自动驾驶等场景。也可用于任何需要增强高频细节特征的视觉任务。

模块位置:在FPN的横向连接处,替代原有的 1x1卷积 + 相加 结构。

开发者在mmdet/models/necks/fpn.py等FPN实现文件中,可以通过以下步骤集成HS-FPN:

  1. 定义HFP和SDP模块:实现论文中描述的HFP和SDP模块的PyTorch代码。
  2. 修改forward函数:在FPN的forward函数中,修改横向连接的逻辑。
    # 伪代码示例
    # laterals 是骨干网络输出的特征 C2, C3, C4, C5
    # used_backbone_levels = [0, 1, 2, 3]
    
    # 1. 对每一层应用 HFP 模块
    hfp_laterals = [
        self.hfp_modules[i](laterals[i]) for i in used_backbone_levels
    ]
    
    # 2. 自顶向下构建金字塔
    # 从顶层 P5 开始
    prev_feat = hfp_laterals[-1]
    pyramid_feats = [prev_feat]
    
    # 逆序遍历
    for i in range(len(used_backbone_levels) - 2, -1, -1):
        # 上采样高层特征
        upsampled_feat = F.interpolate(prev_feat, scale_factor=2, mode='bilinear')
      
        # 应用 SDP 模块进行融合
        # SDP输入为 (当前层特征, 上采样后的高层特征)
        prev_feat = self.sdp_modules[i](hfp_laterals[i], upsampled_feat)
        pyramid_feats.append(prev_feat)
    
    # 3. 对输出进行 3x3 卷积
    outs = [
        self.fpn_convs[i](pyramid_feats[i]) for i in range(len(pyramid_feats))
    ]
    

注意:上述伪代码仅为逻辑展示,具体实现需参考作者提供的源码。该模块具有良好的即插即用性,对原有代码结构的侵入性较低。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐