专栏名称: 小白学视觉
本公众号主要介绍机器视觉基础知识和新闻,以及在学习机器视觉时遇到的各种纠结和坑的心路历程。
目录
相关文章推荐
新浪科技  ·  【#阿里美股盘前拉升#】阿里巴巴(BABA. ... ·  20 小时前  
新浪科技  ·  【#OpenAI超级碗广告##OpenAI超 ... ·  2 天前  
新浪科技  ·  【#顶级域名重定向到DeepSeek#,此前 ... ·  2 天前  
腾讯研究院  ·  腾讯研究院AI每周关键词Top50 ·  4 天前  
新浪科技  ·  【#腾讯云上线DeepSeek接口#:率先支 ... ·  4 天前  
51好读  ›  专栏  ›  小白学视觉

北理工提出轻量级特征融合EFC,即插即用,小目标检测涨点!

小白学视觉  · 公众号  ·  · 2024-12-07 10:23

正文

点击上方 小白学视觉 ”,选择加" 星标 "或“ 置顶

重磅干货,第一时间送达

本文转载自:AI缝合术

一、论文信息




1
论文题目 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
所属机构: 北京理工大学
关键词: 特征融合、轻量级、小目标检测

二、论文概要




Highlight

图5. 在UAVDT上,低光和相似背景条件下,ClusDet、DREN、GFL和我们提出的方法的检测结果可视化。左侧是待检测的原始图像,右侧是不同方法检测到的定位效果图像。红色框是真实情况,绿色框是预测结果,紫色框代表我们方法的优势检测结果。

图5。左图:原始ResNet50的第一阶段特征,右图:嵌入SRU的ResNet50的第一阶段特征。

图6. 在COCO数据集上,RetinaNet与我们方法的定性结果比较。红色框是真实标签,绿色框是预测结果。
特征图是从特征金字塔的第一阶段提取的。颜色越亮表示模型对该区域的关注度越高。

研究背景:

  • 无人机图像中小目标检测的挑战: 无人机图像具有高分辨率和显著的背景噪声,这使得目标检测更加困难。特别是小目标的低分辨率使得它们更容易受到噪声的影响,导致有效信息有限。
  • 多尺度特征融合的重要性: 通过增强网络对小目标的感知能力,多尺度特征融合可以提高检测精度。然而,传统的特征金字塔网络(FPN)中的简单拼接或加法操作未能充分利用多尺度融合的优势,导致特征之间的相关性不足。
本文贡献:
  • 轻量级融合策略的需求: 为了在有限的计算资源下高效利用多尺度融合,提出了一种基于增强层间特征相关性(EFC)的轻量级融合策略,以替代FPN中的传统特征融合策略。
总体结论:
  • 本文提出了一种基于增强层间特征相关性的轻量级融合策略(EFC),通过GFF和MFR两个主要组件,有效提高了小目标检测的精度,同时显著减少了计算资源的消耗。通过在VisDrone、UAVDT和COCO数据集上的广泛实验,证明了该方法的有效性。此外,该方法具有良好的灵活性和通用性,可以广泛应用于各种基础网络,并进一步提高现有方法的性能。
三、方法



1

图2. 基于EFC轻量级融合策略(EFC)的FPN框架详细结构。以GFL作为基础检测器。值得注意的是,这种方法可以灵活地应用于任何基于FPN架构的检测器。EFC用GFF和MFR替换了传统的融合策略和颈部的大核卷积。

图3. FTU结构示意图。

EFC由两个主要组成部分构成:GFF和MFR。
GFF增强了相邻特征之间的相关性,并专注于关键信息。MFR分离强和弱的空间信息,利用轻量级卷积模块实现精确的特征转换。这种方法减少了不相关信息的提取,同时在深层网络中保留了小对象的关键细节。

1. Grouped Feature Focus Unit (GFF) 用于增强特征相关性,它通过关注不同特征之间的空间上下文信息来提高特征的语义表示。GFF 实现过程:

  1. 空间聚焦: 首先,GFF 通过上采样和 1×1 卷积操作来确保特征图的通道数保持一致,然后将低分辨率的特征图与高分辨率的特征图进行元素级相加,得到粗略的特征图。接着,使用 1×1 卷积将特征图压缩到单个通道,以聚合空间信息,并通过 Sigmoid 激活函数生成空间聚焦权重。
  2. 特征分组与融合: 将空间聚焦后的特征图沿通道维度分成多个组,对每个组内的特征进行交互操作。具体来说,使用卷积模块对每个组内的相邻通道特征进行细化,生成一个注意力掩码,该掩码捕获了不同通道间的特征相关性。然后将这个掩码应用于细化后的特征,最后将各组的特征连接起来,形成聚合且高度相关的相邻特征。
  3. 空间映射归一化: 将分组聚合后的特征嵌入到具有多层原始特征融合(MFF)的归一化层中。通过使用特征图的均值和标准差进行归一化,从而融入更多小目标的空间位置信息。通过这种方式,我们获得了具有强特征相关性和丰富空间信息的特征。

2. Multilevel Feature Reconstruction Module (MFR) 用于特征重建和转换,旨在减少特征融合过程中产生的冗余特征,并保留更多关于小目标的信息。MFR实现过程:

  1. 特征分离: 首先,MFR 从不同阶段的特征图中提取强特征和弱特征。这一步骤涉及到将特征图中的强信息和弱信息分离,以便独立处理。
  2. 特征转换: 对于强特征,MFR 应用 1×1 卷积来生成包含更多详细信息的特征图。对于弱特征,MFR 利用设计的 Feature Transformation Unit (FTU) 来生成具有丰富语义信息的特征图,同时使用较少的计算资源。FTU 通过深度可分离卷积来实现,这种卷积操作降低了计算和参数开销。
  3. 级联融合: 最后,MFR 将通过特征转换单元处理的特征与显示更多详细信息的特征图合并,生成最终的特征图。这个特征图包含了详细信息和跨通道信息交换。

四、实验分析



  • VisDrone数据集上的结果: 通过将EFC集成到不同的FPN网络中,与基线模型相比,检测精度提高,同时参数和GFLOPs减少。特别是,使用GFL作为基线检测器时,我们的方法在VisDrone数据集上实现了30.1mAP,比基线模型提高了1.7%。

  • UAVDT数据集上的结果: 在UAVDT数据集上,我们的方法在AP50上比基线模型提高了2.0%,在AP、AP50和AP75上分别比最新的轻量级方法CEASC提高了0.9%、0.6%和1.1%。

  • COCO数据集上的结果: 在COCO数据集上,我们的方法在APs上比基线模型提高了1.7%,在AP50、AP75、APM和APL上也有所提高。

五、代码




1
温馨提示: 对于所有推文中出现的代码, 如果您在微信中复制的代码排版错乱,请复制该篇推文的链接,在任意浏览器中打开,再复制相应代码,即可成功在开发环境中运行!或者进入官方github仓库找到对应代码进行复制!
import torchimport torch.nn as nnimport torch.nn.functional as F
# 论文题目: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# 所属机构:北京理工大学# 关键词:特征融合、轻量级、小目标检测# 微信公众号:AI缝合术
class EFC(nn.Module): 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






请到「今天看啥」查看全文