YOLO26改进 - SPPF模块 | 替代SPPF,FFocal Modulation焦点调制:即插即用轻量设计优化全局语义捕获

前言

本文介绍了焦点调制网络(FocalNets)及其在YOLO26中的结合应用。FocalNets完全用焦点调制模块替代自注意力,该模块由焦点上下文化、门控聚合和逐元素仿射变换组成,能有效建模视觉中的标记交互。它通过局部特征聚焦、全局信息调制和多尺度处理增强模型表达能力。我们将FocalModulation模块集成进YOLO26。

文章目录: YOLO26改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总

专栏链接: YOLO26改进专栏

文章目录

  • 前言
  • 介绍
    • 摘要
  • 文章链接
  • 基本原理
      • 具体实现
  • 核心代码
  • YOLO26引入代码
  • 注册
    • 步骤1:
    • 步骤2
  • 配置yolo26-FocalModulation.yaml
  • 实验
    • 脚本
    • 结果

介绍

摘要

本研究提出焦点调制网络(FocalNets),该网络采用焦点调制模块完全替代自注意力(SA)机制,用于视觉任务中的标记交互建模。焦点调制模块由三个核心组件构成:(i)焦点上下文化组件,通过深度卷积层序列实现从短距离到长距离的视觉上下文编码;(ii)门控聚合组件,选择性将上下文信息聚合至每个查询标记的调制器中;(iii)逐元素仿射变换组件,将调制器注入查询标记。大量实验验证表明,FocalNets展现出卓越的可解释性特征,并在图像分类、目标检测及分割任务中以相近计算成本超越了当前最先进的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个百分点,多尺度测试下同样表现优异(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)来整合多尺度信息。

核心代码

classFocalModulation(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卷积层,输入和输出通道数均为dimself.h=nn.Conv2d(dim,dim,kernel_size=1,stride=1,padding=0,groups=1,bias=True)# GELU激活函数self.act=nn.GELU()# 线性层,输入和输出维度均为dimself.proj=nn.Linear(dim,dim)# Dropout层,使用给定的丢弃比率self.proj_drop=nn.Dropout(proj_drop)# 存储焦点层的列表self.focal_layers=nn.ModuleList()ifself.use_postln:# 如果使用后调制层归一化,定义层归一化层self.ln=nn.LayerNorm(dim)# 构建每个焦点层forkinrange(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(),))defforward(self,x):""" 前向传播函数 Args: x: 形状为(B, H, W, C)的输入特征 """B,nH,nW,C=x.shape# 通过线性层f,得到形状为(B, H, W, 2*C + 焦点层级数+1)的张量x=self.f(x)# 将通道维度移动到第二维,并转换为连续内存布局x=x.permute(0,3,1,2).contiguous()# 将张量x拆分为查询q、上下文ctx和门控信号gatesq,ctx,gates=torch.split(x,(C,C,self.focal_level+1),1)ctx_all=0# 处理每个焦点层级forlinrange(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:]# 查询q与处理后的上下文相乘x_out=q*self.h(ctx_all)# 将通道维度移动到最后,并转换为连续内存布局x_out=x_out.permute(0,2,3,1).contiguous()# 如果使用后调制层归一化,应用层归一化ifself.use_postln:x_out=self.ln(x_out)# 通过线性层和Dropout层x_out=self.proj(x_out)x_out=self.proj_drop(x_out)returnx_out

YOLO26引入代码

在根目录下的ultralytics/nn/目录,新建一个otherModules目录,然后新建一个以FocalModulation为文件名的py文件, 把代码拷贝进去。

importtorchimporttorch.nnasnnclassFocalModulation(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=[]forkinrange(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)ifself.use_postln_in_modulation:self.ln=nn.LayerNorm(dim)defforward(self,x):""" Args: x: input features with shape of (B, H, W, C) """C=x.shape[1]# pre linear projectionx=self.f_linear(x).contiguous()q,ctx,gates=torch.split(x,(C,C,self.focal_level+1),1)# context aggreationctx_all=0.0forlinrange(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 contextifself.normalize_modulator:ctx_all=ctx_all/(self.focal_level+1)# focal modulationx_out=q*self.h(ctx_all)x_out=x_out.contiguous()ifself.use_postln_in_modulation:x_out=self.ln(x_out)# post linear porjectionx_out=self.proj(x_out)x_out=self.proj_drop(x_out)returnx_out

注册

ultralytics/nn/tasks.py中进行如下操作:

步骤1:

fromultralytics.nn.otherModules.FocalModulationimportFocalModulation

步骤2

修改def parse_model(d, ch, verbose=True):

elifmin{FocalModulation}:args=[ch[f],*args]

配置yolo26-FocalModulation.yaml

ultralytics/cfg/models/26/yolo26-FocalModulation.yaml

# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license# Ultralytics YOLO26 object detection model with P3/8 - P5/32 outputs# Model docs: https://docs.ultralytics.com/models/yolo26# Task docs: https://docs.ultralytics.com/tasks/detect# Parametersnc:80# number of classesend2end:True# whether to use end-to-end modereg_max:1# DFL binsscales:# model compound scaling constants, i.e. 'model=yolo26n.yaml' will call yolo26.yaml with scale 'n'# [depth, width, max_channels]n:[0.50,0.25,1024]# summary: 260 layers, 2,572,280 parameters, 2,572,280 gradients, 6.1 GFLOPss:[0.50,0.50,1024]# summary: 260 layers, 10,009,784 parameters, 10,009,784 gradients, 22.8 GFLOPsm:[0.50,1.00,512]# summary: 280 layers, 21,896,248 parameters, 21,896,248 gradients, 75.4 GFLOPsl:[1.00,1.00,512]# summary: 392 layers, 26,299,704 parameters, 26,299,704 gradients, 93.8 GFLOPsx:[1.00,1.50,512]# summary: 392 layers, 58,993,368 parameters, 58,993,368 gradients, 209.5 GFLOPs# YOLO26n backbonebackbone:# [from, repeats, module, args]-[-1,1,Conv,[64,3,2]]# 0-P1/2-[-1,1,Conv,[128,3,2]]# 1-P2/4-[-1,2,C3k2,[256,False,0.25]]-[-1,1,Conv,[256,3,2]]# 3-P3/8-[-1,2,C3k2,[512,False,0.25]]-[-1,1,Conv,[512,3,2]]# 5-P4/16-[-1,2,C3k2,[512,True]]-[-1,1,Conv,[1024,3,2]]# 7-P5/32-[-1,2,C3k2,[1024,True]]-[-1,1,FocalModulation,[]]# 9-[-1,2,C2PSA,[1024]]# 10# YOLO26n headhead:-[-1,1,nn.Upsample,[None,2,"nearest"]]-[[-1,6],1,Concat,[1]]# cat backbone P4-[-1,2,C3k2,[512,True]]# 13-[-1,1,nn.Upsample,[None,2,"nearest"]]-[[-1,4],1,Concat,[1]]# cat backbone P3-[-1,2,C3k2,[256,True]]# 16 (P3/8-small)-[-1,1,Conv,[256,3,2]]-[[-1,13],1,Concat,[1]]# cat head P4-[-1,2,C3k2,[512,True]]# 19 (P4/16-medium)-[-1,1,Conv,[512,3,2]]-[[-1,10],1,Concat,[1]]# cat head P5-[-1,1,C3k2,[1024,True,0.5,True]]# 22 (P5/32-large)-[[16,19,22],1,Detect,[nc]]# Detect(P3, P4, P5)

实验

脚本

importwarnings warnings.filterwarnings('ignore')fromultralyticsimportYOLOif__name__=='__main__':# 修改为自己的配置文件地址model=YOLO('./ultralytics/cfg/models/26/yolo26-FocalModulation.yaml')# 修改为自己的数据集地址model.train(data='./ultralytics/cfg/datasets/coco8.yaml',cache=False,imgsz=640,epochs=10,single_cls=False,# 是否是单类别检测batch=8,close_mosaic=10,workers=0,optimizer='MuSGD',# optimizer='SGD',amp=False,project='runs/train',name='yolo26-FocalModulation',)

结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1211252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型微调技术详解:从LoRA到P-Tuning v2,一文掌握高效微调方法

文章详解7种大模型微调技术,包括LoRA、QLoRA、适配器调整等参数高效微调(PEFT)方法。这些技术通过冻结主干参数,引入少量可训练参数,显著降低微调时的显存和计算需求,使资源有限环境下也能高效微调大模型。同时提供从零基础到进阶…

用通俗的方式介绍大语言模型训练过程,非常详细收藏我这一篇就够了

站在大语言模型外部看需要准备些什么样的训练数据,分什么阶段,怎样去训练大语言模型,把大语言模型看成一个黑盒。 LLM都是如何训练出来的呢? GPT的训练分为以下3个阶段: 1、预训练Pretrain 2、监督微调SFT (Supervised…

程序员收藏!AI产品经理转型与大模型学习全攻略,抢占AI时代先机,传统PM如何快速转型成AI产品经理?

文章详细介绍了人工智能时代产品经理的转型路径,包括AI基础知识学习、思维模式转变、算法边界熟悉和工作流程规划,强调抢走饭碗的不是AI本身,而是会利用AI的人。文章还提供了系统学习大模型(LLM)的资源包,帮助程序员建立AI认知体系…

大模型训练全攻略:从监督学习到数据预处理的完整指南

文章系统介绍大模型训练的五种学习方法:有监督学习(基于标注数据)、无监督学习(基于数据内在结构)、自监督学习(自动构造伪标签)、半监督学习(少量标注大量未标注数据)和…

字节序及IP地址转换

文章目录字节序检测主机字节序字节序转换函数函数原型示例IP地址字符串与二进制转换传统转换函数(IPv4专用)现代转换函数(支持IPv4/IPv6)线程安全的转换字节序 定义:多字节数据在内存中存储或网络传输时各字节的顺序两…

LeetCode 134. 加油站(O(n)时间+O(1)空间最优解)

✨ 本文针对 LeetCode 中等难度题目 134. 加油站,提供一种时间复杂度 O(n)、空间复杂度 O(1) 的最优解法,结合具体思路推导和代码实现,帮你快速吃透这道题。一、题目描述在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i…

【计算机毕业设计案例】基于Springboot的幼儿园综合管理系统基于springboot的幼儿园管理系统基于SpringBoot+Vue的幼儿园管理系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

提示工程架构设计实战:旅游行业智能推荐提示系统架构设计全流程

提示工程架构设计实战:旅游行业智能推荐提示系统架构设计全流程 一、标题选项 《提示工程落地指南:旅游行业智能推荐系统架构设计全流程》《从0到1:旅游行业智能推荐提示系统架构实战解析》《旅游推荐智能化:基于提示工程的系统…

【计算机毕业设计案例】基于Java的养老院管理系统的设计与实现基于springboot的养老院管理系统的设计与实现(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

深度学习篇---初看transformer

核心比喻:一个超级强大的“翻译官” 想象一下,你要把一段中文翻译成英文。一个传统的“翻译官”(老式模型)会这样做: 从左到右,一个字一个字地看,看完前面再猜后面。 像个记性不太好的人&…

固高控制板卡驱动安装教程

固高控制板卡驱动安装教程

基于大数据的图书推荐系统的设计与实现-计算机毕业设计源码+LW文档

基于大数据的图书推荐系统的设计与实现 摘要:本文详细阐述了基于大数据的图书推荐系统的研究背景意义、需求分析以及功能设计。该系统旨在解决信息过载下读者选书难和图书销售效率低的问题,通过大数据技术实现精准推荐。需求分析涵盖用户、商家等多方面需…

学术研究的第一步不再困难,AI工具助你轻松优化开题报告模板内容

AI开题报告工具对比速览 工具名称 核心功能 生成速度 适用场景 独特优势 AIbiye 全流程论文辅助 3-5分钟 从开题到定稿 深度学术逻辑构建 AIcheck 精准开题生成 2-3分钟 快速产出初稿 国内院校模板库 AskPaper 文献综述辅助 实时响应 研究现状分析 海量文献…

想要高效完成学术写作?这份AI辅助的开题报告模板是你的最佳选择

AI开题报告工具对比速览 工具名称 核心功能 生成速度 适用场景 独特优势 AIbiye 全流程论文辅助 3-5分钟 从开题到定稿 深度学术逻辑构建 AIcheck 精准开题生成 2-3分钟 快速产出初稿 国内院校模板库 AskPaper 文献综述辅助 实时响应 研究现状分析 海量文献…

Java毕设选题推荐:基于springboot的幼儿园管理系统基于springboot的实验幼儿园信息管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

区间并查集|树状数组

lc3245 lc3244 区间并查集 _并边 i set.find(i 1)) set.merge(i, q[1]-1); 这步实现跳跃 class UFS { public: vector<int> fa; int size; UFS(int n) { fa.resize(n); iota(fa.begin(), fa.end(), 0); size n; }…

计算机Java毕设实战-基于springboot的幼儿园管理系统基于Springboot的幼儿园综合管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【课程设计/毕业设计】基于springboot+vue的实验幼儿园信息管理系统基于springboot的幼儿园管理系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java计算机毕设之基于SpringBoot+Vue的幼儿园管理系统基于springboot的幼儿园管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Expo+React Native实现鉴权

一、引入相关依赖 npm i @reduxjs/toolkit react-redux expo-secure-store axios依赖 作用@reduxjs/toolkit 简化 Redux 开发的官方工具包,提供标准化的 Redux 最佳实践react-redux 连接 React 组件和 Redux Store 的…