MMDetection中对Resnet增加注意力机制Attention的简单方法

这篇具有很好参考价值的文章主要介绍了MMDetection中对Resnet增加注意力机制Attention的简单方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码

import torch
from mmdet.models.backbones import ResNet
from fightingcv_attention.attention.CoordAttention import CoordAtt
from fightingcv_attention.attention.SEAttention import SEAttention
from mmdet.models.builder import BACKBONES
 
 
# 定义带attention的resnet18基类
class ResNetWithAttention(ResNet):
    def __init__(self , **kwargs):
        super(ResNetWithAttention, self).__init__(**kwargs)
        # 目前将注意力模块加在最后的三个输出特征层
        # resnet输出四个特征层
        if self.depth in (18, 34):
            self.dims = (64, 128, 256, 512)
        elif self.depth in (50, 101, 152):
            self.dims = (256, 512, 1024, 2048)
        else:
            raise Exception()
        self.attention1 = self.get_attention_module(self.dims[1])     
        self.attention2 = self.get_attention_module(self.dims[2])     
        self.attention3 = self.get_attention_module(self.dims[3])     
    
    # 子类只需要实现该attention即可
    def get_attention_module(self, dim):
        raise NotImplementedError()
    
    def forward(self, x):
        outs = super().forward(x)
        outs = list(outs)
        outs[1] = self.attention1(outs[1])
        outs[2] = self.attention2(outs[2])
        outs[3] = self.attention3(outs[3])    
        outs = tuple(outs)
        return outs
    
@BACKBONES.register_module()
class ResNetWithCoordAttention(ResNetWithAttention):
    def __init__(self , **kwargs):
        super(ResNetWithCoordAttention, self).__init__(**kwargs)
 
    # 子类只需要实现该attention即可
    def get_attention_module(self, dim):
        return CoordAtt(inp=dim, oup=dim, reduction=32)
    
@BACKBONES.register_module()
class ResNetWithSEAttention(ResNetWithAttention):
    def __init__(self , **kwargs):
        super(ResNetWithSEAttention, self).__init__(**kwargs)
 
    # 子类只需要实现该attention即可
    def get_attention_module(self, dim):
        return SEAttention(channel=dim, reduction=16)
 
 
if __name__ == "__main__":
    # model = ResNet(depth=18)
    # model = ResNet(depth=34)
    # model = ResNet(depth=50)
    # model = ResNet(depth=101)    
    # model = ResNet(depth=152)
    # model = ResNetWithCoordAttention(depth=18)
    model = ResNetWithSEAttention(depth=18)
    x = torch.rand(1, 3, 224, 224)
    outs = model(x)
    # print(outs.shape)
    for i, out in enumerate(outs):
        print(i, out.shape)

以resnet为例子,我在多个尺度的特征层输出增加注意力机制,以此编写一个基类,子类只需要实现这个attention即可。

参考开源仓库实现attention:

GitHub - xmu-xiaoma666/External-Attention-pytorch: 🍀 Pytorch implementation of various Attention Mechanisms, MLP, Re-parameter, Convolution, which is helpful to further understand papers.⭐⭐⭐

当然也可以直接pip调用:

pip install fightingcv-attention

测试完模型输出后可以利用注册到mmdetection:

简单的方法是,添加backbone注册修饰器,并在train.py和test.py中,import 该文件。

在配置上将model的type从Resnet更改为ResNetWithSEAttention或者ResNetWithSEAttention即可。

注意

(1)这是基于mmdet 2.x版本的改动。

(2)需要注意增加网络的输入输出形状,可能还需要考虑不同宽高输入时网络输出是否与设计一致。

(3)注意力放各尺寸末端是因为想尽可能使用预训练权重(提高预训练权重利用率),如果是重新训练的话,放哪里效果最佳我无法确定。

(4)增加注意力机制不一定有效涨点,只能是尝试一下。注意力机制解决的问题如果与数据对应,可以尝试一下。譬如需要增加空间长距离特征提取能力可以用空间注意力,或者简单的使用通道注意力都行。如果你的数据量少或者任务较简单,尽量不要用参数较多的模型。文章来源地址https://www.toymoban.com/news/detail-557666.html

到了这里,关于MMDetection中对Resnet增加注意力机制Attention的简单方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 注意力机制详解系列(一):注意力机制概述

    👨‍💻 作者简介: 大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享。 公众号: GoAI的学习小屋,免费分享书籍、简历、导图等资料,更有交流群分享AI和大数据,加群方式公众号回复“加群”或➡️点击链接。 🎉 专栏推

    2024年01月25日
    浏览(46)
  • 注意力机制详解系列(三):空间注意力机制

    👨‍💻 作者简介: 大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享。 🎉 专栏推荐: 目前在写CV方向专栏,更新不限于目标检测、OCR、图像分类、图像分割等方向,目前活动仅19.9,虽然付费但会长期更新,感兴趣的小伙

    2024年02月02日
    浏览(45)
  • 什么是注意力机制?注意力机制的计算规则

    我们观察事物时,之所以能够快速判断一种事物(当然允许判断是错误的),是因为我们大脑能够很快把注意力放在事物最具有辨识度的部分从而作出判断,而并非是从头到尾的观察一遍事物后,才能有判断结果,正是基于这样的理论,就产生了注意力机制。 它需要三个指定的

    2024年02月14日
    浏览(45)
  • 注意力机制(四):多头注意力

    专栏:神经网络复现目录 注意力机制(Attention Mechanism)是一种人工智能技术,它可以让神经网络在处理序列数据时,专注于关键信息的部分,同时忽略不重要的部分。在自然语言处理、计算机视觉、语音识别等领域,注意力机制已经得到了广泛的应用。 注意力机制的主要思

    2024年02月06日
    浏览(50)
  • 大白话分析注意力机制和空间和通道注意力机制

    深度学习小白,个人理解,有错误请友友们纠正QAQ 官方解释:注意力机制(Attention Mechanism)源于对人类视觉的研究。在认知科学中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他可见的信息。上述机制通常被称为注意力机制。 假设你正在准备

    2024年04月17日
    浏览(46)
  • 【深度学习注意力机制系列】—— ECANet注意力机制(附pytorch实现)

    ECANet(Efficient Channel Attention Network) 是一种 用于图像处理任务的神经网络架构,它在保持高效性的同时,有效地捕捉图像中的通道间关系,从而提升了特征表示的能力 。ECANet通过引入通道注意力机制,以及在卷积层中嵌入该机制,取得了优越的性能。本文将对ECANet的核心思

    2024年02月13日
    浏览(50)
  • 【深度学习注意力机制系列】—— SENet注意力机制(附pytorch实现)

    深度学习中的注意力机制(Attention Mechanism)是一种模仿人类视觉和认知系统的方法,它允许神经网络在处理输入数据时集中注意力于相关的部分。通过引入注意力机制,神经网络能够自动地学习并选择性地关注输入中的重要信息,提高模型的性能和泛化能力。 卷积神经网络

    2024年02月14日
    浏览(40)
  • 【深度学习注意力机制系列】—— SCSE注意力机制(附pytorch实现)

    SCSE注意力模块 (来自论文[1803.02579] Concurrent Spatial and Channel Squeeze Excitation in Fully Convolutional Networks (arxiv.org))。其对SE注意力模块进行了改进,提出了 cSE、sSE、scSE 三个模块变体,这些模块可以 增强有意义的特征,抑制无用特征 。今天我们就分别讲解一下这三个注意力模块。

    2024年02月13日
    浏览(56)
  • 【深度学习注意力机制系列】—— CBAM注意力机制(附pytorch实现)

    CBAM(Convolutional Block Attention Module) 是一种用于增强卷积神经网络(CNN)性能的注意力机制模块。它由Sanghyun Woo等人在2018年的论文[1807.06521] CBAM: Convolutional Block Attention Module (arxiv.org)中提出。CBAM的主要目标是 通过在CNN中引入通道注意力和空间注意力 来提高模型的感知能力,从

    2024年02月13日
    浏览(40)
  • 【深度学习注意力机制系列】—— SKNet注意力机制(附pytorch实现)

    SKNet(Selective Kernel Network) 是一种用于图像分类和目标检测任务的深度神经网络架构,其核心创新是 引入了选择性的多尺度卷积核(Selective Kernel)以及一种新颖的注意力机制 ,从而在不增加网络复杂性的情况下提升了特征提取的能力。SKNet的设计旨在 解决多尺度信息融合的

    2024年02月13日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包