视觉 Transformer(ViT)凭借对图像补丁间长距离依赖的建模能力,在各类视觉任务中展现出优异性能,但原生自注意力机制的二次计算复杂度,使其难以处理高分辨率图像。为解决这一痛点,基于窗口的注意力机制应运而生,它将图像划分为非重叠的固定尺寸窗口,仅在窗口内进行注意力计算,在保证性能的同时,大幅降低了计算复杂度和内存占用,推动了平原型和分层型视觉 Transformer 在分类、检测、分割等任务中的广泛应用。然而,这种人工设计的窗口存在固有缺陷:窗口形状多为固定的正方形或矩形,与输入数据的特性无关,无法灵活适配真实场景中目标的多样性 —— 现实图像中的目标不仅尺寸差异显著,还可能呈现不规则形状和任意方向,固定窗口既难以完整覆盖异形目标,也可能因窗口边界限制,无法捕捉目标相关的长距离上下文信息,进而制约了模型对复杂目标的特征提取能力和整体性能表现。在此背景下,需要一种数据驱动的注意力窗口设计方案,打破固定窗口的束缚,让注意力区域能够自适应匹配目标的实际形态,QA(四边形注意力)机制由此被提出。


1. quadrangle attention (QA)原理
QA 将固定窗口扩展为可学习的四边形,通过端到端的四边形回归模块预测变换矩阵,对默认窗口进行平移、缩放、旋转、剪切和投影等变换,生成适配目标的四边形区域。基于这些四边形进行令牌采样和注意力计算,每个注意力头独立执行变换,无需窗口移位或令牌置换即可实现跨窗口信息交换,同时通过相对坐标变换和正则化项稳定训练过程。

QA 的核心结构包括基础窗口生成、四边形生成、正则化三个关键部分。基础窗口生成阶段按预定义尺寸划分输入特征图,得到查询、键、值令牌;四边形生成阶段通过平均池化、LeakyReLU 激活和 1×1 卷积组成的预测模块输出变换参数,分解为多个基础变换并组合成最终变换矩阵,基于相对坐标完成窗口到四边形的转换;正则化阶段通过惩罚函数约束四边形覆盖有效区域,避免梯度消失。QA 可无缝集成到平原型和分层型视觉 Transformer 中,仅需少量代码修改。
2. quadrangle attention (QA)习作思路
在目标检测任务中:QA 通过自适应学习四边形的位置、尺寸、方向和形状,能精准覆盖不同尺度和姿态的目标,有效捕捉目标的完整上下文信息,提升对小目标、变形目标的识别能力。同时,跨窗口信息交换能力增强了模型对目标整体特征的建模,减少了固定窗口带来的局部特征局限,有助于提升检测精度和定位准确性。
在目标分割任务中:QA 的灵活四边形设计可适配分割任务中复杂多样的目标轮廓,能针对性提取不同区域的特征,增强对边缘、细节的捕捉能力。其数据驱动的窗口调整机制使模型能更好地处理场景中目标的重叠、嵌套情况,提升分割结果的精细度和完整性,同时保持较低的额外计算成本。
3. YOLO与quadrangle attention (QA)的结合
QA 能让 YOLO 自适应适配不同尺度和形状的目标,提升对小目标和异形目标的检测性能;同时跨窗口信息交换能力可增强 YOLO 对目标全局特征的建模,减少局部窗口带来的特征割裂问题,在保持检测速度优势的前提下进一步提升检测精度。
4.quadrangle attention (QA)代码部分
YOLO11|YOLO12|改进| 四边形注意力机制quadrangle attention,打破固定窗口的局限,精准捕捉异形、多尺度目标特征,提升精度。_哔哩哔哩_bilibili
YOLOv11模型改进讲解,教您如何修改YOLOv11_哔哩哔哩_bilibili
用一篇论文教您如何使用YOLOv11改进模块写一篇1、2区论文_哔哩哔哩_bilibili
YOLOv11模型改进讲解,教您如何根据自己的数据集选择最优的模块提升精度_哔哩哔哩_bilibili
代码获取:YOLOv8_improve/YOLOv11.md at master · tgf123/YOLOv8_improve
5. quadrangle attention (QA)到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行代码
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
import torch
if __name__=="__main__":
# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
model = YOLO("/home/shengtuo/tangfan/YOLO11/ultralytics/cfg/models/11/yolo11_QA.yaml")\
# .load(r'E:\Part_time_job_orders\YOLO\YOLOv11\yolo11n.pt') # build from YAML and transfer weights
results = model.train(data="/home/shengtuo/tangfan/YOLO11/ultralytics/cfg/datasets/VOC_my.yaml",
epochs=300,
imgsz=640,
batch=4,
# cache = False,
# single_cls = False, # 是否是单类别检测
# workers = 0,
# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
amp = False
)
3万+

被折叠的 条评论
为什么被折叠?



