文章目录
1、Mixed Local Channel Attention
现有通道注意力机制的局限性: 大多数通道注意力机制只关注通道特征信息,忽略了空间特征信息,导致模型的表达能力或目标检测性能较差。空间注意力模块的复杂性: 现有的空间注意力模块往往结构复杂,计算量大,难以直接应用于轻量级网络模型。这篇论文提出一种 混合局部通道注意力(Mixed Local Channel Attention),MLCA 的提出便是为了解决现有通道注意力机制的局限性,并提高目标检测网络的性能。
MLCA 的基本思想是通过将局部空间信息融入到通道注意力机制中,同时考虑通道信息、空间信息、局部信息和全局信息,从而提高网络的表达效果。
对于输入X,MLCA 的实现过程:
- 两步池化: 首先,对输入特征向量进行局部池化,将其转换为 1 * C * ks * ks 的向量,以提取局部空间信息。
- 双分支结构: 将输入特征向量分为两个分支:全局信息分支: 使用全局平均池化(GAP)将特征向量转换为 1 * 1 * C 的向量,保留全局信息。局部空间信息分支: 使用局部平均池化(LAP)将特征向量转换为 1 * 1 * C 的向量,保留局部空间信息。
- 一维卷积加速: 对两个分支分别进行一维卷积,将特征向量恢复到原始分辨率。
- 混合注意力: 将两个分支的特征向量进行融合,得到最终的混合注意力特征图。
Mixed Local Channel Attention 结构图:
2、代码实现
import torch
import torch.nn as nn
import torch.nn.functional as F
import math
class MLCA(nn.Module):
def __init__(self, in_size,local_size=5,gamma = 2, b = 1,local_weight=0.5):
super(MLCA, self).__init__()
# ECA 计算方法
self.local_size=local_size
self.gamma = gamma
self.b = b
t = int(abs(math.log(in_size, 2) + self.b) / self.gamma) # eca gamma=2
k = t if t % 2 else t + 1
self.conv = nn.Conv1d(1, 1, kernel_size=k, padding=(k - 1) // 2, bias=False)
self.conv_local = nn.Conv1d(1, 1, kernel_size=k, padding=(k - 1) // 2, bias=False)
self.local_weight=local_weight
self.local_arv_pool = nn.AdaptiveAvgPool2d(local_size)
self.global_arv_pool=nn.AdaptiveAvgPool2d(1)
def forward(self, x):
local_arv=self.local_arv_pool(x)
global_arv=self.global_arv_pool(local_arv)
b,c,m,n = x.shape
b_local, c_local, m_local, n_local = local_arv.shape
# (b,c,local_size,local_size) -> (b,c,local_size*local_size)-> (b,local_size*local_size,c)-> (b,1,local_size*local_size*c)
temp_local= local_arv.view(b, c_local, -1).transpose(-1, -2).reshape(b, 1, -1)
temp_global = global_arv.view(b, c, -1).transpose(-1, -2)
y_local = self.conv_local(temp_local)
y_global = self.conv(temp_global)
# (b,c,local_size,local_size) <- (b,c,local_size*local_size)<-(b,local_size*local_size,c) <- (b,1,local_size*local_size*c)
y_local_transpose=y_local.reshape(b, self.local_size * self.local_size,c).transpose(-1,-2).view(b,c, self.local_size , self.local_size)
# y_global_transpose = y_global.view(b, -1).transpose(-1, -2).unsqueeze(-1)
y_global_transpose = y_global.view(b, -1).unsqueeze(-1).unsqueeze(-1) # 代码修正
# print(y_global_transpose.size())
# 反池化
att_local = y_local_transpose.sigmoid()
att_global = F.adaptive_avg_pool2d(y_global_transpose.sigmoid(),[self.local_size, self.local_size])
# print(att_local.size())
# print(att_global.size())
att_all = F.adaptive_avg_pool2d(att_global*(1-self.local_weight)+(att_local*self.local_weight), [m, n])
# print(att_all.size())
x=x*att_all
return x
if __name__ == '__main__':
x = torch.randn(4, 512, 7, 7)
model = MLCA(512)
output = model(x)
print(output.shape)
标签:MLCA,nn,arv,self,Attention,global,2023,local,size
From: https://blog.csdn.net/wei582636312/article/details/144951430