DANet(双重注意力融合网络)与CBAM
原文地址:Dual Attention Network for Scene Segmentation
源代码pytorch:https://github.com/junfu1115/DANet/
复现代码keras:https://github.com/niecongchong/DANet-keras
Abstract
提出了双重注意网络(DANet)来自适应地集成局部特征和全局依赖。在传统的扩张FCN之上附加两种类型的注意力模块,分别模拟空间和通道维度中的语义相互依赖性。
- 位置注意力模块通过所有位置处的特征的加权和来选择性地聚合每个位置的特征。无论距离如何,类似的特征都将彼此相关。
- 同通道注意力模块通过整合所有通道映射之间的相关特征来选择性地强调存在相互依赖的通道映射。
- 将两个注意模块的输出相加以进一步改进特征表示,这有助于更精确的分割结果
1. Introduction
- 提出了一个双重注意网络(DANet)来捕捉空间和通道维度中的全局特征依赖关系
- 建议使用位置注意力模块来学习特征的空间相互依赖性,并设计通道注意力模块来模拟通道相互依赖性。通过在局部特征上建模丰富的上下文依赖关系,显著改善了分割结果
- 在三个数据集Cityscapes, PASCAL Context和COCO Stuff上实现了state-of-the-art的结果
2. Dual Attention Network
2.1 Overview
- 采用 Dilated ResNet (DeepLab V2的主干网络)作为主干,删除了下采样操作并在最后两个ResNet块中使用了空洞卷积,最终特征映射的大小是输入图像的1/8
- Dilated ResNet 产生的特征图再送入两个平行的注意力模块中
- 最后汇总两个注意力模块的输出特征,以获得更好的像素级预测特征表示
2.2 Position Attention Module
- 特征图A(C×H×W)首先分别通过3个卷积层得到3个特征图B,C,D,然后将B,C,D reshape为C×N,其中N=H×W
- 之后将reshape后的B的转置(NxC)与reshape后的C(CxN)相乘,再通过softmax得到spatial attention map S(N×N)
- 接着在reshape后的D(CxN)和S的转置(NxN)之间执行矩阵乘法,再乘以尺度系数α,再reshape为原来形状,最后与A相加得到最后的输出E
- 其中α初始化为0,并逐渐的学习得到更大的权重
2.3 Channel Attention Module
- 分别对A做reshape(CxN)和reshape与transpose(NxC)
- 将得到的两个特征图相乘,再通过softmax得到channel attention map X(C×C)
- 接着把X的转置(CxC)与reshape的A(CxN)做矩阵乘法,再乘以尺度系数β,再reshape为原来形状,最后与A相加得到最后的输出E
- 其中β初始化为0,并逐渐的学习得到更大的权重
2.4 Attention Module Embedding with Networks
3. 实验设置
keras, TensorFlow中加入CBAM注意力机制
CBAM: Convolutional Block Attention Module
1 作者提出了一个简单但有效的注意力模块 CBAM,给定一个中间特征图,我们沿着空间和通道两个维度依次推断出注意力权重,然后与原特征图相乘来对特征进行自适应调整。
2 由于 CBAM 是一个轻量级的通用模块,它可以无缝地集成到任何 CNN 架构中,额外开销忽略不计,并且可以与基本 CNN 一起进行端到端的训练。
3 在不同的分类和检测数据集上,将 CBAM 集成到不同的模型中后,模型的表现都有了一致的提升,展示了其广泛的可应用性。
特征的每一个通道都代表着一个专门的检测器,因此,通道注意力是关注什么样的特征是有意义的。为了汇总空间特征,作者采用了全局平均池化和最大池化两种方式来分别利用不同的信息;
在通道注意力模块之后,我们再引入空间注意力模块来关注哪里的特征是有意义的。
CBAM
通道注意力和空间注意力这两个模块可以以并行或者顺序的方式组合在一起,但是作者发现顺序组合并且将通道注意力放在前面可以取得更好的效果。
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相关推荐
- DANet(双重注意力融合网络)
原文地址:Dual Attention Network for Scene Segmentation 源代码pytorch:https://github.com/junfu1115/DANet/ 复现 ...
- 霸榜COCO和Cityscapes!南理工CMU提出极化自注意力,更精细的双重注意力建模结构
作者丨小马 编辑丨极市平台 [写在前面] 注意力机制是一个被广泛应用在各种CV任务中的方法.注意力机制根据施加的维度大致可以分为两类:通道注意力和空间注意力.对于通道注意力机制,代表性的工作有SENe ...
- CVPR 2019 | 用于场景分割的双重注意力网络
场景分割是目前应用前景非常广泛的方向之一,对场景进行精确的分割始终有着显著的实际意义并且极富挑战.来自中国科学院自动化研究所模式识别国家重点实验室的文章<Dual Attention Netwo ...
- 微软论文解读:用于视觉对话的多步双重注意力模型
作者丨张琨 学校丨中国科学技术大学博士生 研究方向丨自然语言处理 论文动机 当前 Visual dialog 模型尽管已经取得了令人印象深刻的表现,但当问题涉及到图像的特定区域或者比较细节的对话片段时 ...
- 【注意力机制】CBAM详解
论文题目:<CBAM: Convolutional Block Attention Module> 论文地址:https://arxiv.org/pdf/1807.06521.pdf 1. ...
- 卷积神经网络中Attention注意力机制(CBAM)
论文:cbam CBAM: Convolutional Block Attention Module attention机制,简单说就是从特征中学习或者提取出权重分布,再拿这个权重分布施加在原来的特征 ...
- 【深度学习经典网络架构—10】:注意力模块之CBAM
✨博客主页:米开朗琪罗~
- 【Attention】Dual Attention(DANet) Fully Attention(FLA)
空间注意力有助于保留细节信息,通道注意力有助于保留大物体的语义一致性. 有效使用两种注意力可以提升性能. 本文旨在记录一些常用的注意力,以及代码实现,包括两篇文章,DANet,FLA. Dual At ...
- 通道注意力机制 cnn keras_【CV中的Attention机制】简单而有效的CBAM模块
前言: CBAM模块由于其使用的广泛性以及易于集成得到很多应用.目前cv领域中的attention机制也是在2019年论文中非常火.这篇cbam虽然是在2018年提出的,但是其影响力比较深远,在很多领 ...
最新文章
- (链表)反转链表Reverse List
- 得到windows系统图标的解决方案(转)
- 【架构】阿里中台内容整理(部分)
- 配置DispatcherServlet
- GitHub 标星 5w+!Python 新手 100 天学习计划,这次再学不会算我输!
- 你吃的瓜子仁,真是老奶奶磕出来的?!
- 7. SVM松弛变量
- 编译ok6410linux内核,Linux3.6.7在OK6410平台的移植(二)编译配置linux3.6.7
- ubuntu 16.04 手动安装Java过程
- Webbrowser若干点
- Ubuntu+OpenCV学习汉字点阵,图片打印汉字
- AXI协议中的BURST
- flea-db使用之JPA接入
- Canvas绘图教程及简单实践
- RISCV学习笔记7.8(开源虚拟机篇)--AlmaLinux虚拟机安装modelsim
- 为老年人熟悉智能手机的APP
- vCenter学习笔记
- 解答:为什么要搭建企业论坛?如何快速搭建?
- 天河三号是量子计算机吗,“天河三号”原型机亮相,排名有望继续世界第一
- java中引用数据类型有哪几种
热门文章
- Java----线程学习(多线程)
- 微信支付中的p12证书提取公钥、私钥、证书、序列号等
- 网页被劫持会造成什么影响
- c语言课程设计总结心得大全,c语言课程设计的心得体会
- YAHOO工具库提供的方法
- 华为吹响“伙伴暨开发者”集结号:共赢数字时代
- English 250 common roots word
- Linux下的终端中用shell命令打开文件夹窗口
- 罗伯特扫地机器人电池如何取_周末清洁大会战 篇二十三:更换电池和清扫让iRobot 880扫地机器人焕然一新,还有更多配件来凑热闹...
- 异常处理(六)--------SpringBoot+Maven项目运行异常:Unable to find a single main class from the following candidat