当前位置: 首页 > news >正文

YOLO26改进 - 注意力机制 | ParNet并行子网络:多分支协同优化特征表达,增强模型判别能

前言

本文介绍了ParNet注意力机制及其在YOLO26中的应用。ParNet注意力通过并行子网络结构,将网络层组织成多个子网络并行处理输入特征,降低了传统注意力机制在处理长序列时的计算复杂度。该机制采用VGG风格的块和特征融合策略,具有低深度高性能、参数效率高、可扩展性强和并行化能力好等创新点。我们将ParNet注意力引入YOLO26,在检测头部分应用该机制。通过实验训练改进后的模型,有望提升YOLO26在目标检测任务中的性能。

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

专栏链接: YOLO26改进专栏

文章目录

  • 前言
  • 介绍
    • 摘要
  • 文章链接
  • 基本原理
      • 技术原理
      • 创新点
  • 参考代码
  • YOLO26引入代码
  • tasks.py 注册
    • 步骤1:
    • 步骤2
  • 配置yolo26-ParNetAttention.yaml
  • 实验
    • 脚本
    • 结果

介绍

摘要

深度是深度神经网络的核心特征,然而网络深度的增加往往伴随着顺序计算量的上升和延迟时间的增长。这引发了一个关键性问题:是否能够构建出具有高性能的"非深度"神经网络?本文证实了这一可能性。为实现此目标,我们采用了并行子网络架构而非传统的层级堆叠方式,从而在维持高性能的同时显著降低了网络深度。通过充分利用并行子结构,我们首次展示了深度仅为12的网络能够在ImageNet数据集上实现超过80%的Top-1准确率,在CIFAR10上达到96%的准确率,在CIFAR100上达到81%的准确率。此外,我们还证明了深度为12的骨干网络在MS-COCO数据集上能够实现48%的平均精度(AP)。我们对这一设计的扩展规律进行了深入分析,并阐明了如何在保持网络深度不变的前提下提升性能表现。最后,我们提供了一个概念验证,展示了非深度网络在构建低延迟识别系统方面的应用潜力。相关代码已发布于https://github.com/imankgoyal/NonDeepNetworks。

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

ParNet注意力是一种用于自然语言处理任务的注意力机制,它是由谷歌在2019年提出的。ParNet注意力旨在解决传统注意力机制在处理长序列时的效率问题。

传统的注意力机制在计算注意力权重时,需要对所有输入序列的位置进行逐一计算,这导致了在长序列上的计算复杂度较高。而ParNet注意力通过将序列分割成多个子序列,并对每个子序列进行独立的注意力计算,从而降低了计算复杂度。

技术原理

  1. 并行子网络结构

    • ParNet的核心设计是将网络层以并行的方式组织成多个子网络(或称为流)。每个子网络可以独立处理输入特征,并在后期阶段将这些特征融合。这种设计使得网络能够同时处理不同分辨率和特征的输入,从而提高了计算效率和性能。
  2. VGG风格的块

    • ParNet采用了VGG风格的网络块,这种结构在特征提取方面表现良好。与ResNet风格的块相比,VGG块在训练时更容易收敛,尽管其训练难度相对较高。
  3. 特征融合

    • 在网络的后期阶段,来自不同子网络的特征会被融合,以便进行最终的分类或检测任务。这种特征融合策略使得网络能够综合不同流的信息,从而提高了模型的表现。

创新点

  1. 低深度高性能

    • ParNet展示了在仅有12层深度的情况下,仍然能够在多个基准测试中实现高于80%的准确率。这一发现挑战了传统深度学习的观念,表明深度并不是唯一的性能决定因素。
  2. 参数效率

    • ParNet在参数数量上与当前最先进的深度网络相当,但其深度显著减少。这使得ParNet在计算资源有限的情况下,仍能实现良好的性能。
  3. 可扩展性

    • ParNet的设计允许通过增加宽度、分辨率和分支数量来有效扩展性能,而不需要增加网络的深度。这种特性使得ParNet在处理大规模数据集时具有更好的灵活性。
  4. 并行化能力

    • 由于其并行结构,ParNet能够在多个处理器上高效并行化,尽管存在通信延迟的问题。这为未来的高效识别系统提供了可能性。

参考代码

https://blog.csdn.net/DM_zx/article/details/132381800

importnumpyasnpimporttorchfromtorchimportnnfromtorch.nnimportinitclassParNetAttention(nn.Module):def__init__(self,channel=512):super().__init__()self.sse=nn.Sequential(nn.AdaptiveAvgPool2d(1),nn.Conv2d(channel,channel,kernel_size=1),nn.Sigmoid())self.conv1x1=nn.Sequential(nn.Conv2d(channel,channel,kernel_size=1),nn.BatchNorm2d(channel))self.conv3x3=nn.Sequential(nn.Conv2d(channel,channel,kernel_size=3,padding=1),nn.BatchNorm2d(channel))self.silu=nn.SiLU()defforward(self,x):b,c,_,_=x.size()x1=self.conv1x1(x)x2=self.conv3x3(x)x3=self.sse(x)*x y=self.silu(x1+x2+x3)returnyif__name__=='__main__':input=torch.randn(50,512,7,7)pna=ParNetAttention(channel=512)output=pna(input)print(output.shape)

YOLO26引入代码

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

importtorchfromtorchimportnnfromtorch.nnimportinitclassParNetAttention(nn.Module):def__init__(self,channel=512):super().__init__()self.sse=nn.Sequential(nn.AdaptiveAvgPool2d(1),nn.Conv2d(channel,channel,kernel_size=1),nn.Sigmoid())self.conv1x1=nn.Sequential(nn.Conv2d(channel,channel,kernel_size=1),nn.BatchNorm2d(channel))self.conv3x3=nn.Sequential(nn.Conv2d(channel,channel,kernel_size=3,padding=1),nn.BatchNorm2d(channel))self.silu=nn.SiLU()defforward(self,x):b,c,_,_=x.size()x1=self.conv1x1(x)x2=self.conv3x3(x)x3=self.sse(x)*x y=self.silu(x1+x2+x3)returny

tasks.py 注册

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

步骤1:

fromultralytics.nn.attention.ParNetAttentionimportParNetAttention

步骤2

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

elif m is ParNetAttention: args = [ch[f], *args]

配置yolo26-ParNetAttention.yaml

ultralytics/cfg/models/26/yolo26-ParNetAttention.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,SPPF,[1024,5,3,True]]# 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)# 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,SPPF,[1024,5,3,True]]# 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,ParNetAttention,[]]#17-[-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,ParNetAttention,[]]# 21-[-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)-[-1,1,ParNetAttention,[]]# 25-[[17,21,25],1,Detect,[nc]]# Detect(P3, P4, P5)

# 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 # Parameters nc: 80 # number of classes end2end: True # whether to use end-to-end mode reg_max: 1 # DFL bins scales: # 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 GFLOPs s: [0.50, 0.50, 1024] # summary: 260 layers, 10,009,784 parameters, 10,009,784 gradients, 22.8 GFLOPs m: [0.50, 1.00, 512] # summary: 280 layers, 21,896,248 parameters, 21,896,248 gradients, 75.4 GFLOPs l: [1.00, 1.00, 512] # summary: 392 layers, 26,299,704 parameters, 26,299,704 gradients, 93.8 GFLOPs x: [1.00, 1.50, 512] # summary: 392 layers, 58,993,368 parameters, 58,993,368 gradients, 209.5 GFLOPs # YOLO26n backbone backbone: # [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, ParNetAttention, []] - [-1, 1, SPPF, [1024, 5, 3, True]] # 9 - [-1, 2, C2PSA, [1024]] # 10 # YOLO26n head head: - [-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) - [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)

实验

脚本

importwarnings warnings.filterwarnings('ignore')fromultralyticsimportYOLOif__name__=='__main__':# 修改为自己的配置文件地址model=YOLO('./ultralytics/cfg/models/26/yolo26-ParNetAttention.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-ParNetAttention',)

结果

http://www.jsqmd.com/news/310032/

相关文章:

  • 北大腾讯团队只改一行代码,让AI图像生成效果提升20%!
  • 苏州大学突破:新型注意力机制赋能AI语境适应性对话
  • 腾讯突破:AI实现对话到电影的完整自动化制作
  • 清华大学等多所顶尖院校联手揭秘智能数据准备革命
  • 网络工程师必看:11个协议端口号形象记忆法,看完再也忘不掉(附记忆宫殿地图)
  • Agentic AI的“责任边界”:提示工程架构师必须明确的5个问题
  • 探索H6型PFC源代码实现:意想不到的效果
  • 永磁无刷电机(PMSM)Simulink模型搭建与解析
  • 探索 MATLAB/Simulink 中 1.5MW 并网型双馈风力发电机的魅力
  • 光伏系统遮阴下的MPPT最大功率跟踪:粒子群算法(PSO)的奇妙应用
  • 计算机Java毕设实战-基于AI功能+大数据可视化分析+Spark的买菜推荐系统设计与实现基于spark的买菜推荐系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Java计算机毕设之基于SpringBoot+Spark的买菜推荐系统设计与实现基于spark的买菜推荐系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • Maven 核心
  • 近屿智能发现:年终奖背后的IT赛道秘密
  • 【阵列】低旁瓣稀疏同心环阵列优化Matlab实现
  • 昇腾与Jetson核心疑问解析:结合某高校自研国产盒子的实际场景说明
  • 从理论到代码:实现AI原生应用中的知识抽取
  • SpringBoot配置文件加载顺序:一场配置界的权力游戏
  • 一种电梯高峰归底系统的分层模块化设计方案,包含时间调度层、状态感知层、指令执行层和外部交互层四大核心模块。系统通过时间调度自动切换高峰模式,状态感知层实时监测电梯运行状态,指令执行层实现归底控制逻辑
  • 2026必备!专科生论文神器TOP8:开题报告文献综述全测评
  • 神经网络之感知机(Perceptron)
  • JAVA毕业设计中前后端交互功能的实现方案
  • Optional 空指针优化详解
  • 接口默认方法冲突解决
  • 机器学习基础入门(第六篇):深度学习的兴起与神经网络基础 - 教程
  • Java毕设项目:基于spark的买菜推荐系统设计与实现(源码+文档,讲解、调试运行,定制等)
  • 当AI积分遇上SQLite,我悟了:编程的本质就这八个字
  • 黄宏生“折腾”,创维“换挡”
  • 上市传闻再起,“平头哥”将如何搅动AI芯片市场?
  • 大数据领域Hive的索引机制与性能提升