提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、Dual Attention
  • 二、代码
    • 1.PAM
    • 2.CAM
  • 总结

前言

DANet: Dual Attention Network for Scene Segmentation(CVPR2019)
原文地址:https://arxiv.org/pdf/1809.02983.pdf
项目地址(Pytorch):https://github.com/junfu1115/DANet

其实个人对DANet理解还不是很透彻,大致上无非是通道(CAM)+空间注意力(PAM)。但是和CBAM、scSE等其它空间-通道注意力的区别在于,Daul Attention采用了类似self-attention的结构,是全局的。

最近几个月一直在自己的2D MRI数据集上尝试添加注意力机制的多类别医学图像分割方法,但是尝试了attention gate、 se、 cbam等等一箩筐的注意力机制,和基线(U-Net)相比竟然都没什么提升,整个人都处在一个怀疑人生的状态。难道注意力机制真就对当前任务没有帮助?太难顶了。

有的时候想想,注意力机制无非也是卷积、矩阵乘法、MLP的堆叠,到底是什么赋予了它们额外的特征提取的能力呢?

说回来,其实DANet的第三方实现挺多的,keras的也有,我是参考[2]的keras代码,尽可能地按照[1]的流程简单且一致地实现了一遍。

tensorflow版本建议>=2.6.0

代码参考:
[1] https://github.com/junfu1115/DANet
[2] https://blog.csdn.net/hc1104349963/article/details/109594161
[3] https://github.com/niecongchong/DANet-keras


提示:以下是本篇文章正文内容,下面案例可供参考

一、Dual Attention

原文用于场景分割,是加在Resnet底部的。医学图像分割的话,一般考虑加在编码器底部或者跳跃连接的位置吧。
别的就不多说了先,看看概览图。

位置注意力(PAM)和通道注意力细节(CAM)

二、代码

1.PAM

代码(Pytorch):

class PAM_Module(Module):""" Position attention module"""#Ref from SAGANdef __init__(self, in_dim):super(PAM_Module, self).__init__()self.chanel_in = in_dimself.query_conv = Conv2d(in_channels=in_dim, out_channels=in_dim//8, kernel_size=1)self.key_conv = Conv2d(in_channels=in_dim, out_channels=in_dim//8, kernel_size=1)self.value_conv = Conv2d(in_channels=in_dim, out_channels=in_dim, kernel_size=1)self.gamma = Parameter(torch.zeros(1))self.softmax = Softmax(dim=-1)def forward(self, x):"""inputs :x : input feature maps( B X C X H X W)returns :out : attention value + input featureattention: B X (HxW) X (HxW)"""m_batchsize, C, height, width = x.size()proj_query = self.query_conv(x).view(m_batchsize, -1, width*height).permute(0, 2, 1)proj_key = self.key_conv(x).view(m_batchsize, -1, width*height)energy = torch.bmm(proj_query, proj_key)attention = self.softmax(energy)proj_value = self.value_conv(x).view(m_batchsize, -1, width*height)out = torch.bmm(proj_value, attention.permute(0, 2, 1))out = out.view(m_batchsize, C, height, width)out = self.gamma*out + xreturn out

代码(keras):

import tensorflow as tf
form keras.layers import *def PAM_Module(x):gamma = tf.Variable(tf.ones(1))x_origin = xbatch_size, H, W, Channel = x.shapeproj_query = Conv2D(kernel_size=1, filters=Channel // 8, padding='same')(x)proj_key = Conv2D(kernel_size=1, filters=Channel // 8, padding='same')(x)proj_value = Conv2D(kernel_size=1, filters=Channel, padding='same')(x)proj_query, proj_key, proj_value = tf.transpose(proj_query, [0, 3, 1, 2]), tf.transpose(proj_key, [0, 3, 1, 2]), tf.transpose(proj_value, [0, 3, 1, 2])proj_key = tf.reshape(proj_key, (-1, Channel//8, H*W))proj_query = tf.transpose(tf.reshape(proj_query, (-1, Channel//8, H*W)), [0, 2, 1])energy = tf.matmul(proj_query, proj_key)attention = tf.nn.softmax(energy)proj_value = tf.reshape(proj_value, (-1, Channel, H*W))out = tf.matmul(proj_value, tf.transpose(attention, [0, 2, 1]))out = tf.reshape(out, (-1, Channel, H, W))out = tf.transpose(out, [0, 2, 3, 1])out = add([out*gamma, x_origin])return out

2.CAM

代码(Pytorch):

class CAM_Module(Module):""" Channel attention module"""def __init__(self, in_dim):super(CAM_Module, self).__init__()self.chanel_in = in_dimself.gamma = Parameter(torch.zeros(1))self.softmax  = Softmax(dim=-1)def forward(self,x):"""inputs :x : input feature maps( B X C X H X W)returns :out : attention value + input featureattention: B X C X C"""m_batchsize, C, height, width = x.size()proj_query = x.view(m_batchsize, C, -1)proj_key = x.view(m_batchsize, C, -1).permute(0, 2, 1)energy = torch.bmm(proj_query, proj_key)energy_new = torch.max(energy, -1, keepdim=True)[0].expand_as(energy)-energyattention = self.softmax(energy_new)proj_value = x.view(m_batchsize, C, -1)out = torch.bmm(attention, proj_value)out = out.view(m_batchsize, C, height, width)out = self.gamma*out + xreturn out

代码(keras):

def CAM_Module(x):"""通道注意力 Channel Attention Moudle:param x: 输入数组[B, H, W, C]:return: 输出数组[B, H, W, C]"""gamma = tf.Variable(tf.ones(1))x_origin = xbatch_size, H, W, Channel = x.shapex = tf.transpose(x, [0, 3, 1, 2])proj_query = tf.reshape(x, (-1, Channel, H*W))proj_key = tf.transpose(proj_query, [0, 2, 1])energy = tf.matmul(proj_query, proj_key)energy_new = tf.reduce_max(energy, axis=-1, keepdims=True)energy_new = tf.repeat(energy_new, Channel, axis=-1)energy_new = energy_new - energyattention = tf.nn.softmax(energy_new)proj_value = proj_queryout = tf.matmul(attention, proj_value)out = tf.reshape(out, (-1, Channel, H, W))out = tf.transpose(out, [0, 2, 3, 1])out = add([out*gamma, x_origin])return out

总结

感觉现在学术界用Tensorflow和keras的人比较少,代码多靠第三方复现。自己还在用tf的主要原因是比较菜,从高度封装的keras入的门。

有没有做医学图像分割的大佬或组织,介绍我认识认识TAT,救救孩子。

DANet Daul Attention位置和通道注意力(PAM&CAM)keras实现相关推荐

  1. 浙大 | FcaNet:频域通道注意力机制(keras实现)

    FcaNet: Frequency Channel Attention Networks  paper:http://arxiv.org/abs/2012.11879 code:https://git ...

  2. 【注意力机制集锦】Channel Attention通道注意力网络结构、源码解读系列一

    Channel Attention网络结构.源码解读系列一 SE-Net.SK-Net与CBAM 1 SENet 原文链接:SENet原文 源码链接:SENet源码 Squeeze-and-Excit ...

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

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

  4. 通道注意力机制_即插即用,Triplet Attention机制让Channel和Spatial交互更加丰富(附开源代码)...

    ↑ 点击蓝字 关注极市平台作者丨ChaucerG来源丨AI人工智能初学者编辑丨极市平台 极市导读 本文介绍了一种新的注意力机制--Triplet Attention,它通过使用Triplet Bran ...

  5. 【SCA-CNN 解读】空间与通道注意力:Spatial and Channel-wise Attention

    摘要 视觉注意已经成功地应用于结构预测任务,如视觉字幕和问题回答.现有的视觉注意力模型一般是空间的,即注意力被建模为空间概率,该空间概率对编码输入图像的CNN的最后一个卷积层特征图进行重新加权. 然而 ...

  6. Attention机制理解笔记(空间注意力+通道注意力+CBAM+BAM)

    Attention机制理解笔记 声明 Attention分类(主要SA和CA) spitial attention channel attention SA + CA(spitial attentio ...

  7. 【附代码实现】Attention注意力模块的keras\tf实现(ECA、BAM、Coordinate、DualAttention、GlobalContext等)

    文章目录 前言 1. ECA 2. Coordinate attention 3. Dual attention 4. FrequencyChannelAttention 5. BAM 6.Globa ...

  8. 空间注意力机制和通道注意力机制详解

    Attention机制在近几年来在图像,自然语言处理等领域中都取得了重要的突破,被证明有益于提高模型的性能. Attention机制本身也是符合人脑和人眼的感知机制,这次我们主要以计算机视觉领域为例, ...

  9. 【深度学习】(8) CNN中的通道注意力机制(SEnet、ECAnet),附Tensorflow完整代码

    各位同学好,今天和大家分享一下attention注意力机制在CNN卷积神经网络中的应用,重点介绍三种注意力机制,及其代码复现. 在我之前的神经网络专栏的文章中也使用到过注意力机制,比如在MobileN ...

最新文章

  1. Facebook AI指出:CNN的padding机制,存在一大缺陷
  2. 如何更改应用在app store的名称
  3. Xcode10 修改代码后,编译没有反应,或者导入头文件没有提示
  4. ITK:将图像从一种类型投射到另一种类型,但限制在输出值范围内
  5. 7.10 枚举——最大公约数和最小公倍数问题
  6. devc++不兼容_Mac压缩文件Win不支持?BetterZip帮你解决!
  7. android canvas自适应屏幕,html5 Canvas 如何自适应屏幕大小?
  8. 计算机教学怎么为护士服务卫校,【计算机教学论文】中专卫生学校计算机教学论文(共1480字)...
  9. 享元模式在 Java String 中的应用
  10. Hadoop出现core-site.xml not found的解决办法
  11. Fragment 源码解析add()和replace()方法
  12. 抽象类实现接口,子类继承抽象类,这三个之间的关系?
  13. SecureCRT和SecureFX的下载和安装2022
  14. excel 数组函数入门讲座
  15. fiddler证书下载(模拟器)
  16. CCRC信息安全服务资质认证流程知识点汇总
  17. 使用腾讯企业邮箱为什么强烈建议启用安全登录?怎么启用?
  18. 短视频剪辑如何正确把握“节奏感”,三个小技巧助你快慢有序
  19. Python3-StringIO和BytesIO的总结
  20. 知乎上的一道问题:出家人怎么解决性欲?

热门文章

  1. 【开发教程14】AI语音人脸识别(会议记录仪/人脸打卡机)-AI人脸系统架构
  2. pageContext
  3. 计算机 布局菜单栏 无法打勾,w7系统 我的电脑工具栏不见了
  4. TP5生成二维码教程
  5. 求n边形周长的k等分点坐标(今日头条)
  6. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜单(获取iframe中数据,src为空)...
  7. 计算机考研英语复试专有名词翻译
  8. FPGA时序约束分享04_output delay 约束
  9. Linux常见命令作用(持续更新中,欢迎提议支持)
  10. 3DMAX安装未完成,某些产品无法安装的解决方法