
论文题目: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):


在小目标检测中,特征的相关性对于提高检测精度至关重要。分组特征关注单元(GFF)是一种新颖的机制,旨在通过优化特征之间的上下文信息来增强不同层次特征的相关性。
GFF的增强特征相关性过程可以分为几个关键步骤:
通过这些步骤,GFF能够有效地增强相邻特征之间的相关性,提高特征的语义表示质量,从而在复杂背景下提升小目标的检测能力[1][3][4]。
在小目标检测中,特征融合是提升检测精度的关键步骤。传统的特征融合方法往往存在冗余信息和特征丢失的问题,尤其是在处理小目标时。为了解决这些问题,研究团队提出了多级特征重构模块(MFR),旨在优化特征融合过程。
该轻量级网络架构不仅提升了复杂场景下的小目标检测精度,还具有即插即用的特性,能够广泛应用于不同场景的小目标检测任务。研究表明,EFC策略在处理无人机图像时,能够显著提高小目标的检测效果,尤其是在背景复杂的情况下[3][5]。

import torch
import torch.nn as nn
import torch.nn.functional as F
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 = 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
if __name__ == '__main__':
# 创建一个随机输入张量,形状为 (batch_size,height×width,channels)
input1 = torch.rand(1, 64,40, 40)
input2= torch.rand(1, 64,40, 40)
# 实例化EFC模块
block = EFC(64,64)
# 前向传播
output = block([input1,input2])
# 打印输入和输出的形状
print(input1.size(),input2.size())
print(output.size())
__init__:c1 和 c2,分别表示输入特征图的通道数和输出特征图的通道数。conv1, conv2, conv3, conv4),用于特征提取和变换。BatchNorm2d 对卷积输出进行归一化,帮助加速训练并提高稳定性。Sigmoid 激活函数来生成权重。AdaptiveAvgPool2d 和卷积层生成特征权重,使用 Softmax 进行归一化。dwconv 用于处理通道间的特征交互。interact 用于在特征组之间进行交互。forward:x1 和 x2。conv1 和 conv2 提取特征,并进行批归一化和激活。X_GOBAL。xL。特征提取与融合:
global_conv1 = self.conv1(x1)
global_conv2 = self.conv2(x2)
X_GOBAL = global_conv1 + global_conv2
这段代码通过两个卷积层提取输入特征图的特征,并将它们相加以生成全局特征图。
特征标准化:
x_guiyi = (x_add_1 - mean_1) / (std_1 + self.eps)
通过标准化处理,确保特征的均值为0,标准差为1,从而提高模型的训练效果。
门控机制:
x_so = self.gate_genator(x_low)
使用门控机制来控制特征的流动,增强重要特征的表达。
在 __main__ 部分,创建了两个随机输入张量,并实例化了 EFC 模块。通过前向传播,输出了融合后的特征图。
input1 = torch.rand(1, 64, 40, 40)
input2 = torch.rand(1, 64, 40, 40)
block = EFC(64, 64)
output = block([input1, input2])
输出结果:
torch.Size([1, 64, 40, 40]) torch.Size([1, 64, 40, 40])
torch.Size([1, 64, 40, 40])
https://jingjing.blog.csdn.net/article/details/145247413?spm=1001.2014.3001.5502
YOLO11m summary (fused): 363 layers, 24,487,092 parameters, 0 gradients
Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 15/15 [00:02<00:00, 6.03it/s]
all 230 1412 0.189 0.126 0.043 0.0172
c17 40 131 0.103 0.588 0.121 0.0425
c5 19 68 0.0416 0.0441 0.0705 0.0256
helicopter 13 43 0.00666 0.00821 0.0192 0.00735
c130 20 85 0.0897 0.6 0.111 0.0486
f16 11 57 0.0263 0.0877 0.0222 0.00715
b2 2 2 1 0 0 0
other 13 86 0.144 0.0465 0.0778 0.0245
b52 21 70 0.132 0.257 0.0851 0.0321
kc10 12 62 0.0239 0.0161 0.0311 0.0135
command 12 40 0.021 0.025 0.0172 0.00549
f15 21 123 0.066 0.00813 0.0344 0.0117
kc135 24 91 0.209 0.527 0.257 0.125
a10 4 27 0 0 0.00229 0.00099
b1 5 20 0 0 0.00117 0.000421
aew 4 25 0.0325 0.0793 0.0101 0.00565
f22 3 17 0 0 0.00444 0.00112
p3 6 105 0 0 0.00749 0.00169
p8 1 1 0 0 0 0
f35 5 32 1 0 0.0146 0.00712
f18 13 125 0.109 0.872 0.202 0.0796
v22 5 41 0.0281 0.171 0.0128 0.00595
su-27 5 31 0.0343 0.0645 0.0318 0.00957
il-38 10 27 0 0 0.00964 0.00265
tu-134 1 1 1 0 0 0
su-33 1 2 0 0 0 0
an-70 1 2 1 0 0 0
tu-22 8 98 0.035 0.0102 0.018 0.00576
综上所述,基于增强层间特征相关性的轻量级融合策略为小目标检测提供了一种有效的解决方案。通过优化特征融合过程,该方法能够更好地应对小目标检测中的挑战,提升检测精度和效率。