YOLO12 改进、魔改|幅度感知线性注意力MALA,提升小目标、遮挡的检测能力
Transformer 中的 Softmax Attention 虽具备强大的全局建模能力,但对 token 数量 N 的复杂度为 O (N²),在视觉任务中因计算成本过高难以广泛应用。Linear Attention 通过重构 Q、K、V 的计算顺序,将复杂度降至线性 O (N),但性能显著下降。核心原因在于:Linear Attention 完全忽略了 Query(或 φ(Q))的幅度信息,导致其注意力分布不随 Query 幅度变化,始终保持平滑;而 Softmax Attention 的注意力分布会随 Query 幅度增加变得更集中,更利于捕捉关键信息。这种差异使得 Linear Attention 在局部感知和特征区分上表现较弱。为弥合这一差距,MALA(Magnitude-Aware Linear Attention)被提出,旨在让 Linear Attention 整合 Query 幅度信息,同时保持线性复杂度和高效性。
1.MALA原理
MALA 的核心原理是通过数学设计将 Query 的幅度信息融入 Linear Attention 的计算中,使注意力分布随 Query 幅度的变化趋势接近 Softmax Attention,但更平衡。
原 Linear Attention 中,Query 的幅度被公式中的分子分母抵消(φ(Qi) 的模长在计算中约去),导致注意力分布仅由方向决定,与幅度无关;
Softmax Attention 中,Query 幅度增大时,注意力会更集中于原本得分较高的 Key,形成 “尖峰” 分布,利于突出关键信息,但可能过度聚焦局部;
MALA 通过引入缩放因子 β和偏移项 γ,采用加法归一化替代除法归一化,使 Query 幅度直接影响注意力计算:当 Query 幅度增大时,注意力分布会像 Softmax 一样向高得分 Key 集中,但集中速度更平缓,避免过度尖锐,最终形成 “平衡且兼具全局与局部感知” 的分布。
2. MALA习作思路
MALA 在目标检测中的优点
MALA 的注意力分布既避免了 Softmax Attention 过度聚焦局部导致的目标间关系割裂,又克服了 Linear Attention 过于平滑导致的关键目标特征模糊。在目标检测中,这种平衡特性使其能同时捕捉小目标的细节特征与大目标的全局上下文,精准区分重叠或遮挡目标;同时,线性复杂度使其能高效处理图像中大量的候选目标 token,在保证检测精度的同时提升推理速度,尤其适合复杂场景下的多目标检测任务。
MALA 在分割中的优点
分割任务对像素级的空间关系建模要求极高,MALA 通过平衡的注意力分布,既能聚焦局部区域的精细纹理(如边界像素),又能关联全局的语义上下文(如类别一致性),有效缓解了 Softmax Attention 对局部过度聚焦导致的分割碎片化,以及 Linear Attention 平滑分布导致的类别混淆。此外,其线性复杂度使其能高效处理高分辨率分割图像中的海量像素 token,在保证细节分割精度的同时维持高效计算,尤其适合语义分割和实例分割中对边界与小区域的精准划分。
3. YOLO与MALA的结合
YOLO 系列模型以实时性为核心优势,MALA 的线性复杂度可显著降低注意力计算的成本,提升推理速度,适配 YOLO 对实时性的需求;同时,其平衡的注意力分布能增强模型对多尺度目标(从微小目标到大型目标)的特征捕捉能力,在不牺牲速度的前提下提升检测精度,实现 “高效性与准确性的双重优化”。
4. MALA代码部分
YOLO11|YOLO12|改进| 幅度感知线性注意力MALA, 提高遮挡、小目标检测能力_哔哩哔哩_bilibili
YOLO12模型改进方法,快速发论文,总有适合你的改进,还不改进上车_哔哩哔哩_bilibili
代码获取:YOLOv8_improve/YOLOV12.md at master · tgf123/YOLOv8_improve · GitHub
5. MALA引入到YOLOv12中
第一: 先新建一个v12_changemodel,将下面的核心代码复制到下面这个路径当中,如下图如所示。E:\Part_time_job_orders\YOLO_NEW\YOLOv12\ultralytics\v12_changemodel。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV12.YAMY文件中
第五:运行代码
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorldif __name__=="__main__":# 使用自己的YOLOv12.yamy文件搭建模型并加载预训练权重训练模型model = YOLO("/home/shengtuo/tangfan/YOLO12/ultralytics/cfg/models/12/yolo12_MALA.yaml")# .load(r'E:\Part_time_job_orders\YOLO_NEW\YOLOv12\yolo12n.pt') # build from YAML and transfer weightsresults = model.train(data="/home/shengtuo/tangfan/YOLO12/ultralytics/cfg/datasets/fire_smoke.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)