Yolo11 引入【FocalModulation】特征金字塔的实现步骤


一、【FocalModulation】特征金字塔概述

在这里插入图片描述

1.1 【FocalModulation】特征金字塔介绍

【FocalModulation】结构简介
以下为【FocalModulation】特征金字塔的核心处理过程和优势:

处理过程
  1. 分层上下文化处理(Hierarchical Contextualization)

    • 输入处理:将输入通过线性变换,进入分层上下文化模块。
    • 分层特征提取:模块分为多个层级(如三层),每一层提取不同尺度、不同抽象层次的信息,类似深度卷积网络逐步提取高阶特征。
    • 效果:这种分层方式可捕获多样化的上下文特征,提升模型对复杂场景的理解能力。
  2. 门控聚合(Gated Aggregation)

    • 特征聚合:各层提取的特征通过门控单元进行融合。
    • 动态权重调整:门控机制根据上下文信息动态调整特征权重,灵活融合不同层次的信息。
    • 优势:增强了模型适应能力,能够根据任务需求选择性依赖不同特征层。
  3. 轻量线性变换(Lightweight Linear Transformation)

    • 优化特征表示:对聚合后的特征进一步压缩或调优。
    • 计算高效:确保最终输出既具有良好的特征表达能力,又能降低计算复杂度。
优势
  • 多层次上下文捕捉
    通过分层提取不同尺度的特征,模型对复杂场景的表达能力更强。

  • 灵活的门控机制
    门控机制动态调整特征融合的权重,使模型适应不同任务的需求。

  • 计算高效
    引入轻量化设计,降低了计算成本,适合实时场景。

  • 全局上下文增强
    捕获全局的上下文信息,使模型在长距离依赖任务(如自然语言处理或图像理解)中表现出色。
    在这里插入图片描述


1.2 【FocalModulation】核心代码实现

以下为【FocalModulation】模块的完整代码:

import torch.nn as nn
import torch

class FocalModulation(nn.Module):
    def __init__(self, dim, focal_window=3, focal_level=2, focal_factor=2, bias=True, proj_drop=0.,
                 use_postln_in_modulation=False, normalize_modulator=False):
        super().__init__()
        self.dim = dim
        self.focal_window = focal_window
        self.focal_level = focal_level
        self.focal_factor = focal_factor
        self.use_postln_in_modulation = use_postln_in_modulation
        self.normalize_modulator = normalize_modulator

        self.f_linear = nn.Conv2d(dim, 2 * dim + (self.focal_level + 1), kernel_size=1, bias=bias)
        self.h = nn.Conv2d(dim, dim, kernel_size=1, stride=1, bias=bias)
        self.act = nn.GELU()
        self.proj = nn.Conv2d(dim, dim, kernel_size=1)
        self.proj_drop = nn.Dropout(proj_drop)

        self.focal_layers = nn.ModuleList()
        self.kernel_sizes = []
        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(),
                )
            )
            self.kernel_sizes.append(kernel_size)
        if self.use_postln_in_modulation:
            self.ln = nn.LayerNorm(dim)

    def forward(self, x):
        """
        Args:
            x: input features with shape of (B, H, W, C)
        """
        C = x.shape[1]

        # pre linear projection
        x = self.f_linear(x).contiguous()
        q, ctx, gates = torch.split(x, (C, C, self.focal_level + 1), 1)

        # context aggregation
        ctx_all = 0.0
        for l in range(self.focal_level):
            ctx = self.focal_layers[l](ctx)
            ctx_all = ctx_all + ctx * gates[:, l:l + 1]
        ctx_global = self.act(ctx.mean(2, keepdim=True).mean(3, keepdim=True))
        ctx_all = ctx_all + ctx_global * gates[:, self.focal_level:]

        # normalize context
        if self.normalize_modulator:
            ctx_all = ctx_all / (self.focal_level + 1)

        # focal modulation
        x_out = q * self.h(ctx_all)
        x_out = x_out.contiguous()
        if self.use_postln_in_modulation:
            x_out = self.ln(x_out)

        # post linear projection
        x_out = self.proj(x_out)
        x_out = self.proj_drop(x_out)
        return x_out

二、添加【FocalModulation】特征金字塔到 Yolo11

在这里插入图片描述

2.1 STEP 1

ultralytics/nn 文件夹中:

  1. 新建一个文件夹或模块(确保带有 __init__.py 文件)。
  2. 创建 FocalModulation.py 文件,并将上述代码粘贴到该文件中。

(此处可插入路径截图)


2.2 STEP 2

__init__.py 中导入 FocalModulation 模块:

from .FocalModulation import FocalModulation

2.3 STEP 3

找到 task.py 文件,在其中导入并新增【FocalModulation】的逻辑。


2.4 STEP 4

定位到 parse_model 函数,在模块解析时添加【FocalModulation】的解析支持。

if module == 'FocalModulation':
    m = FocalModulation(...)

三、yaml 文件配置与运行

3.1 yaml 文件配置

以下是一个支持【FocalModulation】的 yaml 文件示例:

backbone:
  - [-1, 1, Conv, [64, 3, 2]] # P1
  - [-1, 1, Conv, [128, 3, 2]] # P2
  - [-1, 1, FocalModulation, []] # FocalModulation特征金字塔

(根据需求调整模块参数)


3.2 运行结果截图

运行成功后,模型可以完成训练和推理任务。以下为运行成功后的截图:

(此处插入运行成功图片)


总结

通过引入【FocalModulation】特征金字塔,Yolo11 能够有效提升特征提取能力,尤其是对复杂场景、全局上下文信息的捕获能力。同时,其高效设计保证了模型性能的平衡,非常适合实际部署和实时应用。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐