YOLO11改进-注意力-引入多尺度卷积注意力模块MSCAM
如何在增强特征图的同时降低计算成本,以提升模型性能。基于此,MSCAM 模块采用了多尺度卷积注意力机制,通过 CAB、SAB 和 MSCB 三个子模块协同工作。CAB 利用自适应池化和卷积操作生成通道注意力权重,强调重要通道特征;SAB 借助池化和大核卷积获取空间注意力权重,明确特征图中的关键区域;MSCB 基于倒置残差块设计,进行多尺度深度卷积和通道混洗操作,有效增强特征并捕获多尺度上下文信息。这些方法的综合运用使得 MSCAM 在提升特征表示能力的同时,显著降低了计算成本,从而提升了模型整体性能。在yolo目标检测模型中,SPPF模块的作用是提取多尺度特征,本文将SPPF模块替换成多尺度卷积注意力模块MSCAM,提升YOLOv11模型的多尺度特征。
上面是原模型,下面是改进模型
1. 多尺度卷积注意力模块MSCAM结构介绍
MSCAM(多尺度卷积注意力模块)的设计旨在通过对特征图进行多维度的注意力加权,从而提升特征的判别性和丰富性,进而提高模型在医学图像分割等任务中的性能。注意力机制通过自动学习特征图中不同部分的重要性,对特征进行加权处理。在 MSCAM 中,这种机制分为通道注意力和空间注意力两个维度。1通道注意力:旨在学习每个通道的重要性。不同通道可能包含不同类型的特征信息,通过为每个通道分配不同的权重,可以突出重要通道的特征,抑制无关通道的特征。空间注意力:关注特征图中的不同空间位置。医学图像中,目标区域可能只占图像的一部分,空间注意力机制能够让模型聚焦于这些关键区域,增强对目标区域的特征捕捉能力。多尺度卷积:为了适应医学图像中不同大小和形状的目标,MSCAM 采用多尺度卷积。不同尺度的卷积核能够捕捉到不同大小的特征,通过融合这些多尺度特征,可以得到更全面、更具判别性的特征表示。
-
整体结构:MSCAM 模块由三个主要子模块构成:通道注意力块(CAB)、空间注意力块(SAB)和多尺度卷积块(MSCB)。
-
通道注意力块(CAB)
-
自适应池化:
-
自适应最大池化(AMP):对输入特征图进行自适应最大池化操作,得到一个全局最大池化特征描述。
-
自适应平均池化(AAP):同时进行自适应平均池化操作,得到一个全局平均池化特征描述。
-
-
卷积操作:
-
对池化后的特征进行 1x1 卷积操作,减少通道数,中间使用 ReLU 激活函数。
-
再进行一次 1x1 卷积操作,恢复通道数。
-
-
Sigmoid 激活:最后通过 Sigmoid 激活函数得到通道注意力权重,用于对输入特征图进行通道加权。
-
-
空间注意力块(SAB)
-
池化操作:
-
自适应最大池化:沿通道维度进行自适应最大池化操作,得到一个特征描述。
-
自适应平均池化:沿通道维度进行自适应平均池化操作,得到另一个特征描述。
-
-
卷积操作:将池化后的两个特征描述进行拼接,然后使用大核卷积(如 7x7 卷积)进行操作,增强局部上下文关系。
-
Sigmoid 激活:最后通过 Sigmoid 激活函数得到空间注意力权重,用于对输入特征图进行空间加权。
-
-
多尺度卷积块(MSCB)
-
输入处理:接收输入特征图。
-
多尺度深度卷积:采用不同尺度的深度卷积核(如 3x3 和 5x5)进行卷积操作,捕捉不同尺度的特征。
-
通道混洗:对卷积后的特征进行通道混洗操作,增强特征的多样性。
-
通过这三个子模块的协同工作,MSCAM 模块能够有效地对输入特征图进行多维度的注意力加权和多尺度特征融合,输出具有更强判别性的特征图,用于后续的医学图像分割等任务。
2. YOLOv11与多尺度卷积注意力模块MSCAM的结合
在yolo目标检测模型中,SPPF模块的作用是提取多尺度特征,本文将SPPF模块替换成多尺度卷积注意力模块MSCAM,提升YOLOv11模型的多尺度特征。
3. 多尺度卷积注意力模块MSCAM代码部分
YOLOv8_improve/YOLOv11.md at master · tgf123/YOLOv8_improve · GitHub
获取全部代码
4. 将多尺度卷积注意力模块MSCAM引入到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。
第二:在task.py中导入EMCAD_block包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行成功
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
if __name__=="__main__":
# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
model = YOLO(r"D:\model\yolov11\ultralytics\cfg\models\11\yolo11_MSCAM.yaml")\
.load(r'D:\model\yolov11\yolo11n.pt') # build from YAML and transfer weights
results = model.train(data=r'D:\model\yolov11\ultralytics\cfg\datasets\VOC_my.yaml',
epochs=300,
imgsz=640,
batch=64,
# cache = False,
# single_cls = False, # 是否是单类别检测
# workers = 0,
# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
# amp = True
)