YOLO目标检测创新改进与实战案例专栏
专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
专栏链接: YOLO基础解析+创新改进+实战案例
摘要
摘要
近期的移动网络设计研究显示,通道注意力(例如,压缩-激励注意力)在提升模型性能方面具有显著效果,但它们通常忽略了位置信息,而这对于生成空间选择性的注意力图是非常重要的。在本文中,我们通过将位置信息嵌入到通道注意力中,提出了一种用于移动网络的新型注意力机制,我们称之为“坐标注意力”。与通过2D全局池化将特征张量转换为单个特征向量的通道注意力不同,坐标注意力将通道注意力分解为沿两个空间方向分别聚合特征的两个1D特征编码过程。通过这种方式,可以沿一个空间方向捕获长距离依赖,同时沿另一个空间方向保留精确的位置信息。然后,所得到的特征图被分别编码为一对方向感知和位置敏感的注意力图,这两种图可以互补地应用于输入特征图,以增强感兴趣对象的表示。我们的坐标注意力简单且可以灵活地嵌入到经典的移动网络中,如MobileNetV2、MobileNeXt和EfficientNet,几乎不增加计算开销。广泛的实验表明,我们的坐标注意力不仅对ImageNet分类有益,更有趣的是,在下游任务中,如目标检测和语义分割,表现得更好。
创新点
- 将位置信息嵌入到通道注意力中,提升了移动网络设计的性能。
- 通过两个1D特征编码过程聚合沿着两个空间方向的特征,捕获长距离依赖性,并保留精确的位置信息。
- 生成方向感知和位置敏感的注意力图,可以应用于输入特征图,增强感兴趣对象的表示。
- 简单易用,几乎不增加计算开销,并且可以灵活地插入经典的移动网络结构。
- 在ImageNet分类以及目标检测和语义分割等下游任务中表现出更好的性能。
yolov8 引入
class CoordAtt(nn.Module):
def __init__(self, inp, oup, reduction=32):
super(CoordAtt, self).__init__()
self.pool_h = nn.AdaptiveAvgPool2d((None, 1))
self.pool_w = nn.AdaptiveAvgPool2d((1, None))
mip = max(8, inp // reduction)
self.conv1 = nn.Conv2d(inp, mip, kernel_size=1, stride=1, padding=0)
self.bn1 = nn.BatchNorm2d(mip)
self.act = h_swish()
self.conv_h = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)
self.conv_w = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)
def forward(self, x):
identity = x
n,c,h,w = x.size()
x_h = self.pool_h(x)
x_w = self.pool_w(x).permute(0, 1, 3, 2)
y = torch.cat([x_h, x_w], dim=2)
y = self.conv1(y)
y = self.bn1(y)
y = self.act(y)
x_h, x_w = torch.split(y, [h, w], dim=2)
x_w = x_w.permute(0, 1, 3, 2)
a_h = self.conv_h(x_h).sigmoid()
a_w = self.conv_w(x_w).sigmoid()
out = identity * a_w * a_h
return out
task与yaml配置
详见:https://blog.csdn.net/shangyanaf/article/details/136824282