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

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

相关文章

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

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