微耗算力不改结构增加准确度大法来了

2023-10-27 14:48

本文主要是介绍微耗算力不改结构增加准确度大法来了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

微耗算力不改结构增加准确度大法来了

CBAM: Convolutional Block Attention Module

介绍:

  • 在这篇文章中,作者主要在两个卷积feature map之间增加了由(CAM) Channel Attention Module和(SAM)Spatial Attention Module构成的小shortcut类似的网络,虽然使得网络变宽了,但是计算量在大多数情况下是可以忽略不计的。而且最重要的是,这个模块是一个即插即用的模块,只要在CNN的feature map之间都是可以比较自由地添加,并不改变其他的网络结构,也不用更改其他的网络结构。
  • 就本文来说,trick不多,但是做的消融实验量比较大,最重要的创新点在于它的实用性。可以不改变网络结构和不增加较大参数量的情况下增加模型的准确度。这是本文最难得的地方。
  • 增加这个模块后,模型在(ImageNet-1K, MS COCO, and VOC 2007)三个数据集上都有提高。这个模型是一个具有很强实用性的模型。

在这里插入图片描述

  • 上图是CBAM的示意图。在图中其实就是加了两层的有进行处理的shortcut连接层,可以说是另一种形式的resnet。经过这两层的网络计算公式在下面。作者对公式的解释如下,比较清晰:
  • Given an intermediate feature map ⁡ F ∈ R C × H × W \operatorname{map} \mathbf{F} \in \mathbb{R}^{C \times H \times W} mapFRC×H×W as input, CBAM sequentially infers a 1 D 1 \mathrm{D} 1D channel attention map ⁡ M c ∈ R C × 1 × 1 \operatorname{map} \mathbf{M}_{\mathbf{c}} \in \mathbb{\mathbb { R }}^{C \times 1 \times 1} mapMcRC×1×1 and a 2 D 2 \mathrm{D} 2D spatial attention map M s ∈ R 1 × H × W \mathbf{M}_{\mathbf{s}} \in \mathbb{R}^{1 \times H \times W} MsR1×H×W as illustrated in Fig. 1. The overall attention process can be summarized as:
  • F ′ = M c ( F ) ⊗ F F ′ ′ = M s ( F ′ ) ⊗ F ′ \begin{aligned} \mathbf{F}^{\prime} &=\mathbf{M}_{\mathbf{c}}(\mathbf{F}) \otimes \mathbf{F} \\ \mathbf{F}^{\prime \prime} &=\mathbf{M}_{\mathbf{s}}\left(\mathbf{F}^{\prime}\right) \otimes \mathbf{F}^{\prime} \end{aligned} FF=Mc(F)F=Ms(F)F
  • 为什么模型要采用这种结构呢?这是因为作者说,他经过大量实验证明,CAM在前效果会比较好,CAM和SAM串行的结果会优于并行的结果。
  • 接下来我们就来看这两层具体的实现方法。

Channel Attention Module 和Spatial Attention Module的实现

CAM:

在这里插入图片描述

  • CAM的功能就是找到网络需要focus的重要的部分(channel维度上那个channel重要),进行高效的前向推理。先进行在通道上的最大池化和平均池化,之后进入共用的MLP(这里面有一个参数r,在论文中作者设置的值是16,它是用来确定中间的卷积特征图大小的超参数)中一起训练,得到两个feature map,最后输出之后进行相加。具体的结构如下.

  • CAM的功能是给模型一个通道上的attention参数,让模型知道自己在训练的时候要多注意哪些方面。这样能够高效地提升模型的训练精度。

SAM

在这里插入图片描述

  • 首先现在channel维度上进行maxpool和avgpool,先进行contact,再用一个7x7的卷积核进行卷积。计算公式如下: M s ( F ) = σ ( f 7 × 7 ( [ Avg ⁡ Pool ⁡ ( F ) ; MaxPool ⁡ ( F ) ] ) ) = σ ( f 7 × 7 ( [ F avg  s ; F max ⁡ s ] ) ) \begin{aligned} \mathbf{M}_{\mathbf{s}}(\mathbf{F}) &=\sigma\left(f^{7 \times 7}([\operatorname{Avg} \operatorname{Pool}(\mathbf{F}) ; \operatorname{MaxPool}(\mathbf{F})])\right) \\ &=\sigma\left(f^{7 \times 7}\left(\left[\mathbf{F}_{\text {avg }}^{\mathrm{s}} ; \mathbf{F}_{\max }^{\mathbf{s}}\right]\right)\right) \end{aligned} Ms(F)=σ(f7×7([AvgPool(F);MaxPool(F)]))=σ(f7×7([Favg s;Fmaxs]))

  • σ \sigma σ :sigmoid function | f 7 × 7 f^{7 \times 7} f7×7 7 × 7 7 \times 7 7×7.卷积核,默认有padding。

  • 这个功能是让模型知道空间上应该注意的地方,用原文的话来说就是:where to focus。为什么使用7x7的卷积核呢,作者做实验得到,使用大的卷积核能够使得结果更好,也就是说,在空间注意力机制的网络设计上,需要用到更大的卷积核,使得模型有更大的感受野。

  • 当然这个方法用1x1卷积改变通道数也是可以实现的,但是,在实验中,作者说效果不如用avg和max好

使用的具体图像:

在这里插入图片描述

  • 作者在resnet中间加入了这些模块进行实验。在模块中,进行CAM得到的Attention和原来的feature map按照channel维度相乘之后,再进行SAM。SAM得到的空间结果继续和F’相乘。最后才和shortcut连接。

  • 在实验的时候作者应该是每个resnet block都加了这个东西。经过实验得到,加上CBAM之后模型的错误率都有下降。
    -

  • 作者还用CBAM和SE Net在MobileNet上进行对比实验,CBAM增加的参数量和SE Net增加的参数量基本一致,但是,准确率却提升了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LgdMPoHI-1615826089112)(C:\Users\sakura\Desktop\奋斗吧cv\名企课\week16\Snipaste_2021-03-09_15-28-33.png)]

结果可视化

  • 作者在进行结果可视化的时候用了Grad-CAM的方法。通过这个方法,把Attention机制输出的feature map输出成热力图进行比对。在进行判定baseline和加了CBAM的方法哪个好的时候,作者采用了选一些人来投票的方法,得到CBAM效果比较好,当然,确实CBAM的效果会好些。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DoMM9l4L-1615826089113)(C:\Users\sakura\Desktop\奋斗吧cv\名企课\week16\Snipaste_2021-03-09_15-33-49.png)]

以上是得到的output图片,确实得到的注意力会集中一些。

额外的实验

  • 作者还在coco数据集上进行测试,采用了Resnet50作为backbone和Fast-RCNN作为功能头进行检测。backbone加了CBAM的效果都提升了2个百分点甚至以上
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N6Nr4Q6n-1615826089114)(C:\Users\sakura\Desktop\奋斗吧cv\名企课\week16\Snipaste_2021-03-09_15-36-42.png)]
    在这里插入图片描述

  • 本文参考文献:

Woo S, Park J, Lee J Y, et al. Cbam: Convolutional block attention module[C]//Proceedings of the European conference on computer vision (ECCV). 2018: 3-19.

这篇关于微耗算力不改结构增加准确度大法来了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/286368

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

如何用GPU算力卡P100玩黑神话悟空?

精力有限,只记录关键信息,希望未来能够有助于其他人。 文章目录 综述背景评估游戏性能需求显卡需求CPU和内存系统需求主机需求显式需求 实操硬件安装安装操作系统Win11安装驱动修改注册表选择程序使用什么GPU 安装黑神话悟空其他 综述 用P100 + PCIe Gen3.0 + Dell720服务器(32C64G),运行黑神话悟空画质中等流畅运行。 背景 假设有一张P100-

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

Tomcat下载压缩包解压后应有如下文件结构

1、bin:存放启动和关闭Tomcat的命令的路径。 2、conf:存放Tomcat的配置,所有的Tomcat的配置都在该路径下设置。 3、lib:存放Tomcat服务器的核心类库(JAR文件),如果需要扩展Tomcat功能,也可将第三方类库复制到该路径下。 4、logs:这是一个空路径,该路径用于保存Tomcat每次运行后产生的日志。 5、temp:保存Web应用运行过程中生成的临时文件

C和指针:结构体(struct)和联合(union)

结构体和联合 结构体 结构体包含一些数据成员,每个成员可能具有不同的类型。 数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问成员。 结构声明 在声明结构时,必须列出它包含的所有成员。 struct tag {member-list} variable-list ; 定义一个结构体变量x(包含