1.LCT介绍
论文: https://arxiv.org/pdf/1909.03834v2.pdf
AAAI 2020
摘要:
在本研究中,我们首先重新审视了SE块,然后基于全局上下文和注意力分布之间的关系进行了详细的实证研究,基于此提出了一个简单而有效的模块,称为线性上下文变换(LCT)块。我们将所有通道分成不同的组,并在每个通道组内对全局聚合的上下文特征进行归一化,减少了来自无关通道的干扰。通过对归一化的上下文特征进行线性变换,我们独立地为每个通道建模全局上下文。LCT块非常轻量级,易于插入不同的主干模型,同时增加的参数和计算负担可以忽略不计。大量实验证明,在ImageNet图像分类任务和COCO数据集上的目标检测/分割任务中,LCT块在不同主干模型上的性能优于SE块。此外,LCT在现有最先进的检测架构上都能带来一致的性能提升,例如在COCO基准测试中,无论基线模型的容量如何,APbbox提升1.5∼1.7%,APmask提升1.0%∼1.2%。我们希望我们的简单而有效的方法能为基于注意力的模型的未来研究提供一些启示。
LCT结构图:
2.LCT引入到yolov5
2.1 加入common.py
中:
代码语言:javascript复制###################### LCT attention #### start by AI&CV ###############################
"""
PyTorch implementation of Linear Context Transform Block
As described in https://arxiv.org/pdf/1909.03834v2
"""
import torch
from torch import nn
class LCT(nn.Module):
def __init__(self, channels, groups, eps=1e-5):
super().__init__()
assert channels % groups == 0, "Number of channels should be evenly divisible by the number of groups"
self.groups = groups
self.channels = channels
self.eps = eps
self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
self.w = nn.Parameter(torch.ones(channels))
self.b = nn.Parameter(torch.zeros(channels))
self.sigmoid = nn.Sigmoid()
def forward(self, x):
batch_size = x.shape[0]
y = self.avgpool(x).view(batch_size, self.groups, -1)
mean = y.mean(dim=-1, keepdim=True)
mean_x2 = (y ** 2).mean(dim=-1, keepdim=True)
var = mean_x2 - mean ** 2
y_norm = (y - mean) / torch.sqrt(var self.eps)
y_norm = y_norm.reshape(batch_size, self.channels, 1, 1)
y_norm = self.w.reshape(1, -1, 1, 1) * y_norm self.b.reshape(1, -1, 1, 1)
y_norm = self.sigmoid(y_norm)
return x * y_norm.expand_as(x)
###################### LCT attention #### END by AI&CV ###############################
by CSDN AI小怪兽 https://blog.csdn.net/m0_63774211/article/details/131550202
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!