在计算机视觉领域,Transformer 凭借自注意力(Self-Attention, SA)机制实现了输入依赖的全局交互,在图像分类、目标检测等任务中表现优异。但 SA 存在与视觉 token 数量相关的二次复杂度问题,尤其在高分辨率输入时效率低下。为解决这一问题,研究者们尝试了窗口注意力、混合卷积等改进,但仍未完全摆脱 SA 的计算负担。Focal Modulation 正是在这一背景下提出的 —— 旨在探索一种比 SA 更高效的视觉 token 交互机制,通过重构上下文聚合与交互的顺序,在保持输入依赖特性的同时,显著降低计算成本,实现更优的性能 - 效率权衡。
1.Focal Modulation原理
Focal Modulation 颠覆了 SA “先交互后聚合” 的范式,采用 “先聚合后交互” 的策略。具体而言,SA 需先计算查询与所有目标 token 的注意力分数(交互),再基于分数聚合价值特征(聚合),导致高额计算开销;而 Focal Modulation 首先通过共享算子(如深度卷积)对每个查询位置周围的上下文进行层级聚合(早期聚合),生成不同粒度的总结特征,再通过门控机制将这些特征选择性聚合成 “调制器(modulator)”,最后通过元素级乘法将调制器注入查询 token。这种设计通过共享上下文计算 amortize 开销,且交互仅发生在查询与聚合后的调制器之间,复杂度从二次降至线性,同时保留了输入依赖的 token 交互能力。
Focal Modulation 由三个核心组件构成:
Focal Contextualization:通过堆叠深度卷积层实现,每一层使用不同 kernel 尺寸的深度卷积(如 3×3、5×5、7×7),从短距离到长距离编码视觉上下文,形成多粒度的层级特征(例如,低层级捕捉局部细节,高层级覆盖全局范围)。
Gated Aggregation:通过线性层生成空间和层级感知的门控权重,对层级上下文特征进行加权求和,选择性地将不同范围的上下文聚合成一个调制器(modulator),使模型能根据查询内容自适应聚焦关键上下文(如目标区域侧重局部特征,背景区域侧重全局特征)。
Element-wise Affine Transformation:将查询 token 通过投影函数转换后,与调制器进行元素级乘法,实现上下文信息向查询的注入,增强特征表达能力。
2.Focal Modulation习作思路
Focal Modulation 在目标检测中的优点
Focal Modulation 通过 “先聚合后交互” 的核心逻辑,为目标检测任务带来显著优势。其层级上下文编码(Focal Contextualization)利用多尺度深度卷积,能高效捕捉从局部细节(如目标边缘、纹理)到全局场景(如目标间相对位置)的上下文信息,无需像自注意力那样进行大量 token 间的冗余计算,从而在保证对多尺度目标(从小型物体到大型物体)特征建模能力的同时,大幅降低计算复杂度。门控聚合(Gated Aggregation)机制则能根据查询 token 的特性(如是否属于前景目标)动态选择上下文 —— 目标区域更聚焦于细粒度局部特征以提升定位精度,背景区域更关注全局信息以优化场景理解,这种自适应聚焦减少了无关信息干扰,增强了对遮挡、重叠等复杂场景的检测鲁棒性,同时轻量级设计适配了检测任务对实时性的需求。
Focal Modulation 在分割中的优点
对于分割任务,Focal Modulation 的结构设计使其在像素级精细建模和全局语义一致性上表现突出。层级上下文编码通过堆叠不同感受野的深度卷积,从像素级局部纹理(如物体表面细节)到区域级语义关联(如同类物体的空间分布),为每个像素提供多粒度的上下文支持,克服了传统卷积局部性限制和自注意力高复杂度的问题,满足分割对细粒度特征的需求。门控聚合机制通过空间和层级感知的权重,将不同范围的上下文聚合成调制器,使同类像素(如同一物体的不同部分)能共享一致的语义信息,减少分割结果的碎片化;而元素级调制则将聚合后的上下文精准注入每个像素特征,强化了全局语义一致性,尤其在多类物体交织的复杂场景中,能更准确地区分像素类别,同时高效的计算模式使其适用于高分辨率分割任务,平衡精度与效率。
3. YOLO与Focal Modulation的结合
YOLO 系列模型以实时性为核心优势,Focal Modulation 的线性复杂度(相比 SA 的二次复杂度)可显著降低计算开销,提升推理速度,适配 YOLO 的实时需求;同时,其层级上下文聚合与门控机制能更高效地捕捉多尺度特征(如小目标的局部细节与大目标的全局上下文),增强特征表达能力,有助于提升 YOLO 在复杂场景中的检测精度。
4.Focal Modulation代码部分
YOLO12模型改进方法,快速发论文,总有适合你的改进,还不改进上车_哔哩哔哩_bilibili
代码获取:YOLOv8_improve/YOLOV12.md at master · tgf123/YOLOv8_improve · GitHub
5. Focal Modulation引入到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/shengtuo/tangfan/YOLO11/ultralytics/cfg/models/11/yolo12_focal_modulation_module.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
)