YOLO11改进-模块-引入可变形交互注意力模块DIA-Module
在遥感图像融合分类任务中,当前的方法存在一些不足。一方面,图像的离散性会导致一些难以采样的点出现,不利于空间信息的收敛。另一方面,在注意力机制中,通常会聚焦于某一模态的优势特征,如 PAN 图像的纹理和 MS 图像的背景,这样容易忽略其他特征,难以实现不同特征间的交互增强,导致在去冗余过程中丢失有价值的信息,无法充分捕捉目标的多样性,进而影响模型对空间信息的表示和分类性能。为解决这些问题,设计了 DIA - Module。
上面是原模型,下面是改进模型

1. 可变形交互注意力模块DIA-Module介绍
DIA - Module 基于不同的池化策略生成具有属性差异的特征,通过特定的梯度调整方法利用跨属性的调制系数来重构特征块的形态,减少冗余样本点信息。同时,不同属性特征之间的相互作用促使神经元和可学习参数在训练过程中更多地参与,增强掩码空间特征的表示能力。在 MS 和 PAN 图像融合中,利用 MS 图像在全局和光滑特征方面的优势以及 PAN 图像在纹理细节方面的优势,通过设置不同的梯度缩放因子调整调制系数,实现对不同模态特征的有效融合和增强。
从提供的图片来看,DIA 模块主要包含以下几个部分:
DIA-Module(可变形交互注意力模块)主要由池化操作、下采样、调制系数生成与特征重构、上采样与掩码生成、特征融合这几部分构成,各部分协同工作以增强模型对特征的处理能力:
池化操作:接收输入特征,分别进行全局平均池化和最大池化。全局平均池化可以获取特征的全局平均信息,反映整体趋势;最大池化则聚焦于局部的突出特征,通过这两种池化操作,得到包含全局平滑性和局部纹理属性的特征。
下采样:考虑到计算成本,同时为保证输出特征块相邻样本点的相关性,对池化后的特征进行下采样。下采样可以减少数据量,降低计算复杂度,同时保留关键信息,为后续的权重学习提供合适尺寸的输入。
调制系数生成与特征重构:针对不同模态图像的特点,为下采样后的特征设置相互依赖的调制系数。像 MS 图像在全局和光滑特征上有优势,PAN 图像在纹理细节方面更突出,通过设置不同的梯度缩放因子来调整调制系数,实现对不同模态特征的优化。在 MS 分支,给与纹理相关的调制系数设置较小的梯度缩放因子,稳定获取高兼容性的纹理特征;给与全局特征相关的调制系数设置较大的梯度缩放因子,促进全局特征的快速收敛。在 PAN 分支,设置方式相反。
上采样与掩码生成:对上一步重构后的特征进行上采样,使其恢复到合适的尺寸,保持与原始特征的一致性。然后将上采样后的特征拼接起来,经过卷积和 sigmoid 函数处理,生成掩码。卷积操作可以提取特征的局部信息,sigmoid 函数将输出值映射到 0 到 1 之间,从而得到具有空间选择性的掩码。
特征融合:将生成的掩码与原始输入特征相乘,掩码中值较大的区域会增强原始特征相应位置的信息,值较小的区域则抑制对应位置的信息,实现对原始特征的加权和增强,突出重要特征,提升模型对空间信息的表示能力 。
2. YOLOv11与可变形交互注意力模块DIA-Module 的结合
将本文中的 ADCD-Net 相关模块融入 YOLOv11 进行改进,对C2PSA进行魔改。DIA-Module 通过优化特征处理,增强空间信息表示,使 YOLOv11在复杂场景下对目标的定位更精准;DTM-Module 促进特征交互与重用,让模型更好地利用多尺度信息,提升对不同大小目标的检测能力,从而提高检测精度与稳定性。
3. 可变形交互注意力模块DIA-Module 代码部分视频讲解:
YOLOv8_improve/YOLOv11.md at master · tgf123/YOLOv8_improve · GitHub
YOLOv11模型改进讲解,教您如何修改YOLOv11_哔哩哔哩_bilibili
YOLOv11全部代码,现有几十种改进机制。
4. 可变形交互注意力模块DIA-Module 引入到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行成功
from sympy import false
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
if __name__=="__main__":
# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
model = YOLO(r"E:\Part_time_job_orders\YOLO\YOLOv11\ultralytics\cfg\models\11\yolo11_DIA_MODEL.yamy")\
.load(r'E:\Part_time_job_orders\YOLO\YOLOv11\yolo11n.pt') # build from YAML and transfer weights
results = model.train(data=r'E:\Part_time_job_orders\YOLO\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
)