一文搞定attntion机制在CNN中的应用,手把手教你在Yolov5中插入attention. Attention结构的创新方法

2023-11-19

*免责声明:
1\此方法仅提供参考
2\搬了其他博主的操作方法,以贴上路径.
3*

场景一:什么是Attention

场景二:Attention在cnn上的作用

场景三:常见的Attention机制

场景四:Attention机制的创新思路

场景五:yolov5中进行Attention结构插入实验

场景一:什么是Attention

更多attention细节—>神经网络与深度学习理论教程二,tensorflow2.0教程,rnn

一文看懂 Attention(本质原理+3大优点+5大类型)

深度学习中的注意力机制

1.1 基础

请添加图片描述
请添加图片描述
请添加图片描述

1.2 本质思想

在这里插入图片描述

1.3 Attention计算过程

请添加图片描述
在这里插入图片描述

请添加图片描述

场景二:Attention在cnn上的作用

1.1 Attention机制的好处

请添加图片描述

1.2 Attention机制的种类

请添加图片描述
请添加图片描述
请添加图片描述

1.3 Attention机制在CNN中的应用

Attention in CNN

请添加图片描述
请添加图片描述

请添加图片描述

场景三:常见的Attention机制

注意力机制Attention论文整理收藏(最全,附代码,持续更新)

CV中的Attention和Self-Attention

1.1 SENet

SENet论文地址

通道上的注意力:SENet论文笔记

大致流程

在这里插入图片描述

详细介绍

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

应用实例

在这里插入图片描述

1.2 ECANet

ECANet论文地址

通道注意力超强改进,轻量模块ECANet来了!即插即用,显著提高CNN性能|已开源

大致流程

请添加图片描述

详细介绍

在这里插入图片描述
请添加图片描述
在这里插入图片描述

import torch
from torch import nn
from torch.nn.parameter import Parameter

class eca_layer(nn.Module):
    """Constructs a ECA module.
    Args:
        channel: Number of channels of the input feature map
        k_size: Adaptive selection of kernel size
    """
    def __init__(self, channel, k_size=3):
        super(eca_layer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        # x: input features with shape [b, c, h, w]
        b, c, h, w = x.size()

        # feature descriptor on the global spatial information
        y = self.avg_pool(x)

        # Two different branches of ECA module
        y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)

        # Multi-scale information fusion
        y = self.sigmoid(y)

        return x * y.expand_as(x)

1.3 CBAM

CBAM论文地址

请添加图片描述

大致流程

请添加图片描述

细节描述

在这里插入图片描述

class ChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=16):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.fc1   = nn.Conv2d(in_planes, in_planes / 16, 1, bias=False)
        self.relu1 = nn.ReLU()
        self.fc2   = nn.Conv2d(in_planes / 16, in_planes, 1, bias=False)
        self.sigmoid = nn.Sigmoid()
    def forward(self, x):
        avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))
        max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))
        out = avg_out + max_out
        return self.sigmoid(out)
        
class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()
        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1
        self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
        self.sigmoid = nn.Sigmoid()
    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv1(x)
        return self.sigmoid(x)

class  CBAM(nn.Module):
    def __init__(self,c2):
        super(CBAM, self).__init__()
        self.channel_attenton =  ChannelAttention(c2)
        self.spatial_attention = SpatialAttention(7)

        
    def forward (self , x):
        out = self.channel_attention(x) * x 
        out = self.spatial_attention(out) * out
        return out

场景四:Attention机制的创新思路

1.1 ECANet结合CBAM创新

请添加图片描述
请添加图片描述

代码描述可以参考场景五的实验四

1.2 SENet结合CBAM创新

在这里插入图片描述

1.3 ECA创新尝试

在这里插入图片描述

1.4 创新寄语

强推一:更多Attention

强推二:网络中的注意力机制-CNN attention

强推三:综述—图像处理中的注意力机制
请添加图片描述

场景五:yolov5中进行Attention结构插入实验

代码看不懂请看–》场景四中的4 模型构建代码 common.py—>网络组件代码

实验列表

#实验一: 类名字:     ECA1        原始类型的ECA :  单路ECA模型
#实验二:类名字:     ECA2        改进的ECA :  多路ECA模型
#实验三: 类名字:     EcA3        改进的ECA :  多路ECA模型+ SpatialAttention+ 普通的conv

#实验四:类名字:     EcA4        改进的ECA :  多路ECA模型+ SpatialAttention+ Conv(自定义的Conv)


#实验五: 类名字:     MishAttention5      单链CBAM的设计  使用了cbm ,激活函数,记得修改Conv里面的为Mish激活函数

#实验六: 类名字 :    SiLUAttention6      单链CBAM的设计  使用了cbs ,激活函数,记得修改Conv里面的为SiLU激活函数


#实验七: 类名字:     SiLUAttention7      双路CBAM的设计  使用了cbs ,激活函数,记得修改Conv里面的为SiLU激活函数

#实验八: 类名字:     MishAttention8      双路CBAM的设计  使用了cbM ,激活函数,记得修改Conv里面的为Mish激活函数


#实验九: 类名字:     SiLUAttention9      混合双路CBAM的设计  使用了cbs ,激活函数,记得修改Conv里面的为SiLU激活函数


#实验十: 类名字:     MishAttention10     混合双路CBAM的设计  使用了cbM ,激活函数,记得修改Conv里面的为Mish激活函数

对应的attention结构
在这里插入图片描述
在这里插入图片描述

需要修改的地方为common.py / yolo.py / 和 yaml文件.

1.1 yaml文件中的修改

例如将我们构建的SiLUAttention7在backbone中插入在C3结构后,插入的方式修改如下。

在这里插入图片描述

1.2 yolo文件中的修改

在这里插入图片描述

如果你在通道注意力机制和空间注意力机制都改进了,那么新改进的模型放在这里的位置.因为SiLUAttention机制是混合域注意力机制,所以插入的位置修改如下:

在这里插入图片描述

如果你只是改进了通道注意力机制,请写在下面。

在这里插入图片描述

1.3 common.py文件中插入


# ..................................................................ECA 类型的attention........
# 实验一:  原始类型的ECA :  单路ECA模型

class ECA1(nn.Module):

    def __init__(self, channel, k_size=3):
        super(ECA1, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        """
          a =np.array( [ [[ 1],[2] ] , [[ 1],[2] ] ,[[ 1],[2] ] ])
          #print(a.shape,a) #结果为 ((3, 2, 1),   array([   [[1],[2]] , [[1],[2]]   ,[[1],[2]]        ])

          #删除最后一维如果是1
          b=a.squeeze(-1)
          #print(b.shape ,b)  #(3,2)     array[ [ 1,2]  , [1,2]  ,[1,2]  ]

          #交换相应的位置,
          c=b.transpose(-1,-2)

           #print(c.shape ,c ) #变为(2,3),   array[ [ 1,1,1]  , [2,2,2] ]

        """

        y = self.avg_pool(x)
        y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)

        y = self.sigmoid(y)

        return x * y.expand_as(x)


# 实验二: 改进的ECA :  多路ECA模型
class ECA2(nn.Module):

    def __init__(self, channel, k_size=3):
        super(ECA2, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        y = self.avg_pool(x)
        y = self.conv(y.squeeze(-1).transpose(-1, -2))
        y = y.transpose(-1, -2).unsqueeze(-1)

        y2 = self.max_pool(x)
        y2 = self.conv(y2.squeeze(-1).transpose(-1, -2))
        y2 = y2.transpose(-1, -2).unsqueeze(-1)

        y3 = self.sigmoid(y + y2)
        return x * y3.expand_as(x)


# 实验三: 改进的ECA :  多路ECA模型+ SpatialAttention+ 普通的conv

class SpatialAttention_ECA3(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention_ECA3, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1

        self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv(x)
        return self.sigmoid(x)


class ECA3(nn.Module):
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
        super(ECA3, self).__init__()

        k_size = 3
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)
        self.sigmoid = nn.Sigmoid()
        self.spatial_attention_ecA3 = SpatialAttention_ECA3(7)

    def forward(self, x):
        b, c, h, w = x.size()

        y = self.avg_pool(x)
        y = self.conv(y.squeeze(-1).transpose(-1, -2))
        y = y.transpose(-1, -2).unsqueeze(-1)

        y2 = self.max_pool(x)
        y2 = self.conv(y2.squeeze(-1).transpose(-1, -2))
        y2 = y2.transpose(-1, -2).unsqueeze(-1)

        y3 = self.sigmoid(y + y2)
        out = x * y3.expand_as(x)

        out = self.spatial_attention_ecA3(out) * out

        return out


# 实验四: 该进的ECA :  多路ECA模型+ SpatialAttention+ Conv(自定义的Conv)

class SpatialAttention_ECA4(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention_ECA4, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1

        # .......................可能出问题
        # self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
        self.Conv1 = Conv(2, 1, kernel_size, p=padding)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.Conv1(x)
        return self.sigmoid(x)


class ECA4(nn.Module):
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
        super(ECA4, self).__init__()

        k_size = 3
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)
        self.sigmoid = nn.Sigmoid()
        self.spatial_attention_ecA4 = SpatialAttention_ECA4(7)

    def forward(self, x):
        b, c, h, w = x.size()

        y = self.avg_pool(x)
        y = self.conv(y.squeeze(-1).transpose(-1, -2))
        y = y.transpose(-1, -2).unsqueeze(-1)

        y2 = self.max_pool(x)
        y2 = self.conv(y2.squeeze(-1).transpose(-1, -2))
        y2 = y2.transpose(-1, -2).unsqueeze(-1)

        y3 = self.sigmoid(y + y2)
        out = x * y3.expand_as(x)

        out = self.spatial_attention_ecA4(out) * out

        return out


# .............................................................
# 实验五 :  weeks的 单链CBAM的设计  使用了cbm ,激活函数,记得修改Conv里面的为Mish激活函数
class SpatialAttention5(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention5, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1

        self.conv = Conv(1, 1, kernel_size, p=padding)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        x = self.conv(avg_out)
        return self.sigmoid(x)


class MishAttention51(nn.Module):
    def __init__(self, in_planes, ratio=16, n=1, shortcut=True, g=1, e=0.5):
        super(MishAttention51, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)

        self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        self.mish = Mish()
        self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.f2(self.mish(self.f1(self.avg_pool(x))))
        out = self.sigmoid(avg_out)

        return out


class MishAttention5(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super(MishAttention5, self).__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)
        self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])
        self.channel_attention = MishAttention51(c2, 16)
        self.spatial_attention = SpatialAttention5(7)

        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

    def forward(self, x):
        out = self.channel_attention(x) * x

        # print('outchannels:{}'.format(out.shape))
        out = self.spatial_attention(out) * out
        return out


# .............................................................
# 实验六 :  hjf的 单链CBAM的设计  使用了cbs ,激活函数,记得修改Conv里面的为SiLU激活函数
class SpatialAttention6(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention6, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1

        self.conv = Conv(1, 1, kernel_size, p=padding)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = torch.mean(x, dim=1, keepdim=True)
        x = self.conv(x)
        return self.sigmoid(x)


class SiLUAttention61(nn.Module):
    def __init__(self, in_planes, ratio=16, n=1, shortcut=True, g=1, e=0.5):
        super(SiLUAttention61, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)

        self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        self.silu = nn.SiLU()
        self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.f2(self.silu(self.f1(self.avg_pool(x))))
        out = self.sigmoid(avg_out)

        return out


class SiLUAttention6(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super(SiLUAttention6, self).__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)
        self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])
        self.channel_attention = SiLUAttention61(c2, 16)
        self.spatial_attention = SpatialAttention6(7)

        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

    def forward(self, x):
        out = self.channel_attention(x) * x

        # print('outchannels:{}'.format(out.shape))
        out = self.spatial_attention(out) * out
        return out


# .............................................................
# 实验七 :  hjf的 双路CBAM的设计  使用了cbs ,激活函数,记得修改Conv里面的为SiLU激活函数
class SpatialAttention7(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention7, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1

        self.conv = Conv(2, 1, kernel_size, p=padding)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv(x)
        return self.sigmoid(x)


class SiLUAttention71(nn.Module):
    def __init__(self, in_planes, ratio=16, n=1, shortcut=True, g=1, e=0.5):
        super(SiLUAttention71, self).__init__()

        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        self.silu = nn.SiLU()
        self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        b, c, h, w = x.size()
        avg_out = self.f2(self.silu(self.f1(self.avg_pool(x))))
        max_out = self.f2(self.silu(self.f1(self.max_pool(x))))
        out = self.sigmoid(avg_out + max_out)

        return out


class SiLUAttention7(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super(SiLUAttention7, self).__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)
        self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])
        self.channel_attention = SiLUAttention71(c2, 16)
        self.spatial_attention = SpatialAttention7(7)

        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

    def forward(self, x):
        out = self.channel_attention(x) * x
        # print('outchannels:{}'.format(out.shape))
        out = self.spatial_attention(out) * out
        return out


# .............................................................
# 实验八 :  weeks的 双路CBAM的设计  使用了cbM ,激活函数,记得修改Conv里面的为Mish激活函数

class SpatialAttention8(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention8, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1

        self.conv = Conv(2, 1, kernel_size, p=padding)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv(x)
        return self.sigmoid(x)


class MishAttention81(nn.Module):
    def __init__(self, in_planes, ratio=16, n=1, shortcut=True, g=1, e=0.5):
        super(MishAttention81, self).__init__()

        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        self.mish = Mish()
        self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.f2(self.mish(self.f1(self.avg_pool(x))))
        max_out = self.f2(self.mish(self.f1(self.max_pool(x))))
        out = self.sigmoid(avg_out + max_out)

        return out


class MishAttention8(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super(MishAttention8, self).__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)
        self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])
        self.channel_attention = MishAttention81(c2, 16)
        self.spatial_attention = SpatialAttention8(7)

        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

    def forward(self, x):
        out = self.channel_attention(x) * x
        # print('outchannels:{}'.format(out.shape))
        out = self.spatial_attention(out) * out
        return out


# .............................................................
# 实验九 :  hjf的 混合双路CBAM的设计  使用了cbs ,激活函数,记得修改Conv里面的为SiLU激活函数
class SpatialAttention9(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention9, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1

        self.conv = Conv(2, 1, kernel_size, p=padding)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv(x)
        return self.sigmoid(x)


class SiLUAttention91(nn.Module):
    def __init__(self, in_planes, ratio=16, n=1, shortcut=True, g=1, e=0.5):
        super(SiLUAttention91, self).__init__()

        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        self.silu = nn.SiLU()
        self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()

        self.l1 = nn.Linear(in_planes, in_planes // ratio, bias=False)
        self.l2 = nn.Linear(in_planes // ratio, in_planes, bias=False)

    def forward(self, x):
        max_out = self.f2(self.silu(self.f1(self.max_pool(x))))

        b, c, _, _ = x.size()
        y1 = self.avg_pool(x).view(b, c)
        y1 = self.l1(y1)
        y1 = self.silu(y1)
        y1 = self.l2(y1)
        y1 = self.sigmoid(y1)
        y1 = y1.view(b, c, 1, 1)
        out = self.sigmoid(max_out) + y1.expand_as(x)
        return out


class SiLUAttention9(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super(SiLUAttention9, self).__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)
        self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])
        self.channel_attention = SiLUAttention91(c2, 16)
        self.spatial_attention = SpatialAttention9(7)

        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

    def forward(self, x):
        out = self.channel_attention(x) * x
        # print('outchannels:{}'.format(out.shape))
        out = self.spatial_attention(out) * out
        return out


# .............................................................
# 实验十 :  weeks的 混合双路CBAM的设计  使用了cbM ,激活函数,记得修改Conv里面的为Mish激活函数
class SpatialAttention10(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention10, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1

        self.conv = Conv(2, 1, kernel_size, p=padding)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv(x)
        return self.sigmoid(x)


class MishAttention101(nn.Module):
    def __init__(self, in_planes, ratio=16):
        super(MishAttention101, self).__init__()

        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        self.mish = Mish()
        self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()
        self.l1 = nn.Linear(in_planes, in_planes // ratio, bias=False)
        self.l2 = nn.Linear(in_planes // ratio, in_planes, bias=False)

    def forward(self, x):
        max_out = self.f2(self.mish(self.f1(self.max_pool(x))))

        b, c, _, _ = x.size()
        y1 = self.avg_pool(x).view(b, c)
        y1 = self.l1(y1)
        y1 = self.mish(y1)
        y1 = self.l2(y1)
        y1 = self.sigmoid(y1)
        y1 = y1.view(b, c, 1, 1)
        out = self.sigmoid(max_out) + y1.expand_as(x)

        return out


class MishAttention10(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super(MishAttention10, self).__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)
        self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])
        self.channel_attention = MishAttention101(c2, 16)
        self.spatial_attention = SpatialAttention10(7)

        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

    def forward(self, x):
        out = self.channel_attention(x).expand_as(x) * x
        # print('outchannels:{}'.format(out.shape))
        out = self.spatial_attention(out) * out
        return out

...

you did it

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文搞定attntion机制在CNN中的应用,手把手教你在Yolov5中插入attention. Attention结构的创新方法 的相关文章

  • 10个有用的Siebel标准功能

    作为第一篇blog 不想罗列一些Siebel的市场信息或者功能介绍等Overview 以下Siebel非常有用的10个小的tip 1 自定义数据显示格式 用户可以根据自己需要隐藏界面上的某些列 也可以通过拖放的方式控制列显示的顺序 2 自动
  • docker && Tugraph

    拉取tugraph镜像 docker pull tugraph tugraph db centos7 启动docker docker run d p 7070 7070 p 9090 9090 name tugraph demo tugra

随机推荐

  • Oracle Sequence Cache 参数说明

    之前整理的一篇文章 ORACLE SEQUENCE 介绍 http blog csdn net tianlesoftware archive 2009 10 30 4745039 aspx 之前整理的一篇文章 那是还是写blog初期的作品
  • nacos 的 cp 和 ap

    如果只有一个 nacos 节点 可以直接以单机模式启动 naming 功能是完全正常的 也可以以集群模式启动 配置文件中只配一个节点即可 但是 因为此时 nacos 的 raft 实现中 一个节点是选不了主的 所以 cp 模式的 raft
  • matlab绘制贝叶斯曲线,Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线

    原文链接 http tecdat cn p 15508 绘制ROC曲线通过Logistic回归进行分类 加载样本数据 load fisheriris通过使用与versicolor和virginica物种相对应的度量来定义二元分类问题 pre
  • java 布尔类型_Java布尔类型

    Java布尔类型 在Java语言中布尔类型的值只包括true和false 没有其他值 不包括1和0 布尔类型的数据在开发中主要使用在逻辑判断方面 例如 如果外面在下雨 我出门带一把雨伞 如果明天休息 咱们就一起出去玩耍吧 请看一段程序 以下
  • 文件包含漏洞及绕过方法(以php为例)

    一 文件包含漏洞的由来 简单的来说 为了减少 重复造轮子 引入了文件包含函数 可以直接使用文件中的文件和代码 当通过动态获文件时 或者需要引用网络上其他文件时 用户通过对变量值的修改访问规定的文件 但是未对变量值进行校验 导致有了可乘之机
  • 前端vue面试

    用户登陆产品了解生命周期vuex数据平台干嘛vue X怎么持久localstore和cokIE区别路由传惨路由传惨两种方式区别 1 谈一谈你对keep alive的了解P1 2 三 v if v show的区别 3 四 v if和v for
  • 服务器柜机位置摆放电子图,客厅柜机摆放—客厅柜机空调摆放方法介绍

    客厅是一家人在一起活动最多的房间 所以家具及家电等产品的摆放就要有一定的讲究了 其中柜机空调的摆放方法尤其为消费者所关注 下面 小编就详细的向您介绍一下客厅柜机摆放的方法 有兴趣的朋友一起来了解一下吧 客厅柜机摆放 客厅柜机摆放 正确摆放位
  • VectorCAST软件下载安装使用试用培训购买

    商业软件如需下载安装使用试用 可以通过下面添加 提供编译器定制 技术支持 培训 wanglequshuijiao 有需要可以加详细聊 vx 静态测试软件 QAC Klocwork Coverity等 单元测试软件 集成测试软件 Vector
  • 超详细!Jmeter性能测试(二)

    Jmeter 性能测试 二 关联 正则表达式提取器和JSON Extractor提取器 接入上篇博文继续 上篇地址 https blog csdn net weixin 44954642 article details 103054387
  • MySQL几种创建索引的方式

    一 创建表时创建索引 key 索引名 column 二 表创建好后创建索引 1 通过Alter创建索引 PRIMARY KEY 主键索引 mysql gt ALTER TABLE table name ADD PRIMARY KEY col
  • 设计模式七大原则

    1 设计模式的目的 编写软件过程中 程序员面临着来自耦合性 内聚性以及可维护性 可扩展性 重用性 灵活性 等多方面的挑战 设计模式是为了让程序 软件 具有更好 1 代码重用性 即 相同功能的代码 不用多次编写 2 可读性 即 编程规范性 便
  • npm插件安装插件失败问题解决办法

    目录 问题索引列表 错误记录 在线地址pdf转word https www camscanner com pdftopic 问题索引列表 1 配置安装自定义位置nodejs 1 1 使用npm安装模块的位置有默认安装位置和指定安装位置 在W
  • Java自学第15天 面向对象(全)

    面向过程 面向对象 面向过程思想 步骤清晰简单 第一步做什么 第二步做什么 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚 分类的思维模式 思考问题首先会解决问题需要哪些分类 然后对这些分类进行单独思考 最后 才对某个分类下的细
  • javaSE进阶1之static用法

    JavaSE进阶 静态关键字 static static关键字的作用 成员变量分类 静态成员变量 实例成员变量 static修饰成员变量内存原理 static 修饰成员方法的基本用法 成员方法的分类 static修饰成员方法内存原理 sta
  • [原]Pro*C介绍-内嵌SQL

    Translate by Z Jingwei Document address http www db stanford edu ullman fcdb oracle or proc html Pro C介绍内嵌SQL 概要 Pro C语法
  • selenium自动化测试实战

    一 Selenium介绍 Selenium 是什么 一句话 自动化测试工具 它支持各种浏览器 包括 Chrome Safari Firefox 等主流界面式浏览器 如果你在这些浏览器里面安装一个 Selenium 的插件 那么便可以方便地实
  • Java开发中关于实体类的一些注解

    JSONField注解 FastJson中的注解 JSONField 一般作用在get set方法 常用的有以下三个场景 修改字段映射 private String name 实体类序列化为json字符串的时候 该类的name字段 序列化为
  • Integer 和 int

    一 区别 1 Integer是int的包装类 int则是java的一种基本的数据类型 2 Integer变量必须实例化之后才能使用 而int变量不需要实例化 3 Integer实际是对象的引用 当new一个Integer时 实际上生成一个指
  • Hadoop的安装与调试(2)

    本节内容包括 虚拟机的克隆 虚拟机配置 虚拟机IP配置 windows网络配置 虚拟机重命名 固定IP映射 设置mac地址 配置静态IP 测试 进入虚拟机 先登录用户 接下来用以下命令创建三个文件夹 四 虚拟机的克隆 1 先关闭虚拟机 2
  • 一文搞定attntion机制在CNN中的应用,手把手教你在Yolov5中插入attention. Attention结构的创新方法

    免责声明 1 此方法仅提供参考 2 搬了其他博主的操作方法 以贴上路径 3 场景一 什么是Attention 场景二 Attention在cnn上的作用 场景三 常见的Attention机制 场景四 Attention机制的创新思路 场景五