视觉 Transformer 的发展打破了传统卷积网络的局限,但原生自注意力的计算复杂度随输入分辨率呈二次增长,难以应用于高分辨率视觉任务。为平衡性能与效率,基于固定窗口的注意力机制被提出,通过限定注意力计算范围降低开销,成为主流方案。然而,这类人工设计的固定窗口(多为正方形或矩形)具有数据无关性,面对真实场景中尺寸各异、形状不规则、姿态多变的目标时,无法灵活调整覆盖范围,既容易遗漏目标关键区域,也难以捕捉跨窗口的长距离上下文关联,严重制约了模型对复杂目标的特征建模能力,因此亟需一种能自适应目标特性的注意力窗口设计,QA 机制正是在此需求下诞生。


1.quadrangle attention (QA)原理
QA 的核心是将固定窗口升级为数据驱动的可学习四边形,通过端到端训练让模型自主学习适配目标的注意力区域。其核心逻辑是:以预定义的基础窗口为起点,通过专门的回归模块预测包含平移、缩放、旋转、剪切和投影的复合变换矩阵,将基础窗口动态调整为贴合目标形态的四边形。每个注意力头独立执行该变换,无需额外的窗口移位或令牌重组操作,即可自然实现跨窗口信息交互;同时引入相对坐标变换解决不同位置窗口的优化歧义,搭配正则化策略确保四边形覆盖有效特征区域,保障训练稳定性与模型性能。

QA 的结构设计简洁且易于集成,主要包含三个核心模块。首先是基础窗口生成模块,按常规方式划分输入特征图,生成用于注意力计算的查询、键、值令牌;其次是四边形生成模块,由平均池化、LeakyReLU 激活和 1×1 卷积组成,负责输出变换参数并分解为多个基础变换,通过矩阵乘法组合为最终变换矩阵,再基于相对坐标将基础窗口转换为目标四边形;最后是正则化模块,通过惩罚函数约束四边形坐标范围,避免其超出特征图边界导致梯度消失。该结构可直接嵌入平原型或分层型视觉 Transformer,仅需少量代码修改,额外计算成本可忽略不计。
2.quadrangle attention (QA)习作思路
(一)目标检测场景
QA 通过动态学习的四边形区域,能够精准适配不同尺度、姿态和形状的目标,有效避免固定窗口对目标的割裂,完整捕捉目标的全局特征与局部细节。其跨窗口信息交换能力无需依赖复杂的层间设计,即可让模型感知目标与周围环境的关联,提升对遮挡目标、小目标的识别灵敏度,同时灵活的窗口调整机制减少了对目标尺度变化的敏感性,有助于提升检测的定位精度与类别判断准确性。
(二)图像分割场景
分割任务对目标轮廓和细节的捕捉要求极高,QA 的自适应四边形设计可精准贴合目标边缘,针对性提取不同区域的特征,强化对复杂轮廓、细微结构的建模能力。其数据驱动的窗口调整方式能妥善处理目标重叠、嵌套等复杂场景,避免固定窗口导致的特征混淆,让模型更清晰地区分不同目标与背景,同时保持高效的计算效率,在提升分割结果精细度与完整性的同时,不增加过多推理开销。
3. YOLO与quadrangle attention (QA)的结合
QA 能为 YOLO 注入自适应目标形态的能力,使其在面对异形、多尺度目标时无需依赖复杂的多尺度特征融合设计,即可精准捕捉目标特征,提升检测鲁棒性。同时,QA 带来的高效跨窗口信息交换可增强 YOLO 对目标全局上下文的感知,减少局部特征局限导致的漏检、误检问题,在保持 YOLO 原有实时性优势的基础上,进一步提升检测精度。
4.quadrangle attention (QA)代码部分
YOLO11|YOLO12|改进| 四边形注意力机制quadrangle attention,打破固定窗口的局限,精准捕捉异形、多尺度目标特征,提升精度。_哔哩哔哩_bilibili
YOLO12模型改进方法,快速发论文,总有适合你的改进,还不改进上车_哔哩哔哩_bilibili
YOLOv12 论文结构解析:强势来临,超越 YOLOv11!_哔哩哔哩_bilibili
代码获取:YOLOv8_improve/YOLOV12.md at master · tgf123/YOLOv8_improve · GitHub
5. quadrangle attention (QA)引入到YOLOv12中
第一: 先新建一个v12_changemodel,将下面的核心代码复制到下面这个路径当中,如下图如所示。E:\Part_time_job_orders\YOLO_NEW\YOLOv12\ultralytics\v12_changemodel。
第二:在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/tgf/tgf/yolo/model/YOLO12_All/ultralytics/cfg/models/12/yolo12_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 = True
)
3万+

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



