传统注意力机制在处理高维度数据时,长期面临 “维度割裂” 与 “复杂度失控” 两大难题。以图像任务为例,现有通道自注意力(CSA)仅聚焦通道间关联,空间自注意力(SSA)仅关注像素空间交互,二者均将数据的三维信息(如空间宽、高 + 通道 / 光谱)压缩为二维相似矩阵,导致跨维度关联信息丢失 —— 比如无法同时结合像素位置与通道特征区分 “空间相似但属性不同” 的区域。更关键的是,若直接对三维数据建模,传统注意力的计算复杂度会呈立方级增长(与空间尺寸平方、通道数平方正相关),难以适配高分辨率或多通道场景。此外,多数注意力机制缺乏对数据物理特性的适配(如通道间的关联性差异),无法利用数据内在规律提升特征表达,这些缺陷在需深度挖掘跨维度关联的任务中尤为突出,推动了 VolSA 这类三维注意力机制的研发。
1.Volumetric Self-Attention原理
VolSA 的结构围绕 “双分支投影 - 多头融合 - 特征输出” 构建,各模块功能与流程清晰:
输入预处理模块:接收三维输入数据(如 H×W×C 的图像),为空间投影与通道投影分支分别提供适配格式的数据 —— 空间分支保留像素空间结构,通道分支将空间维度展平为一维序列,聚焦通道特征。
双通道投影分支:
1. 通道投影分支:通过 1×1 点卷积与 3×3 深度卷积对输入进行特征变换,生成通道级 Q、K、V;计算 Q 与 K 的点积并归一化,融入位置先验矩阵后经 Softmax 得到通道相似矩阵,再与 V 相乘生成通道关联特征。
2. 空间投影分支:通过线性层将输入转换为像素级 Q、K;计算 Q 与 K 的点积并归一化,经 Softmax 得到空间相似矩阵。
多头融合与输出模块:将通道投影分支的 Q、K、V 拆分为多个 “注意力头”,每个头独立计算通道关联特征,增强对不同子空间特征的捕捉能力;随后将多头特征拼接,与空间相似矩阵进行矩阵乘法,融合空间与通道关联信息;最后通过线性投影输出最终的三维关联特征,传递至后续网络层。

2.Volumetric Self-Attention习作思路
-
在目标检测任务中:VolSA 的优势体现在 “跨维度特征区分” 与 “高效推理” 的结合。传统检测模型的注意力多局限于空间维度,难以区分 “空间外观相似但通道特征不同” 的目标(如外形相近的金属罐与塑料罐),而 VolSA 通过空间 - 通道跨维度关联,能同时利用像素位置信息与通道属性信息,精准捕捉目标的独特特征,减少因特征单一导致的误检与漏检。同时,其二次级复杂度设计能适配高分辨率图像的检测需求,避免因模型计算量过大导致推理速度下降,尤其在多通道或高分辨率检测场景中,能在保证检测精度的同时,维持实时推理能力;此外,位置先验的引入可增强对目标局部细节(如边缘、纹理)的特征提取,提升小目标或遮挡目标的检测准确性。
-
在目标分割任务中:图像分割需实现像素级的精准分类,VolSA 的三维关联建模能力可从两方面提升分割性能。一方面,其空间 - 通道跨维度关联能让每个像素的分类决策同时参考 “空间邻域像素的类别趋势” 与 “通道特征的类别响应”,避免传统分割模型因局部感受野限制导致的 “边缘不连续” 或 “类别混淆” 问题 —— 例如在复杂场景分割中,能通过通道特征区分空间重叠的不同类别区域,提升分割边界的完整性。另一方面,位置先验的引入可让模型自适应利用通道间的关联性差异,强化同类区域的特征一致性(如同一类别的区域在特定通道下的特征响应更相似),减少因通道特征波动导致的分类误差,尤其在需精细区分相似类别(如不同类型的组织、材质)的分割任务中,能显著提升像素分类的准确性。
3. YOLO与Volumetric Self-Attention的结合
将 VolSA 融入 YOLO 模型,可从两方面优化检测性能:一是提升 YOLO 对 “难区分目标” 的检测能力 —— 通过空间 - 通道跨维度关联,YOLO 能捕捉目标的多维度特征,减少因目标与背景空间相似导致的漏检(如小目标、低对比度目标);二是在引入多维度特征的同时,维持 YOLO 的实时推理优势 ——VolSA 的二次级复杂度设计不会大幅增加模型计算量,避免因注意力机制引入导致检测速度下降,兼顾精度与效率。
4.Volumetric Self-Attention代码部分
YOLO12模型改进方法,快速发论文,总有适合你的改进,还不改进上车_哔哩哔哩_bilibili
代码获取:YOLOv8_improve/YOLOV12.md at master · tgf123/YOLOv8_improve · GitHub
5. Volumetric Self-Attention引入到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_VolSelfAttention.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
)
-1
129

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



