在低分辨率图像分割等实际计算机视觉任务中,传统模型面临双重挑战:一方面,以 U-Net 为代表的编码器 - 解码器架构虽能通过多尺度设计提取局部细节,但受限于固定感受野,难以捕捉多目标共存场景中的长距离依赖关系,易在复杂场景中产生分类模糊问题;另一方面,Transformer 类模型虽依托自注意力机制实现全局上下文建模,却因自注意力的二次复杂度带来高昂的计算与内存开销,且缺乏 CNN 的局部性归纳偏置,难以精准识别小目标或重叠物体的细粒度细节,无法适配嵌入式设备或实时系统等资源受限场景。为解决 “局部特征精准提取”“全局上下文捕捉” 与 “计算效率” 三者间的矛盾,Mask Attention 机制被提出,其核心目标是通过选择性关注图像关键区域,在降低计算成本的同时,提升模型对复杂场景的适配能力,尤其针对低分辨率输入场景的性能优化。
1.Mask Attention原理
Mask Attention 的结构围绕 “精准注意力分配” 与 “特征信息保留” 设计,主要包含两个个核心模块:
多头掩码自注意力模块:将输入特征映射为多组独立的 Q、K、V 向量,每组向量均结合掩码矩阵计算注意力权重,随后对多组注意力输出进行拼接融合 —— 该设计能让模型从不同尺度关注图像特征,提升对复杂场景的适应能力;
残差连接机制:引入残差连接,有效缓解深度训练中的梯度消失问题,同时完整保留原始特征的局部细节信息;

2.Mask Attention习作思路
-
在目标检测任务中:Mask Attention 能通过掩码矩阵主动过滤图像中的背景噪声与冗余信息,让模型将计算资源集中于目标区域,显著提升小目标、密集目标的定位精度;同时,其对长距离依赖的高效捕捉能力,可帮助模型理解目标间的空间关联(如遮挡关系、相对位置),减少因目标重叠或场景复杂导致的漏检、误检问题;此外,相较于全量自注意力,其定向关注机制大幅降低计算开销,能适配检测任务对实时性的要求,平衡检测精度与推理速度。
-
在目标分割任务中:Mask Attention 可针对不同语义类别或实例生成专属掩码,精准区分物体边界与复杂纹理区域,有效解决低分辨率输入下的区域混淆问题,提升分割结果的精细度;同时,其结合残差连接的设计,能在整合全局上下文信息(如场景整体结构)的同时,不丢失局部细节(如小目标边缘),确保模型既能处理大范围场景分割,又能精准分割细小物体;此外,较低的计算复杂度使其可部署于资源受限设备,拓宽分割模型在机器人视觉、无人机巡检等实际场景的应用范围。
3. YOLO与Mask Attention的结合
将 Mask Attention 集成至 YOLO 模型,一方面可借助掩码的背景抑制能力,弥补 YOLO 在小目标、密集目标检测中的精度短板,同时不削弱 YOLO 原有的快速推理优势;另一方面,其对目标间空间关联的建模能力,能帮助 YOLO 更好地处理遮挡场景,减少因目标重叠导致的检测误差,进一步增强 YOLO 在复杂城市道路、拥挤人群等场景下的检测鲁棒性。
4.Mask Attention代码部分
YOLO11|YOLO12|改进| 掩码注意力Mask Attention,选择性强化图像关键区域特征、抑制无关背景信息,提高遮挡、小目标的检测能力_哔哩哔哩_bilibili
YOLO12模型改进方法,快速发论文,总有适合你的改进,还不改进上车_哔哩哔哩_bilibili
代码获取:YOLOv8_improve/YOLOV12.md at master · tgf123/YOLOv8_improve · GitHub
5. Mask 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_Mask_Attention.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
)
3854

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



