机器人抓取系列——CBAM注意力机制

因为本项目对点云分割网络进行了一些改进,引入了注意力机制,因此今天将注意力机制模块进行一个简单的介绍

[En]

Because this project has made some improvements to the point cloud segmentation network and introduced the attention mechanism, today we will give a brief introduction to the attention mechanism module.

注意力机制

在计算机视觉中能够能够把注意力聚集在图像重要区域而丢弃掉不相关的方法被称作是注意力机制(Attention Mechanisms)。在人类视觉大脑皮层中,使用注意力机制能够更快捷和高效地分析复杂场景信息。这种机制后来被研究人员引入到计算机视觉中来提高性能。

注意力机制可以看作是对图像输入重要信息的动态选择过程,这个过程是由对于特征自适应权重实现的。注意力机制极大提升了很多计算机视觉任务性能水平,比如在分类,目标检测,语义分割,人脸识别,动作识别,小样本检测,医疗影像处理,图像生成,姿态估计,超分辨率,3D视觉以及多模态中等任务中发挥着重要作用。

一般来说,注意力机制通常分为:
通道注意力 Channel Attention,告诉网络 : what to pay attention to

空间注意力机制 Spatial Attention,告诉网络 where to pay attention to

时间注意力机制 Temporal Attention,告诉网络 when to pay attention to

分支注意力机制 Branch Attention,告诉网络 which to pay attention to

最后还有两种混合注意力机制:

通道&空间注意力机制 和 空间&时间注意力机制。

机器人抓取系列——CBAM注意力机制机器人抓取系列——CBAM注意力机制上图是不同注意力机制的作用域。

; 注意力机制优点

注意力机制的显著优点就是关注相关的信息而忽略不 相关的信息,不通过循环而直接建立输入与输出之间的 依赖关系,并行化程度增强,运行速度有了很大提高

CBAM注意力机制

CBAM(Convolutional Block Attention Module) 是一种用于前馈卷积神经网络的简单而有效的注意力模块。它是一种结合了通道(channel)和空间(spatial)的注意力机制模块。相比于SE-Net只关注通道注意力机制可以取得更好的结果。

CBAM网络结构

机器人抓取系列——CBAM注意力机制机器人抓取系列——CBAM注意力机制CBAM的结构如上,可以看到,卷积层输出的结果,会先通过一个通道注意力机制,得到加权结果之后,会再经过一个空间注意力模块,最终进行加权得到结果。

通道注意力模块(SAM)如上图所示.将输入的特征图,分别经过基于width和height的global max pooling和global average pooling,然后分别经过MLP。将MLP输出的特征进行基于element-wise(element-wise 是神经网络编程中非常常见的张量操作,他在 相应张量内的对应的元素进行操作。)的加和操作,再经过sigmoid激活操作,生成最终的channel attention feature map。将该channel attention feature map和input feature map做element-wise乘法操作,生成Spatial attention模块需要的输入特征。

换一个角度考虑,通道注意力机制(Channel Attention Module)是将特征图在空间维度上进行压缩,得到一个一维矢量后再进行操作。在空间维度上进行压缩时,不仅考虑到了平均值池化(Average Pooling)还考虑了最大值池化(Max Pooling)。平均池化和最大池化可用来聚合特征映射的空间信息,送到一个共享网络,压缩输入特征图的空间维数,逐元素求和合并,以产生通道注意力图。单就一张图来说,通道注意力,关注的是这张图上哪些内容是有重要作用的。平均值池化对特征图上的每一个像素点都有反馈,而最大值池化在进行梯度反向传播计算时,只有特征图中响应最大的地方有梯度的反馈。通道注意力机制可以表达为:

机器人抓取系列——CBAM注意力机制
空间注意力模块(spatial attention module)也如上图所示。将Channel attention模块输出的特征图作为本模块的输入特征图。首先做一个基于channel的global max pooling 和global average pooling,然后将这2个结果基于channel 做concat操作。然后经过一个卷积操作,降维为1个channel。再经过sigmoid生成spatial attention feature。最后将该feature和该模块的输入feature做乘法,得到最终生成的特征。

同样,空间注意力机制(Spatial Attention Module)是对通道进行压缩,在通道维度分别进行了平均值池化和最大值池化。MaxPool的操作就是在通道上提取最大值,提取的次数是高乘以宽;AvgPool的操作就是在通道上提取平均值,提取的次数也是是高乘以宽;接着将前面所提取到的特征图(通道数都为1)合并得到一个2通道的特征图。

机器人抓取系列——CBAM注意力机制
对于输入的特征图,CBAM模块会沿着两个独立的维度(通道和空间)依次推断注意力图,然后将将注意力图与输入的特征图相乘以进行自适应特征优化。
优势:
由于CBAM是轻量级的通用模块,因此可以忽略该模块的开销,且无缝集成到任何CNN架构中,并可以与基础CNN一起进行端到段的训练。

; 代码实现

"""
Author: yida
Time is: 2021/11/21 11:40
this Code: 实现CBAM模块
"""
import os

import torch
import torch.nn as nn

os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"

class CBAM(nn.Module):
    def __init__(self, in_channel):
        super(CBAM, self).__init__()
        self.Cam = ChannelAttentionModul(in_channel=in_channel)
        self.Sam = SpatialAttentionModul(in_channel=in_channel)

    def forward(self, x):
        x = self.Cam(x)
        x = self.Sam(x)
        return x

class ChannelAttentionModul(nn.Module):
    def __init__(self, in_channel, r=0.5):
        super(ChannelAttentionModul, self).__init__()

        self.MaxPool = nn.AdaptiveMaxPool2d(1)

        self.fc_MaxPool = nn.Sequential(
            nn.Linear(in_channel, int(in_channel * r)),
            nn.ReLU(),
            nn.Linear(int(in_channel * r), in_channel),
            nn.Sigmoid(),
        )

        self.AvgPool = nn.AdaptiveAvgPool2d(1)

        self.fc_AvgPool = nn.Sequential(
            nn.Linear(in_channel, int(in_channel * r)),
            nn.ReLU(),
            nn.Linear(int(in_channel * r), in_channel),
            nn.Sigmoid(),
        )

        self.sigmoid = nn.Sigmoid()

    def forward(self, x):

        max_branch = self.MaxPool(x)

        max_in = max_branch.view(max_branch.size(0), -1)
        max_weight = self.fc_MaxPool(max_in)

        avg_branch = self.AvgPool(x)

        avg_in = avg_branch.view(avg_branch.size(0), -1)
        avg_weight = self.fc_AvgPool(avg_in)

        weight = max_weight + avg_weight
        weight = self.sigmoid(weight)

        h, w = weight.shape

        Mc = torch.reshape(weight, (h, w, 1, 1))

        x = Mc * x

        return x

class SpatialAttentionModul(nn.Module):
    def __init__(self, in_channel):
        super(SpatialAttentionModul, self).__init__()
        self.conv = nn.Conv2d(2, 1, 7, padding=3)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):

        MaxPool = torch.max(x, dim=1).values
        AvgPool = torch.mean(x, dim=1)

        MaxPool = torch.unsqueeze(MaxPool, dim=1)
        AvgPool = torch.unsqueeze(AvgPool, dim=1)

        x_cat = torch.cat((MaxPool, AvgPool), dim=1)

        x_out = self.conv(x_cat)
        Ms = self.sigmoid(x_out)

        x = Ms * x

        return x

if __name__ == '__main__':
    inputs = torch.randn(10, 100, 224, 224)
    model = CBAM(in_channel=100)
    print(model)
    outputs = model(inputs)
    print("输入维度:", inputs.shape)
    print("输出维度:", outputs.shape)

Original: https://blog.csdn.net/toCVer/article/details/125281213
Author: 3D_vision
Title: 机器人抓取系列——CBAM注意力机制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/69005/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • F. 知识图谱 知识计算

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

    人工智能 2022年10月1日
    0121
  • 人工智能AI-模型训练思路

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

    人工智能 2022年12月10日
    069
  • 人脸识别技术中如何实现场景自适应

    你好,这篇文章咱们讨论一下关于「人脸识别技术中如何实现场景自适应」的事情… 人脸识别技术中的场景自适应 在过去的几年中,人脸识别技术的发展非常迅速。这项技术已经应用到了…

    人工智能 2023年3月16日
    06
  • 10个有趣的Python高级脚本,建议收藏!

    大家好,我是小F。 在日常的工作中,我们总会面临到各式各样的问题。 其中不少的问题,使用一些简单的Python代码就能解决。 比如不久前的复旦大佬,用130行Python代码硬核搞…

    人工智能 2022年12月9日
    039
  • 如何使用CNN模型进行文本重构

    你好,这篇文章咱们讨论一下关于「如何使用CNN模型进行文本重构」的事情… 使用CNN模型进行文本重构 在自然语言处理领域中,文本重构是一个重要的任务,其目的是通过对原有…

    人工智能 2023年3月21日
    06
  • 基于ShuffleNetv2-YOLOv4模型的目标检测

    目录 1、引言(摘要) 1.1 说明 1.2替换完成的工程请参考gitee 2、网络结构基础 2.1YOLOv3 2.1 YOLOv4算法 2.3 ShuffleNetv2 2.4…

    人工智能 2022年12月5日
    042
  • tensor学习 1 -tensor格式

    1、tf.constant 创建一个常量 2、tf.range 创建一个序列 tf.rang(开始,结束,步长)开始 Original: https://blog.csdn.net…

    人工智能 2022年9月9日
    0138
  • 科大讯飞和百得思维_科大讯飞造假?真相来了

    来源:站酷海洛 AI翻译要想超越人类,就必须达到美剧《西部世界》里的强人工智能水平,否则机器翻译仍将长期扮演辅助者的角色。 文 | 《中国企业家》记者 张弘 编辑 | 徐昙 近日,…

    人工智能 2022年9月11日
    0132
  • 张量——Pytorch中Tensor的维度,形状,意义

    搬运一篇文章!阅读原文 在深度学习里,Tensor实际上就是一个多维数组(multidimensional array)。 而Tensor的目的是能够创造更高维度的矩阵、向量。对P…

    人工智能 2022年12月19日
    042
  • Python将语音识别成文字

    theme: orange 在本教程中,我们将学习如何将语音或音频文件转换为文本格式,此处主要是用Python相关库完成功能。 Python支持许多语音识别引擎和API,包括Goo…

    人工智能 2022年12月19日
    063
  • I2C接口及时序

    有2条双向串行线,一条数据线SDA,一条时钟线SCL 如果只做master SCL可以只是输出 SDA在PAD上一定是inout pin,当然转为数字信号时可以分为两组 inout…

    人工智能 2022年11月25日
    047
  • Nvidia MX150安装Tensorflow-GPU版,Pycharm使用Keras

    使用环境:Windows 10 Professional + Pycharm 需要使用:Tensorflow+keras 顺序安装:CUDA→CUDNN→Tensorflow 特别…

    2022年9月2日
    0121
  • 动手实现 LRU 算法,以及 Caffeine 和 Redis 中的缓存淘汰策略

    我是风筝,公众号「古时的风筝」。 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面。 那天我在 LeetCode 上刷到一道 LR…

    2022年9月1日
    0153
  • 基于改进YOLOv5的斑马线和汽车过线行为检测

    基于改进YOLOv5的斑马线检测和汽车过线行为检测 1 信息 2 摘要 3 贡献 4 数据集、源码、视频、全文链接 今天带来一个基于改进YOLOv5的斑马线和汽车过线行为检测算法:…

    人工智能 2022年12月5日
    037
  • C# 11 预览版

    此预览版中的新功能遵循 C# 11 的三个投资主题: 开发人员生产力:我们添加了更多语言功能以提高您的工作效率。 新的扩展特性: nameof required成员允许您编写需要c…

    人工智能 2022年11月20日
    059
  • 视频中的颜色识别——opencv实现

    颜色识别的原理 opencv中的颜色模型 RGB RGB具有三个通道其,分别表示红色通道®,绿色通道(G),蓝色通道(B),3个通道在opencv中的取值均为0~255,它的颜色由…

    人工智能 2022年12月13日
    060
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载