最近阅读了一些论文,发现两种CBAM添加使用方法,我进行了实现。首先介绍CBAM注意力机制。
CBAM(Convolutional Block Attention Module),结构如下图所示:
可以看到 CBAM 包含2个独立的子模块, 通道注意力模块(Channel Attention Module,CAM) 和空间注意力模块(Spartial Attention Module,SAM) ,分别进行通道与空间上的 Attention 。 这样不只能够节约参数和计算力,并且保证了其能够做为即插即用的模块集成到现有的网络架构中去。
(一)、Channel Attention Module(CAM)
通道上的Attention模块以及具体计算如下图所示:
具体流程如下:
将输入的特征图F(H×W×C)分别经过基于width和height的global max pooling(全局最大池化)和global average pooling(全局平均池化),得到两个1×1×C的特征图,接着,再将它们分别送入一个两层的神经网络(MLP),第一层神经元个数为 C/r(r为减少率),激活函数为 Relu,第二层神经元个数为 C,这个两层的神经网络是共享的。而后,将MLP输出的特征进行基于element-wise的加和操作,再经过sigmoid激活操作,生成最终的channel attention feature,即M_c。最后,将M_c和输入特征图F做element-wise乘法操作,生成Spatial attention模块需要的输入特征。
(二)、Spatial Attention Module(SAM)
空间上的Attention模块以及具体计算如下图所示:
具体流程如下:
将Channel attention模块输出的特征图F‘作为本模块的输入特征图。首先做一个基于channel的global max pooling 和global average pooling,得到两个H×W×1 的特征图,然后将这2个特征图基于channel 做concat操作(通道拼接)。然后经过一个7×7卷积(7×7比3×3效果要好)操作,降维为1个channel,即H×W×1。再经过sigmoid生成spatial attention feature,即M_s。最后将该feature和该模块的输入feature做乘法,得到最终生成的特征。
上文原文链接:http://t.csdnimg.cn/keVRz
然后再谈谈我使用CBAM如何对YOLOV8进行改进的。
第一种,也是最常见的一种,将CBAM模块添加到SPPF模块后面的位置,如下图:
第二种是在左侧三个分支上添加了CBAM,如下图所示:
代码的修改就是这样,我将两种修改的框架都放到了一个代码包中,如果各位有意购买改进的源码,请移步:YOLOV8改进:两种添加CBAM方式
购买即可获得两种修改方式,代码中我已经做好了完整的修改,只需要添加数据源和自己的路径,即可训练。即买即用,对于组会忙着拼凑组会汇报的进度,忙着寻找创新点的炼丹师们极为友好,本科生直接拿来做毕业设计也是极好的,一顿饭钱就解决了本科毕业的问题。