YOLOv8改进 | 注意力机制| 利用并行子网络构建深度较浅但性能卓越的网络【全网独家】

news2024/9/19 11:05:58

秋招面试专栏推荐深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转


💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡


专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有50+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进——点击即可跳转


深度是深度神经网络的特征。但更多的深度意味着更多的顺序计算和更高的延迟。这就引出了一个问题——能否构建高性能的“非深度”神经网络?我们展示了这是可能的。为此,我们使用并行子网络,而不是一层接一层地堆叠。这有助于有效减少深度,同时保持高性能。通过利用并行子结构,我们首次展示了一个深度仅为12的网络。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后方便大家一键运行小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

专栏地址YOLOv8改进——更新各种有效涨点方法——点击即可跳转

目录

1. 原理

2. 将ParNetAttention添加到YOLOv8中

2.1 ParNetAttention代码实现

2.2 更改init.py文件

2.3 添加yaml文件

2.4 在task.py中进行注册

2.5 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6. 总结


1. 原理

论文地址:NON-DEEP NETWORKS——点击即可跳转

官方代码:官方代码仓库——点击即可跳转

ParNetAttention的主要原理在于其独特的并行子网络结构。下面是一些关键点:

  1. 非深度设计:ParNet(Parallel Networks)通过使用并行子网络代替传统的逐层堆叠结构,显著减少了网络的深度。典型的ParNet只有12层,但在ImageNet、CIFAR10和CIFAR100等竞争性基准上表现出色。

  2. 并行子网络:在ParNet中,层级不是顺序连接的,而是并行排列的。这种设计允许减少网络深度,同时保持高准确性。并行子网络之间没有连接,只有在开始和结束时才进行连接。

  3. 效率与性能:由于并行子结构,ParNet可以有效地在多个处理器之间并行化,超越了传统的深度网络(如ResNet)的速度和准确性。尽管引入了处理单元之间的通信延迟,但ParNet仍能实现高效的并行处理。

  4. 扩展性:ParNet可以通过增加宽度、分辨率和分支数量来有效扩展,同时保持深度恒定。实验表明,ParNet的性能不会饱和,随着计算量的增加,可以实现更高的性能。

  5. SSE模块:ParNet块由三个并行分支组成:1×1卷积、3×3卷积和Skip-Squeeze-and-Excitation (SSE)模块。训练完成后,1×1和3×3卷积可以融合在一起,以实现更快的推理。SSE分支增加了感受野,同时不影响深度。

总之,ParNet通过并行子网络设计,实现了在保持较低深度的同时,依然具有竞争力的性能和高效的计算能力。

2. 将ParNetAttention添加到YOLOv8中

2.1 ParNetAttention代码实现

关键步骤一: 将下面代码粘贴到在/ultralytics/ultralytics/nn/modules/block.py中,并在该文件的__all__中添加“ParNetAttention”

class ParNetAttention(nn.Module):

    def __init__(self, channel=1024, out_channel=1024):
        super().__init__()
        self.sse = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(channel, out_channel, kernel_size=1),
            nn.Sigmoid())
        self.conv1x1 = nn.Sequential(
            nn.Conv2d(channel, out_channel, kernel_size=1),
            nn.BatchNorm2d(out_channel))
        self.conv3x3 = nn.Sequential(
            nn.Conv2d(channel, out_channel, kernel_size=3, padding=1),
            nn.BatchNorm2d(out_channel))
        self.silu = nn.SiLU()

    def forward(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)
        return y

ParNet处理图片的主要流程涉及多个并行子结构,每个子结构都有不同的卷积和特征提取模块。以下是其处理图片的主要步骤:

  1. 输入图像:输入图像首先经过初始的卷积层,用于基本的特征提取和降采样。

  2. 并行子网络结构

    • 并行分支:图像特征被送入多个并行的分支,每个分支包含不同的卷积操作。主要的分支包括1×1卷积、3×3卷积和Skip-Squeeze-and-Excitation (SSE)模块。

    • 1×1卷积:这一分支主要用于减少特征维度和线性组合特征。

    • 3×3卷积:这一分支用于提取更复杂的特征,并增加感受野。

    • Skip-Squeeze-and-Excitation (SSE)模块:这一分支通过通道注意机制提升特征表示能力。

  3. 特征融合

    • 并行分支的输出在最后进行融合。融合方式可以是简单的加和操作或其他复杂的融合策略,以集成不同分支提取到的特征。

  4. 全局池化与全连接层

    • 融合后的特征图经过全局平均池化,减少特征图的尺寸,并生成固定长度的特征向量。

    • 全局池化后的特征向量被送入全连接层,用于最终的分类或回归任务。

  5. 输出

    • 最终的全连接层输出分类结果或其他任务的结果(如检测、分割等)。

通过上述流程,ParNet能够在保持较低深度的同时,实现高效的特征提取和高准确性的图像处理。其核心在于并行子网络结构,这使得网络能够在多个处理器之间并行执行,提高计算效率并减少延迟。

2.2 更改init.py文件

关键步骤二:修改modules文件夹下的__init__.py文件,先导入函数

然后在下面的__all__中声明函数

2.3 添加yaml文件

关键步骤三:在/ultralytics/ultralytics/cfg/models/v8下面新建文件yolov8_PA.yaml文件,粘贴下面的内容

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [ 0.33, 0.25, 1024 ]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs

# YOLOv8.0n 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, 3, C2f, [ 128, True ] ]
  - [ -1, 1, Conv, [ 256, 3, 2 ] ]  # 3-P3/8
  - [ -1, 6, C2f, [ 256, True ] ]
  - [ -1, 1, Conv, [ 512, 3, 2 ] ]  # 5-P4/16
  - [ -1, 6, C2f, [ 512, True ] ]
  - [ -1, 1, Conv, [ 1024, 3, 2 ] ]  # 7-P5/32
  - [ -1, 3, C2f, [ 1024, True ] ]
  - [ -1, 1, SPPF, [ 1024, 5 ] ]  # 9

# YOLOv8.0n head
head:
  - [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ]
  - [ [ -1, 6 ], 1, Concat, [ 1 ] ]  # cat backbone P4
  - [ -1, 3, C2f, [ 512 ] ]  # 12

  - [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ]
  - [ [ -1, 4 ], 1, Concat, [ 1 ] ]  # cat backbone P3
  - [ -1, 3, C2f, [ 256 ] ]  # 15 (P3/8-small)

  - [ -1, 1, Conv, [ 256, 3, 2 ] ]
  - [ [ -1, 12 ], 1, Concat, [ 1 ] ]  # cat head P4
  - [ -1, 3, C2f, [ 512 ] ]  # 18 (P4/16-medium)
  - [ -1, 1, ParNetAttention, [ 512 ] ]

  - [ -1, 1, Conv, [ 512, 3, 2 ] ]
  - [ [ -1, 9 ], 1, Concat, [ 1 ] ]  # cat head P5
  - [ -1, 3, C2f, [ 1024 ] ]  # 21 (P5/32-large)
  - [ -1, 1, ParNetAttention, [ 1024 ] ]   # ParNetAttention https://arxiv.org/abs/2110.07641

  - [ [ 15, 19, 23 ], 1, Detect, [ nc ] ]  # Detect(P3, P4, P5)

温馨提示:因为本文只是对yolov8基础上添加模块,如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。


# YOLOv8n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
max_channels: 1024 # max_channels
 
# YOLOv8s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
max_channels: 1024 # max_channels
 
# YOLOv8l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
max_channels: 512 # max_channels
 
# YOLOv8m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple
max_channels: 768 # max_channels
 
# YOLOv8x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple
max_channels: 512 # max_channels

2.4 在task.py中进行注册

关键步骤四:在task.py的parse_model函数中进行注册,

2.5 执行程序

关键步骤五:在ultralytics文件中新建train.py,将model的参数路径设置为yolov8_PA.yaml的路径即可

from ultralytics import YOLO
 
# Load a model
# model = YOLO('yolov8n.yaml')  # build a new model from YAML
# model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)
 
model = YOLO(r'/projects/ultralytics/ultralytics/cfg/models/v8/yolov8_PA.yaml')  # build from YAML and transfer weights
 
# Train the model
model.train(batch=16)

  🚀运行程序,如果出现下面的内容则说明添加成功🚀

3. 完整代码分享

https://pan.baidu.com/s/1I7VfQa6NRgAAgSO_vwGG3g?pwd=ugu5

提取码:ugu5  

4. GFLOPs

关于GFLOPs的计算方式可以查看百面算法工程师 | 卷积基础知识——Convolution

未改进的YOLOv8nGFLOPs

img

改进后的GFLOPs

5. 进阶

可以结合损失函数或者卷积模块进行多重改进

6. 总结

ParNetAttention的主要原理是通过引入并行子网络结构来替代传统深度网络的逐层堆叠设计,以显著减少网络深度并提升计算效率。具体来说,ParNetAttention在处理图像时,将输入特征图分配到多个并行分支,这些分支分别进行1×1卷积、3×3卷积和Skip-Squeeze-and-Excitation (SSE)模块处理。通过这种并行计算方式,网络能够有效提取多样化的特征,并在最后融合这些特征以生成最终的输出。这个并行结构不仅加快了计算速度,还通过有效的特征融合提升了模型的表现,同时允许在宽度和分支数量上进行扩展,保持较低深度的同时实现高效、精确的图像处理。

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

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

相关文章

jdevelope安装

准备 1.jdk1.8(已经安装不做记录) 2.下载jdevelope安装包 3.安装包安装jdevelope开发工具 4.创建或导入项目 下载jdevelope安装包 官网下载地址:https://edelivery.oracle.com 安装包安装jdevelope开发工具 cmd管理员权限运行安装脚本…

新质生产力赛道核心解读,机械制造何以“向智向新”

机械行业,国民经济的坚实基石与核心驱动力,为各行各业提供高效生产工具。立于产业链的中游,向上游紧密连接着高精尖的核心零部件制造商与基础原材料供应商;向下游,则广泛渗透并深刻影响着基础设施建设、交通运输&#…

7.11日学习打卡----初学Redis(六)

7.11日学习打卡 目录: 7.11日学习打卡一. redis事务事务的概念与ACID特性Redis事务三大特性Redis事务执行的三个阶段Redis事务基本操作 二. redis集群主从复制主从复制环境搭建主从复制原理剖析 哨兵监控哨兵监控环境搭建哨兵工作原理剖析 故障转移Cluster模式Clust…

如何用脉购CRM健康档案管理系统显著提升用户粘性与忠诚度

如何用脉购CRM健康档案管理系统显著提升用户粘性与忠诚度 脉购CRM健康档案管理系统以其创新的健康管理理念和先进的技术手段,为医疗机构和用户之间建立了一座高效的沟通桥梁。通过该系统,用户的健康档案得到了全面而细致的管理,不仅提高了医…

Node多版本管理器NVM安装使用

背景 有的时候开发前端项目需要用到不同版本的nodejs环境,此时就是需要有一个版本管理工具可以灵活的切换node版本,方便维护不同的开发环境 node版本管理工具 nvm工具介绍 安装node很方便,只需要一条命令可以轻松切换node版本可以多版本n…

MyBatis框架学习笔记(三):MyBatis重要文件详解:配置文件与映射文件

1 mybatis-config.xml-配置文件详解 1.1 说明 (1)mybatis 的核心配置文件(mybatis-config.xml),比如配置 jdbc 连接信息,注册 mapper 等等都是在这个文件中进行配置,我们需要对这个配置文件有详细的了解 (2&#x…

4.感知机

感知机 ​ 给定输入 x x x&#xff0c;权重 w w w&#xff0c;和偏移 b b b,感知机输出&#xff1a; KaTeX parse error: Unknown column alignment: o at position 16: \begin{array} o̲ \sigma(<w,x>… 或者是二分类&#xff1a;-1或1 Expected node of symbol gro…

全网最适合入门的面向对象编程教程:14 类和对象的 Python 实现-类的静态方法和类方法,你分得清吗?

全网最适合入门的面向对象编程教程&#xff1a;14 类和对象的 Python 实现-类的静态方法和类方法&#xff0c;你分得清吗&#xff1f; 摘要&#xff1a; 本文主要介绍了Python中类和对象中的类方法和静态方法&#xff0c;以及类方法和静态方法的定义、特点、应用场景和使用方…

机器学习(五) -- 监督学习(7) --SVM2

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;7&#xff09; --SVM1 下篇&#xff1a; 前言 tips&#xff1a;标题前有“***”的内容为补充内容&#xff0c;是给好奇心重的宝宝看的&#xff0c;可自行跳过。文章内容被“文…

Spring支持人工智能应用框架-SpringAi

简介 人工智能技术和日益成熟&#xff0c;开发企业级人工智能的应用已成为一个热门的趋势。Spring AI 是一个用于 AI 工程的应用框架&#xff0c;目的是为了简化AI应用的对接、部署、维护和扩展。 SpringAi的灵感来自LangChain和LlamaIndex&#xff0c;但是SpringAi并不是直接…

RK3568平台(显示篇)主屏副屏配置

一.主屏副屏配置 目前在RK3568平台上有两路HDMIOUT输出&#xff0c;分别输出到两个屏幕上&#xff0c;一路配置为主屏&#xff0c;一路配置为副屏。 硬件原理图&#xff1a; &hdmi0_in_vp2 {status "okay"; };&hdmi1_in_vp0 {status "okay"; }…

断电的固态硬盘数据能放多久?

近日收到一个网友的提问&#xff0c;在这里粗浅表达一下见解&#xff1a; “网传固态硬盘断电后数据只能放一年&#xff0c;一年之后就会损坏。但是我有一个固态硬盘已经放了五六年了&#xff08;上次通电还是在2018年左右&#xff0c;我读初中的时候&#xff09;&#xff0c;…

css实现渐进中嵌套渐进的方法

这是我们想要的实现效果&#xff1a; 思路&#xff1a; 1.有一个底色的背景渐变 2.需要几个小的块级元素做绝对定位通过渐变filter模糊来实现 注意&#xff1a;这里的采用的定位方法&#xff0c;所以在内部的元素一律要使用绝对定位&#xff0c;否则会出现层级的问题&…

HCIP.ppp协议(点到点)认证阶段

ppp协议 ppp是点到点的协议 1.兼容性很好 2.可以进行认证和授权 3.可移植性强 三个阶段 1.链路协商阶段 LCP协商------去协商ppp链路会话 2.认证&#xff08;可选&#xff09; 3.NCP协商------网络层协商阶段&#xff08;根据网络层的不同NCP协议就会存在一个对应的NC…

【电子通识】无源元件与有源元件的定义和区别是什么?

当提到构成电路的电子器件时,许多人可能会想到晶体管、电容器、电感器和电阻器等器件。一般情况下,我们使用的电子器件分为两大类,即“有源元件”和“无源元件”。 有源元件是主动影响(如放大、整流、转换等)所供给电能的元件。 无源元件是对所供给的电能执行被动…

代码随想录算法训练营Day62|冗余连接、冗余连接II

冗余连接 108. 冗余连接 (kamacoder.com) 考虑使用并查集&#xff0c;逐次将s、t加入并查集中&#xff0c;当发现并查集中find(u)和find(v)相同时&#xff0c;输出u和v&#xff0c;表示删除的边即可。 #include <iostream> #include <vector> using namespace s…

Android高级——Logger日志系统

Logger日志系统 Logger日志系统是基于内核中的Logger日志驱动程序实现将日志记录保存在内核空间中使用一个环形缓冲区来保存日志&#xff0c;满了之后&#xff0c;新的日志就会覆盖旧的日志 日志类型 main&#xff0c;记录应用程序级别system&#xff0c;记录系统级别radio&…

7月11日学习打卡,数据结构栈

大家好呀&#xff0c;本博客目的在于记录暑假学习打卡&#xff0c;后续会整理成一个专栏&#xff0c;主要打算在暑假学习完数据结构&#xff0c;因此会发一些相关的数据结构实现的博客和一些刷的题&#xff0c;个人学习使用&#xff0c;也希望大家多多支持&#xff0c;有不足之…

光伏电站逆变器选型方法

前言&#xff1a;光伏逆变器是光伏发电系统两大主要部件之一&#xff0c;光伏逆变器的核心任务是跟踪光伏阵列的最大输出功率&#xff0c;并将其能量以最小的变换损耗、最佳的电能质量馈入电网。由于逆变器是串联在光伏方阵和电网之间&#xff0c;逆变器的选择将成为光伏电站能…

SAP 物料批量执行MD02代码分享

通常我们在运行MRP的时候要么就是跑MD01整个工厂层级的,要么就是单个物料层级的MRP用MD02去单个物料去执行。 HANA后有了MRPLIVE,可以支持多物料的运行MRP,但是无法控制MRP的运行参数,根据采购类型跑出对应的单据,F跑出的采购申请,E跑出的是计划订单。 需求是要可以批量运…