YOLOv5改进:CBAM注意力机制【注意力系列篇】(附详细的修改步骤,以及代码,目标检测中检测效果较好)

YOLOv5改进:CBAM注意力机制【注意力系列篇】(附详细的修改步骤,以及代码)

如果实验环境尚未搭建成功,可以参考这篇文章 ->【YOLOv5超详细环境搭建以及模型训练(GPU版本)】

文章链接为:http://t.csdnimg.cn/Ke0bb

---------------------------------------------------------------------------------------------------​

1.基本原理简介

Abstract:We propose Convolutional Block Attention Module (CBAM), a simple yet effective attention module for feed-forward convolutional neural networks. Given an intermediate feature map, our module sequentially infers attention maps along two separate dimensions, channel and spatial, then the attention maps are multiplied to the input feature map for adaptive feature refinement. Because CBAM is a lightweight and general module, it can be integrated into any CNN architectures seamlessly with negligible overheads and is end-to-end trainable along with base CNNs. We validate our CBAM through extensive experiments on ImageNet-1K, MS COCO detection, and VOC 2007 detection datasets. Our experiments show consistent improvements in classification and detection performances with various models, demonstrating the wide applicability of CBAM.

摘要:我们提出了卷积块注意模块(CBAM),这是一种简单而有效的用于前馈卷积神经网络的注意模块。给定一个中间特征图,我们的模块沿着两个独立的维度,通道和空间,顺序地推断注意力图,然后将这些注意力图与输入特征图相乘,进行自适应特征细化。由于CBAM是一个轻量级且通用的模块,可以无缝地集成到任何CNN架构中,几乎没有额外开销,并且可以与基础CNN一起进行端到端的训练。我们通过对ImageNet-1K、MS COCO检测和VOC 2007检测数据集的大量实验验证了我们的CBAM。我们的实验证明,在不同模型下,分类和检测性能都得到了一致的改善,证明了CBAM的广泛适用性。

        这篇文章中提出的CBMA模块如图所示,CBAM(Convolutional Block Attention Module)是一种结合了通道注意力和空间注意力的注意力模块,旨在全面提升卷积神经网络的性能。CBAM模块包括两个子模块:通道注意力模块(Channel Attention Module)和空间注意力模块(Spatial Attention Module)。通道注意力模块用于增强通道维度上的特征表示,而空间注意力模块用于增强空间维度上的特征表示。通过将这两个模块结合起来,CBAM能够全面提升网络的表征能力,从而在各种计算机视觉任务中取得更好的性能。

下面来介绍一下通道注意力机制和空间注意力机制的工作原理。

        通道注意力(Channel Attention)是一种注意力机制,用于增强深度神经网络在通道维度上的特征表示。其基本原理是通过学习每个通道的重要性权重,从而动态地调整不同通道的特征响应,以提高网络的表征能力。

通道注意力通常包括两个主要步骤:

        1.提取全局特征:首先,通过全局池化(如全局平均池化)操作,从每个通道的特征图中提取出一个全局描述符。这个全局描述符捕捉了每个通道在整个特征图上的重要性信息。

        2.学习通道权重:然后,通过一个小型的全连接神经网络(通常是一个或多个全连接层)学习每个通道的重要性权重。这个网络接收全局特征描述符作为输入,输出一个表示每个通道权重的向量。这个权重向量被应用于原始的特征图上,通过乘法操作对每个通道的特征响应进行重新加权。这样做的结果是,网络能够根据每个通道的重要性动态地调整特征响应,从而提高了网络的性能和表征能力。

        空间注意力(Spatial Attention)是一种注意力机制,用于增强深度神经网络在空间维度上的特征表示。其基本原理是通过学习每个空间位置的重要性权重,从而动态地调整不同位置的特征响应,以提高网络的感知能力。

空间注意力通常包括以下几个步骤:

1.特征映射压缩:首先,为了减少计算量,通常使用卷积操作将输入特征图进行压缩,以得到低维度的特征映射。

2.提取空间特征:然后,在压缩后的特征映射上,通过一系列卷积操作提取空间特征。这些空间特征捕捉了不同位置的信息。

3.学习空间权重:接着,通过一个小型的全连接神经网络或卷积神经网络学习每个空间位置的重要性权重。这个网络接收压缩后的特征映射作为输入,输出一个表示每个空间位置权重的热图。这个热图可以被视为空间注意力图,指示了每个位置的重要性。

4.特征加权:最后,将学习到的空间注意力图应用于原始的特征映射上,通过乘法操作对每个位置的特征响应进行重新加权。这样做的结果是,网络能够根据每个位置的重要性动态地调整特征响应,从而提高了网络的感知能力。

对比实验:

CBAM的主要思想

多层次的特征关注:通过结合通道注意力和空间注意力,CBAM可以同时关注特征图中的重要通道和重要的空间位置,从而提高特征表示的准确性。

模块化设计:CBAM可以作为一个独立的模块插入到现有的卷积神经网络架构中,不需要对原有网络进行大规模改动。其轻量级的设计使其在提高性能的同时,不会显著增加计算开销和参数数量。

自适应性:CBAM能够根据输入数据自适应地调整关注点,不需要额外的监督信息。这使得它在图像分类、目标检测和分割等任务中具有广泛的适用性。

应用场景

        CBAM已被广泛应用于各种计算机视觉任务中,如图像分类、物体检测、图像分割等。它的设计思路也为后续的注意力机制模块的发展提供了重要参考。总的来说,CBAM通过在通道和空间两个维度上引入注意力机制,有效增强了卷积神经网络的特征表达能力,提升了模型的性能。

论文地址:https://arxiv.org/pdf/1807.06521.pdf

2.改进步骤【将CBAM模块加入到YOLOv5中】

注意:CBAM 模块是一种即插即用的模块,可以在许多位置添加。不同的数据集可能需要在不同的位置添加 CBAM 模块,其效果也会有所不同。建议在不同位置进行多次实验以便比较效果。以下是我选择添加CBAM模块的位置,供大家参考,但不一定要完全按照这种方式添加。

2.1 方法一:在YOLOv5的主干网络(Backbone)中添加CBAM模块

2.1.1 步骤一

在【modules】目录下新建一个cbam.py的文件,添加CBAM模块代码。代码获取链接:https://mbd.pub/o/bread/mbd-ZpqWlZht

最后在【moduels/_init_.py】文件里面导入CBAM模块。

2.1.2 步骤二

打开【moduels/yolo.py】文件,在文件的开头导入CBAM模块。

然后找到parse_model这个方法(可以通过搜索parse_model)。

最后在parse_model方法中找到for语句(for i, (f, n, m, args) in enumerate(d["backbone"] + d["head"])),在for语句中再添加一个elif语句,将CBAM模块添加进去。

elif m in {CBAM}:
    args = [ch[f],  ch[f]]

添加的位置截图如下:

2.1.3 步骤三

修改模型。在【models】目录下新建一个yolov5-cbam.yaml网络结构配置文件。将CBAM模块添加到YOLOv5结构中(这里我将CBAM模块添加到主干网络的倒数第二层)。 代码获取链接:https://mbd.pub/o/bread/mbd-ZpqWlZht

2.1.4 训练过程

修改train.py文件训练模型,这里只修改YOLO模型对象,路径改为自己刚刚创建的文件,其余这里选择默认。

成功运行的网络结构截图如下:

开始训练模型的部分截图如下:

训练结果保存在【runs/tain】目录下。

注:如果训练过程出现如下错误,需要打开train.py文件,在scaler.scale(loss).backward()前添加torch.use_deterministic_algorithms(False)即可解决问题

错误提示:

2.2 方法二:在C3模块的残差结构中添加CBAM模块

2.2.1 步骤一

在【modules】目录下新建一个c3_cbam.py的文件,将CBAM模块添加到C3模块的残差结构中  代码获取链接:https://mbd.pub/o/bread/mbd-ZpqWlZht

然后在【moduels/_init_.py】文件里面导入Bottleneck_CBAM,C3_CBAM模块。

2.2.2 步骤二

打开【models/yolo.py】文件,在文件的开头导入C3_CBAM模块。

找到parse_model这个方法(可以通过搜索parse_model)。

然后在parse_model方法中找到for语句(for i, (f, n, m, args) in enumerate(d["backbone"] + d["head"])),在for语句中的两个位置添加C3_CBAM模块。

2.2.3 步骤三

修改模型。在【models】目录下新建一个yolov5-c3-cbam.yaml网络结构配置文件。(这里我将主干中的C3模块替换为C3_CBAM模块,除此之外,也可以将Neck的C3模块替换为C3_CBAM模块)  代码获取链接:https://mbd.pub/o/bread/mbd-ZpqWlZht

2.2.4 训练过程

在train.py文件中修改模型的配置文件路径,使用yolov5-c3-cbam.yaml文件,然后运行train.py。

成功运行的网络结构截图如下:

开始训练模型的部分截图如下:

训练结果保存在【runs/train】"目录下。

3.完整的项目代码下载路径

我们提供完整的项目代码,你也可以直接下载到本地,然后打开项目,修改数据集配置文件【NEU-DET.yaml】的数据集路径即可训练模型。完整项目代码获取链接:https://mbd.pub/o/bread/mbd-ZpqWlZht

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值