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

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


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


专栏目录 :《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) * xy = 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://xiahunao.cn/news/3227391.html

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

相关文章

[Spring] SpringBoot基本配置与快速上手

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

“LNMP环境搭建实战指南:从零开始配置CentOS 7下的Nginx、MySQL与PHP“

目录 1.前言 2.准备工作 2.1.环境信息 2.2.关闭SELinux和firewalld 3.安装Nginx 3.1.运行以下命令,安装Nginx 3.2.运行以下命令,查看Nginx版本 4.安装MySQL 4.1.更新秘钥 4.2.配置MySQL的YUM仓库 4.3.安装MySQL 4.4.查看MySQL版本 4.5.启动…

Let‘s Encrypt性价比最高的申请SSL证书

SSL/TLS证书作为确保网站数据传输安全性的重要手段,受到了广大网站运营者的青睐。然而,高昂的证书费用往往成为许多小型网站和个人博客的负担。 申请Lets Encrypt免费泛域名SSL证书步骤 1. 登录来此加密网站,输入域名,可以勾选泛…

二分查找算法【折半查找算法】

二分查找算法 二分查找算法,也称为折半查找,是一种在有序数组中查找特定元素的高效算法。它的工作原理是通过不断地将搜索区间减半来缩小目标值可能存在的范围,直至找到目标值或确定目标值不存在于数组中。二分查找的关键在于每次比较都能排…

节点流与处理流:深入解析Java中的IO流

节点流与处理流:深入解析Java中的IO流 1、节点流(Node Stream)1.1 定义1.2 好处1.3 示例 2、处理流(Processing Stream)2.1 定义2.2 好处2.3 创建特征2.4 示例 3、总结 💖The Begin💖点点关注&…

国产大模型第一梯队玩家,为什么pick了CPU?

AI一天,人间一年。 现在不论是大模型本身,亦或是AI应用的更新速度简直令人直呼跟不上—— Sora、Suno、Udio、Luma……重磅应用一个接一个问世。 也正如来自InfoQ的调查数据显示的那般,虽然AIGC目前还处于起步阶段,但市场规模已…

Java方法入门(006)

♦️方法的概念 什么是方法? 方法是将一组完成特定功能的代码整合在一起,以达到简化开发,减少代码耦合,提高代码复用性的结构,类似与C语言中的函数。方法是程序中最小的执行单元,可降低代码的重复性。 如用…

前后端如何实现非对称加解密-使用RSA为例讲解!

写在最前面,RSA是一种非对称加密算法,使用不同的公钥和私钥进行加密和解密。 下面是使用RSA进行加密和解密的代码示例: 前端:使用CryptoJS进行RSA加密 在前端JavaScript中,使用jsencrypt库来进行RSA加密&#xff1a…

MT3046 愤怒的象棚

思路: a[]存愤怒值;b[i]存以i结尾的,窗口里的最大值;c[i]存以i结尾的,窗口里面包含✳的最大值。 (✳为新大象的位置) 例:1 2 3 4 ✳ 5 6 7 8 9 则ans的计算公式b3b4c4c5c6b7b8b9…

从0开始的STM32HAL库学习1

基础外设初始化配置步骤 本学习以stm32f103c8t6为主控芯片学习。配合DMK-Keil使用,因为cubeide我还没找到很好的教程,而且用了几次发现不会用,所以还是先学习hal库,等hal库学习完之后再用学习使用cubeide,两者使用应该…

16. Revit API: Family、FamilySymbol、FamilyInstance

前言 前面写着一直絮絮叨叨,感觉不好。想找些表情包来,写得好玩点,但找不到合适的,或者说耗时费力又不满意,而自个儿又做不来表情包,就算了。 其次呢,之前会把部分类成员给抄表列出来&#xf…

短视频矩阵系统多账号搭建技术源码(saas开发者技术独立搭建)

在构建云服务环境以部署虚拟机方面,以Amazon Web Services(AWS)为示例,需采购并配置适当数量的EC2实例以及相关网络设施。 接下来,根据业务需求,应创建多个社交媒体平台如抖音和快手的官方账户,…

基于springboot+mybatis学生管理系统

基于springbootmybatis学生管理系统 简介: 题目虽然是学生管理系统,但功能包含(学生,教师,管理员),项目基于springboot2.1.x实现的管理系统。 编译环境 : jdk 1.8 mysql 5.5 tomcat 7 框架 : springboot…

Postman使用教程【项目实战】

目录 引言软件下载及安装项目开发流程1. 创建项目2. 创建集合(理解为:功能模块)3. 设置环境变量,4. 创建请求5. 测试脚本6. 响应分析7. 共享与协作 结语 引言 Postman 是一款功能强大的 API 开发工具,它可以帮助开发者测试、开发和调试 API。…

org.springframework.boot.autoconfigure.EnableAutoConfiguration=XXXXX的作用是什么?

org.springframework.boot.autoconfigure.EnableAutoConfigurationXXXXXXX 这一配置项在 Spring Boot 项目中的作用如下: 自动配置类的指定: 这一配置将 EnableAutoConfiguration 设置为 cn.geek.javadatamanage.config.DataManageAutoConfiguration&…

解决Invalid or unsupported by client SCRAM mechanisms(dbeaver)

在用工具(dbeaver)链接Opengauss数据库的时候,报出标题的错误。原因为驱动不正确。 驱动下载地址:https://opengauss.org/zh/download/ 下载完的包 ,解压后,里面应该有两个jar 包,使用postgresql.jar dbe…

什么是CAP理论及应用场景,为什么只能进行3选2

在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewers theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 1、 一致性(C…

计算机网络之广域网

广域网特点: 主要提供面向通信的服务,支持用户使用计算机进行远距离的信息交换。 覆盖范围广,通信的距离远,需要考虑的因素增多, 线路的冗余、媒体带宽的利用和差错处理问题。 由电信部门或公司负责组建、管理和维护,并向全社会…

拟合衰减振动模型,估算阻尼比和阻尼系数

拟合衰减振动模型,估算阻尼比和阻尼系数 flyfish 衰减振动模型 在自由振动系统中,阻尼振动可以用以下公式描述: x ( t ) x 0 e − ζ ω n t cos ⁡ ( ω d t ϕ ) x(t) x_0 e^{-\zeta \omega_n t} \cos(\omega_d t \phi) x(t)x0​e−…

一天搞定软件测试基础!——包含Web测试、App测试

以下👇是2024新版黑马程序员软件测试零基础入门到精通全套视频教程的所有笔记! 有一些缺点,就是我是在7月份的时候进行该课程学习的,所以网课老师准备的一些网盘资源都已经失去连接了,所以我无法在我的电脑里进行测试&…