首页 > 其他分享 >YOLOv8改进 - 注意力篇 - 引入CoordAtt注意力机制

YOLOv8改进 - 注意力篇 - 引入CoordAtt注意力机制

时间:2024-10-19 10:49:21浏览次数:11  
标签:CoordAtt __ nn self YOLOv8 C2f 注意力

#YOLO# #目标检测# #计算机视觉#

一、本文介绍

作为入门性篇章,这里介绍了CoordAtt注意力在YOLOv8中的使用。包含CoordAtt原理分析,CoordAtt的代码、CoordAtt的使用方法、以及添加以后的yaml文件及运行记录。

二、CoordAtt原理分析

CoordAtt官方论文地址:文章

CoordAtt官方代码地址:代码

CoordAtt注意力机制:在本文中,我们提出了一种新的移动网络注意机制,将位置信息嵌入到通道注意中,我们称之为“坐标注意”。与通过二维全局池化将特征张量转换为单个特征向量的通道注意不同,坐标注意将通道注意分解为两个一维特征编码过程,分别沿着两个空间方向聚合特征。这样可以在一个空间方向上捕获远程依赖关系,同时在另一个空间方向上保持精确的位置信息。然后将得到的特征图分别编码为一对方向感知和位置敏感的注意图,它们可以互补地应用于输入特征图,以增强感兴趣对象的表示。

三、相关代码:

CoordAtt注意力的代码,如下。

class CoordAtt(nn.Module):
    def __init__(self, inp, reduction=32):
        super(CoordAtt, self).__init__()
        oup = inp
        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

四、YOLOv8中CoordAtt使用方法

1.YOLOv8中添加CoordAtt模块:

首先在ultralytics/nn/modules/conv.py最后添加CoordAtt模块的代码。

2.在conv.py的开头__all__ = 内添加CoordAtt模块的类别名:

3.在同级文件夹下的__init__.py内添加CoordAtt的相关内容:(分别是from .conv import CoordAtt ;以及在__all__内添加CoordAtt)

4.在ultralytics/nn/tasks.py进行CoordAtt注意力机制的注册,以及在YOLOv8的yaml配置文件中添加CoordAtt即可。

首先打开task.py文件,按住Ctrl+F,输入parse_model进行搜索。找到parse_model函数。在其最后一个else前面添加以下注册代码:

        elif m in {CBAM,ECA,ShuffleAttention,CoordAtt}:#添加注意力模块,没有CBAM、eca的,M删除即可
            c1, c2 = ch[f], args[0]
            if c2 != nc:
                c2 = make_divisible(min(c2, max_channels) * width, 8)
            args = [c1, *args[1:]]

然后,就是新建一个名为YOLOv8_CoordAtt.yaml的配置文件:(路径:ultralytics/cfg/models/v8/YOLOv8_CoordAtt.yaml)

# Ultralytics YOLO 

标签:CoordAtt,__,nn,self,YOLOv8,C2f,注意力
From: https://blog.csdn.net/2301_79619145/article/details/143023081

相关文章