【YOLO改进】主干插入EffectiveSEModule模块(基于MMYOLO)

EffectiveSEModule模块

论文链接: https://arxiv.org/abs/1911.06667

将EffectiveSEModule模块添加到MMYOLO中

  1. 将开源代码EffectiveSE.py文件复制到mmyolo/models/plugins目录下

  2. 导入MMYOLO用于注册模块的包: from mmyolo.registry import MODELS

  3. 确保 class EffectiveSEModule中的输入维度为in_channels(因为MMYOLO会提前传入输入维度参数,所以要保持参数名的一致)

  4. 利用@MODELS.register_module()将“class EffectiveSEModule(nn.Module)”注册:

  5. 修改mmyolo/models/plugins/__init__.py文件

  6. 在终端运行:

    python setup.py install
  7. 安装对应版本的timm
    pip install timm==0.6.13
    
  8. 修改对应的配置文件,并且将plugins的参数“type”设置为“EffectiveSEModule”,可参考【YOLO改进】主干插入注意力机制模块CBAM(基于MMYOLO)-CSDN博客

修改后EffectiveSE.py

import torch
from timm.models.layers.create_act import create_act_layer
from torch import nn as nn
from mmyolo.registry import MODELS

@MODELS.register_module()
class EffectiveSEModule(nn.Module):
    def __init__(self, in_channels, add_maxpool=False, gate_layer='hard_sigmoid'):
        super(EffectiveSEModule, self).__init__()
        self.add_maxpool = add_maxpool
        self.fc = nn.Conv2d(in_channels, in_channels, kernel_size=1, padding=0)
        self.gate = create_act_layer(gate_layer)

    def forward(self, x):
        x_se = x.mean((2, 3), keepdim=True)
        if self.add_maxpool:
            # experimental codepath, may remove or change
            x_se = 0.5 * x_se + 0.5 * x.amax((2, 3), keepdim=True)
        x_se = self.fc(x_se)
        return x * self.gate(x_se)

if __name__ == '__main__':
    input=torch.randn(50,512,7,7)
    Ese = EffectiveSEModule(512)
    output=Ese(input)
    print(output.shape)

修改后的__init__.py

# Copyright (c) OpenMMLab. All rights reserved.
from .cbam import CBAM
from .Biformer import BiLevelRoutingAttention
from .A2Attention import DoubleAttention
from .CoordAttention import CoordAtt
from .CoTAttention import CoTAttention
from .ECA import ECAAttention
from .EffectiveSE import EffectiveSEModule
__all__ = ['CBAM', 'BiLevelRoutingAttention', 'DoubleAttention', 'CoordAtt','CoTAttention','ECAAttention','EffectiveSEModule']

修改后的配置文件(以configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py为例)

_base_ = ['../_base_/default_runtime.py', '../_base_/det_p5_tta.py']

# 
EffectiveSEModule是一种插即用的注意力模块,它是基于SE(Squeeze and Extraction)模块改进而来的。与SE模块相比,EffectiveSEModule只使用一个全连接层,避免了通道信息的损失。 以下是一个使用EffectiveSEModule的示例代码: ```python import torch import torch.nn as nn class EffectiveSEModule(nn.Module): def __init__(self, channels, reduction=16): super(EffectiveSEModule, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channels, channels // reduction, bias=False), nn.ReLU(inplace=True), nn.Linear(channels // reduction, channels, bias=False), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y.expand_as(x) ``` 在上述代码中,EffectiveSEModule类接受两个参数:channels表示输入特征的通道数,reduction表示通道数的缩小比例。在forward方法中,首先使用自适应平均池化层对输入特征进行池化,然后通过全连接层计算通道注意力权重,最后将输入特征与注意力权重相乘得到加权后的特征。 使用EffectiveSEModule时,只需将其作为模型的一部分添加到网络中即可。例如,可以将EffectiveSEModule应用于卷积层的输出特征: ```python import torch import torch.nn as nn class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.conv = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1) self.eff_se = EffectiveSEModule(64) def forward(self, x): x = self.conv(x) x = self.eff_se(x) return x ``` 这样,模型就会在卷积层的输出特征上应用EffectiveSEModule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值