原文地址:Dual Attention Network for Scene Segmentation

源代码pytorch:https://github.com/junfu1115/DANet/

复现代码keras:https://github.com/niecongchong/DANet-keras

Abstract

提出了双重注意网络(DANet)来自适应地集成局部特征和全局依赖。在传统的扩张FCN之上附加两种类型的注意力模块,分别模拟空间和通道维度中的语义相互依赖性。

1. Introduction

2. Dual Attention Network

2.1 Overview

2.2 Position Attention Module

2.3 Channel Attention Module

2.4 Attention Module Embedding with Networks

3. 实验设置

我们的实现基于Pytorch。采用poly 学习率策略,其中初始学习率在每次迭代之后乘以( 1 − i t e r / t o t a l i t e r ) 0.9 (1-iter/total_iter)^{0.9}(1−iter/totali​ter)0.9。Cityscapes数据集的基本学习率设置为0.01。动量衰减系数为0.9,重量衰减系数为0.0001。批处理大小对Cityscapes设置为8,对其他数据集设置为16。在采用多尺度增强时,将COCO的训练时间设置为180个epoch,其他数据集的训练时间设置为240个epoch。当使用两个注意模块时,我们在网络的顶端采用多个损失函数。为了增加数据,我们在Cityscapes数据集的消融研究中采用随机裁剪(裁剪大小768)和随机左右翻转。

keras, TensorFlow中加入CBAM注意力机制

CBAM: Convolutional Block Attention Module

1 作者提出了一个简单但有效的注意力模块 CBAM,给定一个中间特征图,我们沿着空间和通道两个维度依次推断出注意力权重,然后与原特征图相乘来对特征进行自适应调整。

2 由于 CBAM 是一个轻量级的通用模块,它可以无缝地集成到任何 CNN 架构中,额外开销忽略不计,并且可以与基本 CNN 一起进行端到端的训练。

3 在不同的分类和检测数据集上,将 CBAM 集成到不同的模型中后,模型的表现都有了一致的提升,展示了其广泛的可应用性。

通道注意力模块

特征的每一个通道都代表着一个专门的检测器,因此,通道注意力是关注什么样的特征是有意义的。为了汇总空间特征,作者采用了全局平均池化和最大池化两种方式来分别利用不同的信息;

如输入是一个 H×W×C 的特征 F,我们先分别进行一个空间的全局平均池化和最大池化得到两个 1×1×C 的通道描述。接着,再将它们分别送入一个两层的神经网络,第一层神经元个数为 C/r,激活函数为 Relu,第二层神经元个数为 C。注意,这个两层的神经网络是共享的。然后,再将得到的两个特征相加后经过一个 Sigmoid 激活函数得到权重系数 Mc。最后,拿权重系数和原来的特征 F 相乘即可得到缩放后的新特征。参考SEnet;

空间注意力模块

在通道注意力模块之后,我们再引入空间注意力模块来关注哪里的特征是有意义的。

与通道注意力相似,给定一个 H×W×C 的特征 F‘,我们先分别进行一个通道维度的平均池化和最大池化得到两个 H×W×1 的通道描述,并将这两个描述按照通道拼接在一起。然后,经过一个 7×7 的卷积层,激活函数为 Sigmoid,得到权重系数 Ms。最后,拿权重系数和特征 F’ 相乘即可得到缩放后的新特征。

CBAM

通道注意力和空间注意力这两个模块可以以并行或者顺序的方式组合在一起,但是作者发现顺序组合并且将通道注意力放在前面可以取得更好的效果。

参考:

https://blog.csdn.net/qq_38410428/article/details/103695032?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs

https://blog.csdn.net/qq_38410428/article/details/101550613

第一步:找到要修改文件的源代码
在里面添加通道注意力机制和空间注意力机制
所需库
from keras.layers import GlobalAveragePooling2D, GlobalMaxPooling2D, Reshape, Dense, multiply, Permute, Concatenate, Conv2D, Add, Activation, Lambda
from keras import backend as K
from keras.activations import sigmoid通道注意力机制
def channel_attention(input_feature, ratio=8):channel_axis = 1 if K.image_data_format() == "channels_first" else -1channel = input_feature._keras_shape[channel_axis]shared_layer_one = Dense(channel//ratio,kernel_initializer='he_normal',activation = 'relu',use_bias=True,bias_initializer='zeros')shared_layer_two = Dense(channel,kernel_initializer='he_normal',use_bias=True,bias_initializer='zeros')avg_pool = GlobalAveragePooling2D()(input_feature)    avg_pool = Reshape((1,1,channel))(avg_pool)assert avg_pool._keras_shape[1:] == (1,1,channel)avg_pool = shared_layer_one(avg_pool)assert avg_pool._keras_shape[1:] == (1,1,channel//ratio)avg_pool = shared_layer_two(avg_pool)assert avg_pool._keras_shape[1:] == (1,1,channel)max_pool = GlobalMaxPooling2D()(input_feature)max_pool = Reshape((1,1,channel))(max_pool)assert max_pool._keras_shape[1:] == (1,1,channel)max_pool = shared_layer_one(max_pool)assert max_pool._keras_shape[1:] == (1,1,channel//ratio)max_pool = shared_layer_two(max_pool)assert max_pool._keras_shape[1:] == (1,1,channel)cbam_feature = Add()([avg_pool,max_pool])cbam_feature = Activation('hard_sigmoid')(cbam_feature)if K.image_data_format() == "channels_first":cbam_feature = Permute((3, 1, 2))(cbam_feature)return multiply([input_feature, cbam_feature])空间注意力机制
def spatial_attention(input_feature):kernel_size = 7if K.image_data_format() == "channels_first":channel = input_feature._keras_shape[1]cbam_feature = Permute((2,3,1))(input_feature)else:channel = input_feature._keras_shape[-1]cbam_feature = input_featureavg_pool = Lambda(lambda x: K.mean(x, axis=3, keepdims=True))(cbam_feature)assert avg_pool._keras_shape[-1] == 1max_pool = Lambda(lambda x: K.max(x, axis=3, keepdims=True))(cbam_feature)assert max_pool._keras_shape[-1] == 1concat = Concatenate(axis=3)([avg_pool, max_pool])assert concat._keras_shape[-1] == 2cbam_feature = Conv2D(filters = 1,kernel_size=kernel_size,activation = 'hard_sigmoid',strides=1,padding='same',kernel_initializer='he_normal',use_bias=False)(concat)assert cbam_feature._keras_shape[-1] == 1if K.image_data_format() == "channels_first":cbam_feature = Permute((3, 1, 2))(cbam_feature)return multiply([input_feature, cbam_feature])构建CBAM
def cbam_block(cbam_feature,ratio=8):"""Contains the implementation of Convolutional Block Attention Module(CBAM) block.As described in https://arxiv.org/abs/1807.06521."""cbam_feature = channel_attention(cbam_feature, ratio)cbam_feature = spatial_attention(cbam_feature, )return cbam_feature在相应的位置添加CBAMinputs = xresidual = layers.Conv2D(filter, kernel_size = (1, 1), strides = strides, padding = 'same')(inputs)residual = layers.BatchNormalization(axis = bn_axis)(residual)cbam = cbam_block(residual)x = layers.add([x, residual, cbam])这样就在任意位置加入了注意力机制啦。

CBAM的pytorch实现:https://blog.csdn.net/DD_PP_JJ/article/details/103318617

DANet(双重注意力融合网络)与CBAM相关推荐

  1. DANet(双重注意力融合网络)

    原文地址:Dual Attention Network for Scene Segmentation 源代码pytorch:https://github.com/junfu1115/DANet/ 复现 ...

  2. 霸榜COCO和Cityscapes!南理工CMU提出极化自注意力,更精细的双重注意力建模结构

    作者丨小马 编辑丨极市平台 [写在前面] 注意力机制是一个被广泛应用在各种CV任务中的方法.注意力机制根据施加的维度大致可以分为两类:通道注意力和空间注意力.对于通道注意力机制,代表性的工作有SENe ...

  3. CVPR 2019 | 用于场景分割的双重注意力网络

    场景分割是目前应用前景非常广泛的方向之一,对场景进行精确的分割始终有着显著的实际意义并且极富挑战.来自中国科学院自动化研究所模式识别国家重点实验室的文章<Dual Attention Netwo ...

  4. 微软论文解读:用于视觉对话的多步双重注意力模型

    作者丨张琨 学校丨中国科学技术大学博士生 研究方向丨自然语言处理 论文动机 当前 Visual dialog 模型尽管已经取得了令人印象深刻的表现,但当问题涉及到图像的特定区域或者比较细节的对话片段时 ...

  5. 【注意力机制】CBAM详解

    论文题目:<CBAM: Convolutional Block Attention Module> 论文地址:https://arxiv.org/pdf/1807.06521.pdf 1. ...

  6. 卷积神经网络中Attention注意力机制(CBAM)

    论文:cbam CBAM: Convolutional Block Attention Module attention机制,简单说就是从特征中学习或者提取出权重分布,再拿这个权重分布施加在原来的特征 ...

  7. 【深度学习经典网络架构—10】:注意力模块之CBAM

    ✨博客主页:米开朗琪罗~

  8. 【Attention】Dual Attention(DANet) Fully Attention(FLA)

    空间注意力有助于保留细节信息,通道注意力有助于保留大物体的语义一致性. 有效使用两种注意力可以提升性能. 本文旨在记录一些常用的注意力,以及代码实现,包括两篇文章,DANet,FLA. Dual At ...

  9. 通道注意力机制 cnn keras_【CV中的Attention机制】简单而有效的CBAM模块

    前言: CBAM模块由于其使用的广泛性以及易于集成得到很多应用.目前cv领域中的attention机制也是在2019年论文中非常火.这篇cbam虽然是在2018年提出的,但是其影响力比较深远,在很多领 ...

最新文章

  1. (链表)反转链表Reverse List
  2. 得到windows系统图标的解决方案(转)
  3. 【架构】阿里中台内容整理(部分)
  4. 配置DispatcherServlet
  5. GitHub 标星 5w+!Python 新手 100 天学习计划,这次再学不会算我输!
  6. 你吃的瓜子仁,真是老奶奶磕出来的?!
  7. 7. SVM松弛变量
  8. 编译ok6410linux内核,Linux3.6.7在OK6410平台的移植(二)编译配置linux3.6.7
  9. ubuntu 16.04 手动安装Java过程
  10. Webbrowser若干点
  11. Ubuntu+OpenCV学习汉字点阵,图片打印汉字
  12. AXI协议中的BURST
  13. flea-db使用之JPA接入
  14. Canvas绘图教程及简单实践
  15. RISCV学习笔记7.8(开源虚拟机篇)--AlmaLinux虚拟机安装modelsim
  16. 为老年人熟悉智能手机的APP
  17. vCenter学习笔记
  18. 解答:为什么要搭建企业论坛?如何快速搭建?
  19. 天河三号是量子计算机吗,“天河三号”原型机亮相,排名有望继续世界第一
  20. java中引用数据类型有哪几种

热门文章

  1. Java----线程学习(多线程)
  2. 微信支付中的p12证书提取公钥、私钥、证书、序列号等
  3. 网页被劫持会造成什么影响
  4. c语言课程设计总结心得大全,c语言课程设计的心得体会
  5. YAHOO工具库提供的方法
  6. 华为吹响“伙伴暨开发者”集结号:共赢数字时代
  7. English 250 common roots word
  8. Linux下的终端中用shell命令打开文件夹窗口
  9. 罗伯特扫地机器人电池如何取_周末清洁大会战 篇二十三:更换电池和清扫让iRobot 880扫地机器人焕然一新,还有更多配件来凑热闹...
  10. 异常处理(六)--------SpringBoot+Maven项目运行异常:Unable to find a single main class from the following candidat