前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >YOLO11改进 | 北理工团队在小目标检测领域新创新!NECK层改进,即插即用特征融合模块!

YOLO11改进 | 北理工团队在小目标检测领域新创新!NECK层改进,即插即用特征融合模块!

原创
作者头像
CoovallyAIHub
修改2025-02-07 16:58:17
修改2025-02-07 16:58:17
89800
代码可运行
举报
运行总次数:0
代码可运行

引言

近年来,无人机物体检测在遥感、交通监控、搜索行动和安全等应用领域获得了巨大的发展势头。这些应用的成功实施依赖于快速有效地识别无人机捕获图像中的物体。无人机物体检测面临着独特的挑战,由于分辨率低和背景混杂,导致特征信息有限,因此在无人机图像中小物体检测更容易受到噪声影响,导致有效信息有限。

多尺度特征融合可通过捕捉不同尺度的信息来增强检测能力,但传统策略存在不足。简单的连接或添加操作无法充分利用多尺度融合的优势,导致特征之间的相关性不足,如图1所示。这种不足阻碍了对小物体的检测,尤其是在复杂背景和人口稠密地区。在卷积神经网络(CNN)特征提取过程中,小物体容易出现特征消失的情况。为了解决这一问题并有效利用有限的计算资源,北京理工大学提出了一种基于增强层间特征相关性(EFC)的轻量级融合策略,以取代特征金字塔网络(FPN)中的传统特征融合策略。


一、论文信息

论文题目:A Lightweight Fusion Strategy With Enhanced Interlayer Feature Correlation for Small Object Detection 论文链接: https://ieeexplore.ieee.org/abstract/document/10671587 Github链接: https://github.com/nuliweixiao/EFC


二、方法

EFC策略通过两个专门设计的模块扩展了传统的双层特征图融合架构。通过关注空间上下文信息和层间特征之间的相关性,该策略增强了特征之间的语义表征,从而提高了多尺度特征的学习能力。

具体来说,首先设计了分组特征聚焦单元(GFF),以获取全局信息并增强融合特征的相关性。这一过程主要包括空间聚焦、特征分组和融合以及空间映射归一化。这解决了传统融合策略中特征相关性和匹配性差的问题,提供了更丰富的上下文信息,有助于模型更准确地定位小目标。随后,引入了多层次特征重构(MFR)模块,以取代网络颈部的3×3卷积。多层次特征重构模块将特征中的强信息和弱信息分离开来,引导它们进行转换,实现高层次的特征聚合。通过重构特征,它可以减少浅层和深层特征结合时出现的语义偏差。这种方法旨在减少融合和转换带来的特征余,最大限度地减少深度网络中小物体特征信息的损失,增强对小物体的表示。值得注意的是,该方法可灵活应用于各种利用多尺度特征融合的探测器。

分组特征聚焦单元(GFF)

分组特征聚焦单元(GFF)是一种新颖的机制,旨在通过优化特征之间的上下文信息来增强不同层次特征的相关性。

1)空间集中

该单元增强了特征之间的关联性,提高了信息的表达能力。首先使用线性插值进行上采样,然后进行1×1卷积,以确保特征图的通道编号保持一致。然后将处理后的特征与高分辨率特征P-逐元素相加,得到粗特征。为了完善这一特征并获取上下文感知信息,使用1×1卷积将特征压缩到单通道中以聚合空间信息,然后使用sigmoid激活生成空间聚合权重。

2)特征相关性

为了增强相邻特征之间的相关性,将空间聚合特征沿通道维度分为n组,并按组进行特征交互。对每组内部的特征应用卷积操作,以捕捉更细致的局部模式。生成一个能捕捉通道间特征相关性的注意力掩码然后将该掩码应用于到细化特征。最后,每组的特征串联起来,形成聚合的高度相关的相邻特征。

3)空间映射归一化

将分组聚合特征嵌入多层原始特征融合(MFF)归一化层。利用特征的平均值和标准偏差对其进行归一化处理,从而纳入更多来自较小目标的空间位置信息。通过MFF-GN,得到了具有较强特征相关性和丰富空间信息的特征,可以充分利用相邻层的语义信息,提取不同通道的相关特征,从而增强整体特征表示。

通过采用这种方法,可以充分利用相邻层的语义信息,提取不同通道的相关特征从而增强整特征表示。

多层次特征重构模块(MFR)

多层次特征重构模块(MFR)是将骨干网络不同阶段的特征图中包含的丰富信息与较弱信息分开,并进行独立处理。这样既能最大程度地保留丰富的特征,又能以最少的计算资源转换较弱的特征。

1)特征分离

应用平均池化和sigmoid函数生成每个通道的信息权重,作为特征权重阀值。

单级特征通过批量归一化(BN)单独进行处理,并由sigmoid函数激活,在每个空间位置生成独特的权重信息。

将不同阶段的权重信息与特征权重阀值进行比较,从而得到捕捉空间信息强度的注意力图谱。随后,将来自不同层的强特征和弱特征分别汇总。强特征通常包含更多的语义信息,而弱特征则可能包含细节信息但语义较弱。

2)定向融合

强注意力图谱分别映射到特征,然后这些特征部分融合后生成丰富特征。弱注意力图谱映射到特征上,生成弱特征。

3)特征转换

对丰富的特征,采用1×1卷积来生成包含更多详细信息的特征图。对于弱特征,利用特征变换单元(FTU),用较少的计算资源生成具有更丰富语义信息的特征图。

采用了深度可分离卷积,其计算和参数开销较低。由于深度可分离卷积会破坏信道间的信息流,因此在信道间产生特征调制。在深度可分离卷积操作之后,进行加权映射,以增强信道间的信息流。

4)逐级融合

最后,通过特征转换单元处理的特征与显示更详细信息的特征图合并生成最终特征。该特征既包含详细信息,也包含跨信道信息交换。

使用 MFR 合并来自两个不同层的特征,从而获得更详细的丰富特征,同时减少计算资源的使用。这种方法可以对单个特征进行特定转换,从而最大限度地减少冗余特征的生成。

作为特征融合策略的EFC

根据GFF的输出,特征显示了不同层次的相关特征,侧重于感知空间背景。由MFR生成的特征保留了小范围目标的大量信息,并增强了语义表达。确保了与小目标相关的空间和语义信息的连贯表达。EFC取代了传统的、直接的融合操作,如相邻特征的简单接触或添加方法。

复杂性分析

EFC减少了对大内核卷积的使用在特征融合阶段,这有助于最大限度地减少生成冗余特征。分析了理论参数消耗,计算出标准3×3卷积的参数为

EFC的参数消耗主要发生在特征转换和特征相关阶段。

与标准卷积法相比,该方法内存使用量要小得多。

代码展示:

代码语言:javascript
代码运行次数:0
运行
复制
import torch.nn as nn
import torch.nn.functional as F
from mmcv.cnn import ConvModule
from mmcv.runner import BaseModule, auto_fp16

from ..builder import NECKS

class EFC(BaseModule):
    def __init__(self,
                 c1, c2
                 ):
        super().__init__()
        self.conv1 = nn.Conv2d(c1, c2, kernel_size=1, stride=1)
        self.conv2 = nn.Conv2d(c2, c2, kernel_size=1, stride=1)
        self.conv4 = nn.Conv2d(c2, c2, kernel_size=1, stride=1)
        self.bn = nn.BatchNorm2d(c2)
        self.sigomid = nn.Sigmoid()
        self.group_num = 16
        self.eps = 1e-10
        self.gamma = nn.Parameter(torch.randn(c2, 1, 1))
        self.beta = nn.Parameter(torch.zeros(c2, 1, 1))
        self.gate_genator = nn.Sequential(
            nn.AdaptiveAvgPool2d((1, 1)),
            nn.Conv2d(c2, c2, 1, 1),
            nn.ReLU(True),
            nn.Softmax(dim=1),
        )
        self.dwconv = nn.Conv2d(c2, c2, kernel_size=3, stride=1, padding=1, groups=c2)
        self.conv3 = nn.Conv2d(c2, c2, kernel_size=1, stride=1)
        self.Apt = nn.AdaptiveAvgPool2d(1)
        self.one = c2
        self.two = c2
        self.conv4_gobal = nn.Conv2d(c2, 1, kernel_size=1, stride=1)
        for group_id in range(0, 4):
            self.interact = nn.Conv2d(c2 // 4, c2 // 4, 1, 1, )

    def forward(self, x):
        x1, x2 = x
        global_conv1 = self.conv1(x1)
        bn_x = self.bn(global_conv1)
        weight_1 = self.sigomid(bn_x)
        global_conv2 = self.conv2(x2)
        bn_x2 = self.bn(global_conv2)
        weight_2 = self.sigomid(bn_x2)
        X_GOBAL = global_conv1 + global_conv2
        x_conv4 = self.conv4_gobal(X_GOBAL)
        X_4_sigmoid = self.sigomid(x_conv4)
        X_ = X_4_sigmoid * X_GOBAL
        X_ = X_.chunk(4, dim=1)
        out = []
        for group_id in range(0, 4):
            out_1 = self.interact(X_[group_id])
            N, C, H, W = out_1.size()
            x_1_map = out_1.reshape(N, 1, -1)
            mean_1 = x_1_map.mean(dim=2, keepdim=True)
            x_1_av = x_1_map / mean_1
            x_2_2 = F.softmax(x_1_av, dim=1)
            x1 = x_2_2.reshape(N, C, H, W)
            x1 = X_[group_id] * x1
            out.append(x1)
        out = torch.cat([out[0], out[1], out[2], out[3]], dim=1)
        N, C, H, W = out.size()
        x_add_1 = out.reshape(N, self.group_num, -1)
        N, C, H, W = X_GOBAL.size()
        x_shape_1 = X_GOBAL.reshape(N, self.group_num, -1)
        mean_1 = x_shape_1.mean(dim=2, keepdim=True)
        std_1 = x_shape_1.std(dim=2, keepdim=True)
        x_guiyi = (x_add_1 - mean_1) / (std_1 + self.eps)
        x_guiyi_1 = x_guiyi.reshape(N, C, H, W)
        x_gui = (x_guiyi_1 * self.gamma + self.beta)
        weight_x3 = self.Apt(X_GOBAL)
        reweights = self.sigomid(weight_x3)
        x_up_1 = reweights >= weight_1
        x_low_1 = reweights < weight_1
        x_up_2 = reweights >= weight_2
        x_low_2 = reweights < weight_2
        x_up = x_up_1 * X_GOBAL + x_up_2 * X_GOBAL
        x_low = x_low_1 * X_GOBAL + x_low_2 * X_GOBAL
        x11_up_dwc = self.dwconv(x_low)
        x11_up_dwc = self.conv3(x11_up_dwc)
        x_so = self.gate_genator(x_low)
        x11_up_dwc = x11_up_dwc * x_so
        x22_low_pw = self.conv4(x_up)
        xL = x11_up_dwc + x22_low_pw
        xL = xL + x_gui

        return xL


class Maxpoll(BaseModule):  # 串联
    def __init__(self, dim, dim_out):
        super().__init__()
        self.conv1 = nn.AvgPool2d(kernel_size=3, stride=2, padding=3 // 2)
        self.conv3 = nn.MaxPool2d(kernel_size=3, stride=2, padding=3 // 2)
        self.conv2 = nn.Conv2d(2 * dim, dim_out, 1, 1)

    def forward(self, x):
        x1 = self.conv1(x)
        x2 = self.conv3(x)
        x3 = torch.cat([x1, x2], dim=1)
        x4 = self.conv2(x3)
        return x4


@NECKS.register_module()
class FPN(BaseModule):
    def __init__(self,
                 in_channels,
                 out_channels,
                 ):
        super(FPN, self).__init__()
        self.P5_1 = nn.Conv2d(in_channels[3], out_channels, kernel_size=1, stride=1, padding=0)
        self.P5_upsampled = nn.Upsample(scale_factor=2, mode='nearest')
        self.P5_2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1)
        self.P4_upsampled = nn.Upsample(scale_factor=2, mode='nearest')
        self.efc1 = EFC(in_channels[2], out_channels)
        self.efc2 = EFC(in_channels[1], out_channels)
        self.efc3 = EFC(out_channels, out_channels)
        self.efc4 = EFC(out_channels, out_channels)
        self.P6 = Maxpoll(out_channels, out_channels)
        self.P7 = Maxpoll(out_channels, out_channels)
        self.down_one = Maxpoll(out_channels, out_channels)
        self.down_two = Maxpoll(out_channels, out_channels)

    @auto_fp16()
    def forward(self, inputs):
        """Forward function."""

        C2, C3, C4, C5 = inputs
        P5_x = self.P5_1(C5)  # 512-256  10
        P5_x = self.P5_2(P5_x)  # 256-256  10
        P5_upsampled_x = self.P5_upsampled(P5_x)  # 256  20
        P4_x = self.efc1([C4, P5_upsampled_x])  # 256  20
        P4_upsampled_x = self.P4_upsampled(P4_x)  # 256  40
        P3_x = self.efc2([C3, P4_upsampled_x])
        P_down1 = self.down_one(P3_x)
        P_4 = self.efc3([P4_x, P_down1])
        P_down2 = self.down_two(P_4)
        P_5 = self.efc4([P5_x, P_down2])
        P6_x = self.P6(P_5)
        P7_x = self.P7(P6_x)

        return [P3_x, P_4, P_5, P6_x, P7_x]


三、Coovally AI模型训练与应用平台

如果你也想要进行模型改进或模型训练,Coovally平台满足你的要求!

Coovally平台整合了国内外开源社区1000+模型算法各类公开识别数据集,无论是YOLO系列模型还是MMDetection框架下的模型算法,平台全部包含,均可一键下载助力实验研究与产业应用。

而且在该平台上,无需配置环境、修改配置文件等繁琐操作,一键上传数据集,使用模型进行训练与结果预测,全程高速零代码

平台链接:https://www.coovally.com

如果你想要另外的模型算法数据集,欢迎后台或评论区留言,我们找到后会第一时间与您分享!


四、实验比较

VisDrone数据集

EFC可以灵活地集成到利用FPN网络的各种最先进的基线探测器中。为了验证该方法的有效性,将其与各种最先进的检测器相结合,包括使用各种骨干网络的GFL和RetinaNet。与基线模型相比,采用该方法减少了参数数量和GFLOPs,同时提高了检测精度。特别是,取代了RetinaNet中的FPN检测精度(AP)提高了3.1%,而模型的计算负荷减少了17.7%,使用GFL作为基本检测器,达到了30.1mAP。这凸显了在小物体检测方面的优越性。值得注意的是,与原始FPN网络相比,该方法减少了42.7%的GFLOPs和20.1%的Params。

与最先进的轻量级方法进行比较的结果,包括轻量级骨干网络ShuffleNet V2和MobileNet V2,以及轻量级检测头QueryDet和CEASC。在降低参数和GFLOPs的同时,显著提高了检测精度。以GFL为基线,通过替换轻量级骨干网络MobileNetV2和ShuffleNetV2,其准确性的提高微乎其微。使用轻量级检测头CEASC,虽然GFLOPs大大减少,但检测精度的提高却微乎其微。使用GFL作为基础检测器,我们的方法提高检测精度与基线模型和CEASC相比,mAP分别降低了1.7%和1.4%,该方法通过颈端的融合方法大大提高了小目标的检测精度。这实现了模型复杂性和检测精度之间的平衡,而且该方法可以与其他轻量级方法同时使用。

同时展示了基线模型和热图。从结果可以看出,该方法改善了小物体感受视野,尤其是在目标密集且距离摄像机较远的区域。

UAVDT数据集

UAVDT数据集包含大量小型目标,并包含许多低照度、复杂背景图像,可以更好地反映网络在小型目标检测方面的性能。以GFL为基线模型,AP提高了2.0%,超过了许多最先进的方法。与最新的轻量级方法CEASC相比,检测准确率在AP中提高了0.9%,在AP50中提高了0.6%,在AP75中提高了1.1%。

展示了低光照条件下的检测性能,并与其他最先进的方法进行了比较。从图中可以看出,ClusDet、DREN和GFL很难检测到一些与背景相似的目标,因此容易受到背景干扰的影响。相比之下,该方法有效地利用了有限的小目标信息来检测目标,体现了其优越性。

COCO数据集

使用了不同的基线模型来证明该方法可以广泛应用于各种检测器,并能进一步提高最先进方法的性能。使用RetinaNet和GFL作为基线模型,分别将APs提高1.7%和1.4%。实验结果表明,该方法不仅对无人机图像中的小物体检测有效,而且对一般的小物体检测任务也很有效。

为了研究方法的特征代表性,将特征金字塔的第一层特征图可视化,并与基线模型进行比较。

消融实验

GFF增强了特征之间的相关性,加强了小物体在不同特征之间的依赖性,从而可以感知更多的语义信息。这使得AP比基线模型提高了1.2%。MFR取代了颈部的3×3卷积,大大减少了颈部所消耗的计算资源。与PAFPN相比,参数数和GFLOPs分别减少了23.1%和8.8%。此外,通过重构特征,深度卷积中的小物体信息损失得到了缓解,从而使检测精度提高了1.0%。

同时还针对GFF和MFR进行消融实验,分析其关键组件的影响。

GFF消融实验分别评估了感知上下文信息的空间注意机制、分组单元的数量以及GFF中的MFF-GN结构。并与其他几种上下文感知方法进行比较,如Point-wise、CBAM和标准3x3卷积,相比较使用空间注意力模块在准确性和资源利用率方面更具优势。

为了增强不同层之间的特征空间映射,并改善原始空间中小物体的特征表示,还采用了MFF-GN归一化技术,与BN、GN、SN、IN和标准1x1卷积。

MFR消融实验将FTU与其他轻量级卷积olution模块进行了比较,FTU模块在性能上超越了其他方法,同时消耗的计算资源更少,在精度和效率之间实现了值得称道的平衡。与DWConv、GConv和PConv相比,AP分别提高了0.6%、0.3%和0.4%


五、总结

该轻量级网络架构不仅提升了复杂场景下的小目标检测精度,还具有即插即用的特性,能够广泛应用于不同场景的小目标检测任务。研究表明,EFC策略在处理无人机图像时,能够显著提高小目标的检测效果,尤其是在背景复杂的情况下。这种方法减少了深度网络中小物体信息的损失,并最大限度地减少了无关特征的提取。值得注意的是,该策略可以灵活地集成到FPN网络中。在VisDrone、UAVDT和COCO上的大量实验结果证明了EFC在小目标检测中的有效性,并显著减少了颈部的计算资源。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 一、论文信息
  • 二、方法
    • 分组特征聚焦单元(GFF)
      • 1)空间集中
      • 2)特征相关性
      • 3)空间映射归一化
    • 多层次特征重构模块(MFR)
      • 1)特征分离
      • 2)定向融合
      • 3)特征转换
      • 4)逐级融合
    • 作为特征融合策略的EFC
    • 复杂性分析
  • 三、Coovally AI模型训练与应用平台
  • 四、实验比较
    • VisDrone数据集
    • UAVDT数据集
    • COCO数据集
    • 消融实验
  • 五、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档