YOLOv8改进 | 卷积模块 | 减少冗余计算和内存访问的PConv【CVPR2023】

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


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


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


为了设计快速的神经网络,许多研究专注于减少浮点运算(FLOPs)的数量。然而,减少FLOPs并不总是能相应减少延迟,这是因为运算效率低,即每秒浮点运算数(FLOPS)低。这种低效主要是由于运算符频繁的内存访问,尤其是深度可分离卷积。为了解决这个问题,提出了一个新的部分卷积(PConv),它能更有效地提取空间特征,同时减少冗余的计算和内存访问。基于PConv,进一步提出了FasterNet,这是一个新的神经网络家族,它在各种设备上实现了比其他网络更高的运行速度,同时不会在各种视觉任务上牺牲准确性。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

目录

1. 原理

2. 将PConv添加到YOLOv8代码

2.1 PConv代码实现

2.2 更改init.py文件

2.3 新增yaml文件

2.4 注册模块

2.5 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6. 总结


1. 原理

论文地址:Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks ——点击即可跳转

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

PConv (Partial Convolution) 主要原理

PConv(Partial Convolution)是一种新颖的卷积操作,旨在提高神经网络的计算速度和效率。PConv的设计思路是通过减少冗余计算和内存访问来提升浮点运算速度(FLOPS),从而解决深度卷积(Depthwise Convolution, DWConv)中存在的低FLOPS问题。

主要原理

  1. 冗余利用:PConv 利用特征图中的冗余。特征图的不同通道之间往往存在高度相似性(如图3所示)。PConv 通过仅对部分输入通道应用常规卷积(Regular Convolution),而对其余通道不进行操作,从而减少了计算量和内存访问。

  2. 减少内存访问:DWConv 通常会导致频繁的内存访问,这是导致低FLOPS的主要原因之一。PConv 通过减少对内存的访问,降低了计算延迟。

  3. 高效的空间特征提取:PConv 在保留常规卷积提取空间特征能力的同时,减少了冗余计算。相比于常规卷积,PConv 具有更低的FLOPs,而相比于DWConv/GConv,则具有更高的FLOPS。

设计细节

  • 部分通道卷积:PConv 在输入特征图的部分通道上应用卷积操作,其他通道保持不变。这种方式既减少了计算量,也降低了内存访问的频率。

  • 计算效率优化:通过优化卷积操作的执行,PConv 在减少FLOPs 的同时,能够更好地利用设备的计算能力,从而提高实际运行速度。

应用与性能

基于PConv,作者提出了FasterNet,一种新的神经网络家族,具有较低的延迟和较高的吞吐量。实验结果表明,FasterNet在多种设备上(如GPU、CPU和ARM处理器)都表现出色,能够在不牺牲精度的情况下大幅提高运行速度。

例如,FasterNet-T0在ImageNet-1k上的表现比MobileViT-XXS快2.8倍、3.3倍和2.4倍,同时准确率提高了2.9%。FasterNet-L则在保持与Swin-B相当的准确率(83.5%)的情况下,GPU推理吞吐量提高了36%,CPU计算时间减少了37%。

通过这些优化,PConv和FasterNet展示了在实际应用中提升神经网络计算速度的巨大潜力。

2. 将PConv添加到YOLOv8代码

2.1 PConv代码实现

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

class PConv(nn.Module):
    def __init__(self, dim, ouc, n_div=4, forward='split_cat'):
        super().__init__()
        self.dim_conv3 = dim // n_div
        self.dim_untouched = dim - self.dim_conv3
        self.partial_conv3 = nn.Conv2d(self.dim_conv3, self.dim_conv3, 3, 1, 1, bias=False)
        self.conv = Conv(dim, ouc, k=1)

        if forward == 'slicing':
            self.forward = self.forward_slicing
        elif forward == 'split_cat':
            self.forward = self.forward_split_cat
        else:
            raise NotImplementedError

    def forward_slicing(self, x):
        # only for inference
        x = x.clone()  # !!! Keep the original input intact for the residual connection later
        x[:, :self.dim_conv3, :, :] = self.partial_conv3(x[:, :self.dim_conv3, :, :])
        x = self.conv(x)
        return x

    def forward_split_cat(self, x):
        # for training/inference
        x1, x2 = torch.split(x, [self.dim_conv3, self.dim_untouched], dim=1)
        x1 = self.partial_conv3(x1)
        x = torch.cat((x1, x2), 1)
        x = self.conv(x)
        return x

PConv是一种通过减少计算冗余和内存访问来高效处理图像的技术。下面是 PConv 处理图像的概述:

PConv 的主要流程

部分卷积应用:

  • PConv 仅对部分输入通道而非全部输入通道应用常规卷积。这种选择性方法利用了不同通道间特征图中的冗余。

  • 该过程将第一个或最后一个连续通道视为计算的代表,从而减少了总体计算负荷。

减少计算冗余:

  • 通过仅使用通道子集(表示为总通道中 ( c ) 个通道中的 ( c_p ) 个),与常规卷积相比,PConv 的 FLOP(浮点运算)显著减少。

  • 例如,在典型的部分比率 ( r = \frac{c_p}{c} = \frac{1}{4} ) 下,PConv 的 FLOP 仅为常规卷积的 1/16。

内存访问优化:

  • PConv 还减少了内存访问。所需内存约为 ( h \times w \times 2c_p ),这仅仅是完整卷积所需内存的一小部分。

  • 未卷积的其余通道保持不变,以便在后续层中使用。

与逐点卷积 (PWConv) 结合:

  • 为了利用所有通道的信息,PConv 后面是逐点卷积 (PWConv)。这种组合可确保高效利用整个特征图。

  • PConv 和 PWConv 组合的有效感受野类似于 T 形卷积,与均匀处理整个块的常规卷积相比,它更关注中心区域。

效率论证:

  • 通过使用 Frobenius 范数评估位置重要性来证明 T 形感受野的合理性,这表明中心位置往往更重要。

  • 该方法有效地节省了计算资源并保持了特征信息流的完整性。

总之,PConv 通过部分卷积输入通道并将其与 PWConv 相结合以有效利用整个特征图,从而减少了计算和内存开销。

 

2.2 更改init.py文件

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

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

2.3 新增yaml文件

关键步骤三:在 \ultralytics\ultralytics\cfg\models\v8下新建文件 yolov8_PConv.yaml并将下面代码复制进去

# Ultralytics YOLO 🚀, GPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
 
# Parameters
nc: 1  # 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
  s: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 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, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f, [1024]]  # 21 (P5/32-large)
  - [-1, 1, PConv, [1024]]  # 21 (P5/32-large)
 
  - [[15, 18, 22], 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 注册模块

关键步骤四:在parse_model函数中进行注册,添加PConv,

2.5 执行程序

在train.py中,将model的参数路径设置为yolov8_PConv.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_PConv.yaml')  # build from YAML and transfer weights
 
# Train the model
model.train(batch=16)

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

3. 完整代码分享

https://pan.baidu.com/s/1hDebfGjMj0k0GQUbRnB7HA?pwd=sen6

提取码: sen6 

4. GFLOPs

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

未改进的YOLOv8nGFLOPs

改进后的GFLOPs

5. 进阶

可以与其他的注意力机制或者损失函数等结合,进一步提升检测效果

6. 总结

PConv (Partial Convolution) 是一种优化神经网络计算效率的方法,通过仅对部分输入通道应用卷积操作来减少计算量和内存访问。具体来说,PConv 在特征图的部分通道上进行常规卷积,而保留其他通道不变,从而减少了计算冗余和内存访问频率。随后,通过点卷积(Pointwise Convolution, PWConv)结合这些部分卷积结果,确保所有特征通道的信息得以有效利用。PConv 这种选择性卷积的设计利用了特征图中不同通道之间的冗余性,显著提升了计算效率和速度,同时保持了特征提取的完整性和精度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

某Dota/IM对战平台玩家助手、查看战绩下、胜率等

功能说明 WAR3游戏启动后,可以自动获取游戏双方的玩家列表,然后查询显示玩家的战绩及个人信息。附带查看玩家的战绩详情、最近游戏,查看对手及友方的战绩详情,据此推算出是否开黑、是否小号等信息 使用方法及运行效果 启动 查…

品牌推广怎么样?掌握正确做法,让品牌大放异彩!

品牌推广对于初创公司来说是一项至关重要的任务。在市场众多品牌中,如何脱颖而出,是每个品牌方都要考虑的问题。 作为一名手工酸奶品牌的创始人,目前全国复制了100多家门店,我来分享下,如何推广,可以让品牌…

前端基础--Vue3

Vue3基础 VUE3和VUE2的区别 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece 于 2022 年 2 月 7 日星期一成为新的默认版本! Vue3性能更高,初次渲染快55%, 更新渲染快133% 。体积更小 Vue3.0 打包大小减少41%。 同时Vue3可以更好的支持T…

Python爬虫与数据可视化:构建完整的数据采集与分析流程

Python爬虫技术概述 Python爬虫是一种自动化的数据采集工具,它可以模拟浏览器行为,访问网页并提取所需信息。Python爬虫的实现通常涉及以下几个步骤: 发送网页请求:使用requests库向目标网站发送HTTP请求。获取网页内容&#xf…

多模态大模型面对误导性问题:看懂图片也会答错,一骗就中招

多模态大语言模型(MLLMs)因其在视觉理解和推理方面的突出表现,例如生成详细的图像描述和回答复杂的问题等,逐渐成为近期AI研究的热点。 然而,Bunny 团队的最新研究发现,尽管许多MLLMs对视觉内容能够正确理…

MM-LLM:使用Llava类构建图文多模态大模型实践

多模态大模型的结构如上,llava是用两层MLP作为连接器。该模式也是后续很多工作的基础。 本文主要参考了https://github.com/yuanzhoulvpi2017/zero_nlp/tree/main/train_llava的工作,最初是在b站看到的,讲解的很细致。 基础模型 大语言模型…

夏日编码狂欢:GitCode x DevUI挑战赛,点燃你的创造力

在这个创新驱动的时代,开源技术已成为推动全球软件开发进步的强大引擎,技术的边界正被全球开发者的集体智慧不断拓展。 在这个充满活力的夏日,开源社区迎来了一场全新的活动——由GitCode携手华为云DevUI精心打造的开源共创挑战赛。这不仅是…

【瑞吉外卖 | day01】项目介绍+后台登录退出功能

文章目录 瑞吉外卖 — day011. 所需知识2. 软件开发整体介绍2.1 软件开发流程2.2 角色分工2.3 软件环境 3. 瑞吉外卖项目介绍3.1 项目介绍3.2 产品原型展示3.3 技术选型3.4 功能架构3.5 角色 4. 开发环境搭建4.1 数据库环境搭建4.2 Maven项目构建 5. 后台系统登录功能5.1 创建需…

The Sandbox 通过创作者挑战推动社区参与

游戏开发者并不是每天都有机会让自己的作品赢得大奖。但在 The Sandbox,这已经成为一种趋势!首届 "创作者挑战 "让顶尖创作者将 150 万 SAND 捧回家。现在,我们要带着另一个巨额奖池回来了! 关于首届创作者挑战&#xf…

代理IP的10大误区:区分事实与虚构

在当今的数字时代,代理已成为在线环境不可或缺的一部分。它们的用途广泛,从增强在线隐私到绕过地理限制。然而,尽管代理无处不在,但仍存在许多围绕代理的误解。在本博客中,我们将探讨和消除一些最常见的代理误解&#…

昇思25天学习打卡营第7天|函数式自动微分

函数式自动微分 概念函数与计算图微分函数与梯度计算自定义神经网络梯度计算参考 概念 神经网络的训练主要使用反向传播算法,模型预测值(logits)与正确标签(label)送入损失函数(loss function)…

这几类热销品被Ozon限制销售,ozon还有什么产品好卖?

OZON是俄罗斯最大的B2C电商平台,占据俄罗斯电商市场份额的62%,日均订单量高达37万单,拥有超过1600万的活跃用户。ozon平台对中国卖家招商的产品品类涵盖了多个领域,但近日Ozon官方发布将对这三大类目实行销售限制,一起…

DNS访问百度

DNS,英文全称是 domain name system,域名解析系统,它的作用也很明确,就是域名和 IP 相互映射。 假设你要查询 baidu.com 的 IP 地址: 首先会查找浏览器的缓存,看看是否能找到 baidu.com 对应的IP地址,找到就直接返回&…

【热门会议|见刊快】2024年管理创新与教育国际会议 (ICMIE 2024)

2024年管理创新与教育国际会议 (ICMIE 2024) 2024 International Conference on Management Innovation and Education 【重要信息】 大会地点:洛阳 大会官网:http://www.icicmie.com 投稿邮箱:icicpsssub-conf.com 【注意:稿将稿…

工厂方法模式:概念与应用

目录 工厂方法模式工厂方法模式结构工厂方法适合的应用场景工厂方法模式的优缺点练手题目题目描述输入描述输出描述**提示信息**解题: 工厂方法模式 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例…

苹果电脑废纸篓数据被清空了,有什么方法可以恢复吗?

使用电脑的用户都知道,被删除的文件一般都会经过回收站,想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样,但是“回收站”在mac电脑显示为“废纸篓”。 苹果电脑废纸篓数据被清空了,有什么方法可以恢复吗&am…

页面速度是如何影响SEO的?

搜索引擎使用复杂的算法来衡量您网站的重要方面,以决定是否向您发送流量。 搜索引擎使用您网站的小元素来确定您网站的质量和真实性,然后此操作将转化为您的网页在搜索引擎结果页面 中出现的位置。提高您在 SERP 中的排名的过程称为搜索引擎优化 (SEO)。…

在 Mac 上使用 本地 LLM 文本终结

我们可使用本地大型语言模型,如Mistral、Llama等,来给文本做总结,相比在线的 Kimi ,ChatGPT, 我们不用担心数据泄露,因为整个操作都是在本地电脑完成的。 我们用 ollama 举例 首先安装 ollama https://ol…

从零搭建Prometheus到Grafana告警推送

目录 一、Prometheus源码安装和动态更新配置 二、Prometheus操作面板和常见配置 三、Prometheus常用监控组件exporter配置 3.1 exporter是什么 3.2 有哪些exporter 3.3 exporter怎么用 3.4 实战 node_exporter ​3.5 其它exporter都怎么用 四、Promethus整合新版Sprin…

数据结构常见图算法

深度优先搜索 时间复杂度 领接矩阵表示 O( n2) 领接表表示 O(n+e) 空间复杂度 O(e) DFS与回溯法类似,一条路径走到底后需要返回上一步,搜索第二条路径。在树的遍历中,首先一直访问到最深的节点,然后回溯到它的父节点,遍历另一条路径,直到遍历完所有节点…