改进的Yolo11算法 有效张点创新点 引入FocalModulation特征金字塔实现精度的提高
改进的Yolo11算法 有效张点创新点 引入FocalModulation特征金字塔实现精度的提高
Yolo11 引入【FocalModulation】特征金字塔的实现步骤
一、【FocalModulation】特征金字塔概述

1.1 【FocalModulation】特征金字塔介绍
【FocalModulation】结构简介
以下为【FocalModulation】特征金字塔的核心处理过程和优势:
处理过程:
-
分层上下文化处理(Hierarchical Contextualization)
- 输入处理:将输入通过线性变换,进入分层上下文化模块。
- 分层特征提取:模块分为多个层级(如三层),每一层提取不同尺度、不同抽象层次的信息,类似深度卷积网络逐步提取高阶特征。
- 效果:这种分层方式可捕获多样化的上下文特征,提升模型对复杂场景的理解能力。
-
门控聚合(Gated Aggregation)
- 特征聚合:各层提取的特征通过门控单元进行融合。
- 动态权重调整:门控机制根据上下文信息动态调整特征权重,灵活融合不同层次的信息。
- 优势:增强了模型适应能力,能够根据任务需求选择性依赖不同特征层。
-
轻量线性变换(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 文件夹中:
- 新建一个文件夹或模块(确保带有
__init__.py文件)。 - 创建
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 能够有效提升特征提取能力,尤其是对复杂场景、全局上下文信息的捕获能力。同时,其高效设计保证了模型性能的平衡,非常适合实际部署和实时应用。
更多推荐
所有评论(0)