在视觉识别领域,卷积神经网络(CNN)长期占据主导地位,但近年来视觉变换器(ViT)也展现出潜力。然而,ViT 在 ImageNet 分类中存在性能短板,主要原因是其将细粒度特征编码为 token 表示的效率较低。Outlook attention 机制的提出解决了这一问题,它能高效地将更细粒度的特征和上下文编码为 token,从而提升模型性能。本文将Outlook attention 与C3K2相结合,提出C3k2_Outlook_attention模块。
上面是原模型,下面是改进模型
1. 前景注意力Outlook attention结构介绍
Outlook attention 是一种新的注意力机制,用于视觉识别任务,旨在有效编码细粒度特征和上下文信息到 token 表示中,提升模型性能。Outlook Attention 的核心目标是有效地捕捉局部细粒度特征。在传统的自注意力机制中,往往侧重于粗粒度级别的全局依赖建模,而可能忽略了局部特征的重要性。Outlook Attention 通过在局部窗口内进行操作,能够更好地编码局部的细粒度特征和上下文信息。
-
原理
-
局部特征捕捉: 它通过计算局部窗口内各位置之间的关系来生成注意力权重,进而对局部特征进行加权聚合,使得模型能够更精准地捕捉到局部特征的细节。
-
注意力权重计算: Outlook Attention 首先通过线性变换来生成注意力权重。然后,通过 Softmax 函数对这些权重进行归一化处理,确保权重之和为 1,从而能够合理地对局部窗口内的特征进行加权。
-
特征聚合: 在得到注意力权重后,Outlook Attention 会根据这些权重对局部窗口内的特征进行加权平均。这个过程可以有效地将局部窗口内的特征进行聚合,使得每个位置的特征都能够融合局部窗口内其他位置的信息。最后,通过折叠操作将处理后的局部特征重新组合成原始尺寸的特征图,得到最终经过 Outlook Attention 处理的特征。
-
-
结构
-
线性变换(Linear):输入特征图首先经过线性变换层。这一层会将输入特征图的每个局部窗口内的特征进行线性变换,生成尺寸为的中间特征图,其中是局部窗口的大小。
-
重塑(Reshape)和 Softmax: 中间特征图被重塑为的形状,然后通过 Softmax 函数进行归一化处理,得到注意力权重。
-
Outlook 操作: 经过 Softmax 处理后的注意力权重被应用到局部窗口内的特征上,进行加权操作,实现 Outlook 操作。
-
线性展开和加权平均(Linear + Unfold 和 Weighted Average):经过 Outlook 操作后的特征会进行线性展开和加权平均操作,得到尺寸为的特征图。
-
折叠(Fold):最后,通过折叠操作将尺寸为的特征图重新组合成原始尺寸的特征图,完成 Outlook Attention 的处理过程。
-
2. YOLOv11与前景注意力Outlook attention的结合
1. 本文将Outlook attention 与C3K2相结合,提出C3k2_Outlook_attention模块。
3. Outlook attention代码部分
https://github.com/tgf123/YOLOv8_improve/blob/master/YOLOv11.md
视频讲解YOLOv11模型改进讲解,教您如何修改YOLOv11_哔哩哔哩_bilibili
YOLOv11模型改进讲解,教您如何根据自己的数据集选择最优的模块提升精度_哔哩哔哩_bilibili
yolov11全部代码
4. 将前景注意力Outlook attention引入到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。
第二:在task.py中导入C3k2_OutlookAttention包
第三:在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_outlookattention.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
)