YOLOv9改进策略:卷积魔改 | 分布移位卷积(DSConv),提高卷积层的内存效率和速度

  💡💡💡本文改进内容: YOLOv9如何魔改卷积进一步提升检测精度?提出了一种卷积的变体,称为DSConv(分布偏移卷积),其可以容易地替换进标准神经网络体系结构并且实现较低的存储器使用和较高的计算速度。 DSConv将传统的卷积内核分解为两个组件:可变量化内核(VQK)和分布偏移

yolov9-c-DSConv summary: 962 layers, 50999590 parameters, 50999558 gradients, 234.7 GFLOPs

 改进结构图如下:

YOLOv9魔术师专栏

☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️

包含注意力机制魔改、卷积魔改、检测头创新、损失&IOU优化、block优化&多层特征融合、 轻量级网络设计、24年最新顶会改进思路、原创自研paper级创新等

☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️

✨✨✨ 新开专栏暂定免费限时开放,后续每月调价一次✨✨✨

🚀🚀🚀 本项目持续更新 | 更新完结保底≥50+ ,冲刺100+🚀🚀🚀

🍉🍉🍉 联系WX: AI_CV_0624 欢迎交流!🍉🍉🍉

YOLOv9魔改:注意力机制、检测头、blcok魔改、自研原创等

 YOLOv9魔术师

💡💡💡全网独家首发创新(原创),适合paper !!!

💡💡💡 2024年计算机视觉顶会创新点适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,轻松带你上手魔改网络 !!!

💡💡💡重点:通过本专栏的阅读,后续你也可以设计魔改网络,在网络不同位置(Backbone、head、detect、loss等)进行魔改,实现创新!!!

 1.YOLOv9原理介绍

论文: 2402.13616.pdf (arxiv.org)

代码:GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information摘要: 如今的深度学习方法重点关注如何设计最合适的目标函数,从而使得模型的预测结果能够最接近真实情况。同时,必须设计一个适当的架构,可以帮助获取足够的信息进行预测。然而,现有方法忽略了一个事实,即当输入数据经过逐层特征提取和空间变换时,大量信息将会丢失。因此,YOLOv9 深入研究了数据通过深度网络传输时数据丢失的重要问题,即信息瓶颈和可逆函数。作者提出了可编程梯度信息(programmable gradient information,PGI)的概念,来应对深度网络实现多个目标所需要的各种变化。PGI 可以为目标任务计算目标函数提供完整的输入信息,从而获得可靠的梯度信息来更新网络权值。此外,研究者基于梯度路径规划设计了一种新的轻量级网络架构,即通用高效层聚合网络(Generalized Efficient Layer Aggregation Network,GELAN)。该架构证实了 PGI 可以在轻量级模型上取得优异的结果。研究者在基于 MS COCO 数据集的目标检测任务上验证所提出的 GELAN 和 PGI。结果表明,与其他 SOTA 方法相比,GELAN 仅使用传统卷积算子即可实现更好的参数利用率。对于 PGI 而言,它的适用性很强,可用于从轻型到大型的各种模型。我们可以用它来获取完整的信息,从而使从头开始训练的模型能够比使用大型数据集预训练的 SOTA 模型获得更好的结果。对比结果如图1所示。

 YOLOv9框架图

1.1 YOLOv9框架介绍

YOLOv9各个模型介绍

2.DSConv介绍

论文: https://arxiv.org/pdf/1901.01928v1.pdf

 摘要:提出了一种卷积的变体,称为DSConv(分布偏移卷积),其可以容易地替换进标准神经网络体系结构并且实现较低的存储器使用和较高的计算速度。 DSConv将传统的卷积内核分解为两个组件:可变量化内核(VQK)和分布偏移。 通过在VQK中仅存储整数值来实现较低的存储器使用和较高的速度,同时通过应用基于内核和基于通道的分布偏移来保持与原始卷积相同的输出。 我们在ResNet50和34以及AlexNet和MobileNet上对ImageNet数据集测试了DSConv。 我们通过将浮点运算替换为整数运算,在卷积内核中实现了高达14x的内存使用量减少,并将运算速度提高了10倍。 此外,与其他量化方法不同,我们的工作允许对新任务和数据集进行一定程度的再训练。

 

        DSConv是一种深度可分离卷积(Depthwise Separable Convolution)的变体,它在计算机视觉领域被广泛使用。深度可分离卷积是一种轻量级卷积,它将标准卷积拆分为两个步骤:深度卷积和逐点卷积。深度卷积只在单个通道上进行卷积,并在每个通道上应用一个独立的卷积核。逐点卷积在所有通道上应用一个卷积核,以组合深度卷积的结果。DSConv相比于深度可分离卷积的优势在于它使用了一个可学习的卷积核来进一步提高模型的表现。

 

    

3.DSConv加入到YOLOv9

3.1新建py文件,路径为models/Conv/DSConv.py

###################### DSConv  ####     start   by  AI&CV  ###############################
import torch
import torch.nn.functional as F
from torch.nn.modules.conv import _ConvNd
from torch.nn.modules.utils import _pair
import mathfrom models.common import Conv,autopadclass DSConv(_ConvNd):  #https://arxiv.org/pdf/1901.01928v1.pdfdef __init__(self, in_channels, out_channels, kernel_size, stride=1,padding=None, dilation=1, groups=1, padding_mode='zeros', bias=False, block_size=32, KDSBias=False, CDS=False):padding = _pair(autopad(kernel_size, padding, dilation))kernel_size = _pair(kernel_size)stride = _pair(stride)dilation = _pair(dilation)blck_numb = math.ceil(((in_channels)/(block_size*groups)))super(DSConv, self).__init__(in_channels, out_channels, kernel_size, stride, padding, dilation,False, _pair(0), groups, bias, padding_mode)# KDS weight From Paperself.intweight = torch.Tensor(out_channels, in_channels, *kernel_size)self.alpha = torch.Tensor(out_channels, blck_numb, *kernel_size)# KDS bias From Paperself.KDSBias = KDSBiasself.CDS = CDSif KDSBias:self.KDSb = torch.Tensor(out_channels, blck_numb, *kernel_size)if CDS:self.CDSw = torch.Tensor(out_channels)self.CDSb = torch.Tensor(out_channels)self.reset_parameters()def get_weight_res(self):# Include expansion of alpha and multiplication with weights to include in the convolution layer herealpha_res = torch.zeros(self.weight.shape).to(self.alpha.device)# Include KDSBiasif self.KDSBias:KDSBias_res = torch.zeros(self.weight.shape).to(self.alpha.device)# Handy definitions:nmb_blocks = self.alpha.shape[1]total_depth = self.weight.shape[1]bs = total_depth//nmb_blocksllb = total_depth-(nmb_blocks-1)*bs# Casting the Alpha values as same tensor shape as weightfor i in range(nmb_blocks):length_blk = llb if i==nmb_blocks-1 else bsshp = self.alpha.shape # Notice this is the same shape for the bias as wellto_repeat=self.alpha[:, i, ...].view(shp[0],1,shp[2],shp[3]).clone()repeated = to_repeat.expand(shp[0], length_blk, shp[2], shp[3]).clone()alpha_res[:, i*bs:(i*bs+length_blk), ...] = repeated.clone()if self.KDSBias:to_repeat = self.KDSb[:, i, ...].view(shp[0], 1, shp[2], shp[3]).clone()repeated = to_repeat.expand(shp[0], length_blk, shp[2], shp[3]).clone()KDSBias_res[:, i*bs:(i*bs+length_blk), ...] = repeated.clone()if self.CDS:to_repeat = self.CDSw.view(-1, 1, 1, 1)repeated = to_repeat.expand_as(self.weight)print(repeated.shape)# Element-wise multiplication of alpha and weightweight_res = torch.mul(alpha_res, self.weight)if self.KDSBias:weight_res = torch.add(weight_res, KDSBias_res)return weight_resdef forward(self, input):# Get resulting weight#weight_res = self.get_weight_res()# Returning convolutionreturn F.conv2d(input, self.weight, self.bias,self.stride, self.padding, self.dilation,self.groups)class DSConv2D(Conv):def __init__(self, inc, ouc, k=1, s=1, p=None, g=1, d=1, act=True):super().__init__(inc, ouc, k, s, p, g, d, act)self.conv = DSConv(inc, ouc, k, s, p, g, d)###################### DSConv  ####     END   by  AI&CV  ###############################

3.2修改yolo.py

1)首先进行引用

from models.Conv.DSConv import DSConv2D

2)修改def parse_model(d, ch):  # model_dict, input_channels(3)

在源码基础上加入DSConv2D

        n = n_ = max(round(n * gd), 1) if n > 1 else n  # depth gainif m in {Conv, AConv, ConvTranspose, Bottleneck, SPP, SPPF, DWConv, BottleneckCSP, nn.ConvTranspose2d, DWConvTranspose2d, SPPCSPC, ADown,RepNCSPELAN4, SPPELAN,DSConv2D}:c1, c2 = ch[f], args[0]if c2 != no:  # if not outputc2 = make_divisible(c2 * gw, 8)args = [c1, c2, *args[1:]]

3.3 yolov9-c-DSConv.yaml

# YOLOv9# parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
#activation: nn.LeakyReLU(0.1)
#activation: nn.ReLU()# anchors
anchors: 3# YOLOv9 backbone
backbone:[[-1, 1, Silence, []],  # conv down[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2# conv down[-1, 1, Conv, [128, 3, 2]],  # 2-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 3# avg-conv down[-1, 1, ADown, [256]],  # 4-P3/8# elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 5# avg-conv down[-1, 1, ADown, [512]],  # 6-P4/16# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 7# avg-conv down[-1, 1, ADown, [512]],  # 8-P5/32# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 9]# YOLOv9 head
head:[# elan-spp block[-1, 1, SPPELAN, [512, 256]],  # 10# up-concat merge[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 7], 1, Concat, [1]],  # cat backbone P4# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 13# up-concat merge[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 5], 1, Concat, [1]],  # cat backbone P3# elan-2 block[-1, 1, RepNCSPELAN4, [256, 256, 128, 1]],  # 16 (P3/8-small)# avg-conv-down merge[-1, 1, ADown, [256]],[[-1, 13], 1, Concat, [1]],  # cat head P4# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 19 (P4/16-medium)# avg-conv-down merge[-1, 1, ADown, [512]],[[-1, 10], 1, Concat, [1]],  # cat head P5# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 22 (P5/32-large)# multi-level reversible auxiliary branch# routing[5, 1, CBLinear, [[256]]], # 23[7, 1, CBLinear, [[256, 512]]], # 24[9, 1, CBLinear, [[256, 512, 512]]], # 25# conv down[0, 1, DSConv2D, [64, 3, 2]],  # 26-P1/2# conv down[-1, 1, DSConv2D, [128, 3, 2]],  # 27-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 28# avg-conv down fuse[-1, 1, ADown, [256]],  # 29-P3/8[[23, 24, 25, -1], 1, CBFuse, [[0, 0, 0]]], # 30  # elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 31# avg-conv down fuse[-1, 1, ADown, [512]],  # 32-P4/16[[24, 25, -1], 1, CBFuse, [[1, 1]]], # 33 # elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 34# avg-conv down fuse[-1, 1, ADown, [512]],  # 35-P5/32[[25, -1], 1, CBFuse, [[2]]], # 36# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 37# detection head# detect[[31, 34, 37, 16, 19, 22], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)]

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

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

相关文章

针对BSV区块链新推出的网络访问规则NAR和警报系统AS的解释与问答

​​发表时间:2024年2月22日 BSV区块链社区团队最近开设了一个Twitter(X)话题空间,讨论BSV区块链协会最新推出的网络访问规则和警报系统的相关问题。 本次讨论由BSV区块链社区负责人Brett Banfe主持,以便社区成员更好…

vivado 物理优化约束、交互式物理优化

物理优化约束 Vivado Design Suite在物理优化过程中尊重DONT_TOUCH特性。它不在具有这些属性的网络或小区上执行物理优化。要加快网络选择过程中,具有DONT_TOUCH属性的网络经过预过滤,不被考虑用于物理优化。此外,还遵守Pblock分配&#xff…

母亲的奶牛(bfs)

农夫约翰有三个容量分别为 A , B , C A,B,C A,B,C 升的挤奶桶。 最开始桶 A A A 和桶 B B B 都是空的,而桶 C C C 里装满了牛奶。 有时,约翰会将牛奶从一个桶倒到另一个桶中,直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。 这一过…

Linux常用命令之搜索查找类

1.1find查找文件或目录 1)基本语法 find [搜索范围] [ 选项] find -name:按照名字查找 find -user:按用户相关查找 find -size:按照文件大小查找 1.2locate快速定位文件路径 经验技巧:由于locate指令基于数据库进行…

HP Pavilion Laptop 15-eg2xxx原厂Win11系统预装oem系统包

惠普星15青春版笔记本原装出厂Windows11系统镜像下载,恢复出厂开箱状态 链接:https://pan.baidu.com/s/1f4hjwWX0CMDykb_8YXSf-w?pwd0aja 提取码:0aja 适用型号: 15-eg0010TU、15-eg0011TU、15-eg0008TX、15-eg0009TX 15-eg…

金属表面缺陷检测设备通常采用计算机视觉技术和机器学习算法

金属表面缺陷检测是在金属制造过程中非常重要的质量控制步骤。它涉及检测金属表面可能存在的各种缺陷,如裂纹、气泡、凹坑、氧化、斑点等。这些缺陷可能会影响金属制品的性能和质量,因此需要及早发现并进行处理。 目前,金属表面缺陷检测通常采…

从零开始写 Docker(六)---实现 mydocker run -v 支持数据卷挂载

本文为从零开始写 Docker 系列第六篇,实现类似 docker -v 的功能,通过挂载数据卷将容器中部分数据持久化到宿主机。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识: …

PriorityQueue集合源码分析

PriorityQueue集合源码分析 文章目录 PriorityQueue集合源码分析前置知识一、字段分析二、构造函数分析三、方法分析四、总结 PriorityQueue 优先级队列,是基于堆的结构来构建的。而堆是基于完全二叉树来实现的,而二叉树除了可以用节点来实现也可以用数组…

elementary OS7 (Ubuntu 22.04)中word文档转化成pdf格式文档

elementary OS7 Ubuntu 22.04中word文档转化成pdf格式 背景目标操作 背景 收到一个word文档,让调整一下排版后转换一下格式,转换成pdf格式,这要是在windows系统下,office可以直接另存为pdf文档,在linux系统下没有offi…

基于Springboot的船运物流管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的船运物流管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

简单对已有云服务器进行linux环境搭建以及共享服务器

前言: 外壳程序:Xshell7 云服务器:华为云 服务器操作系统:centos7 1.云服务的设置(这里购买的华为云,阿里腾讯都可以) 区域尽量选择距离所处地距离自己最近的区域。镜像这里选择的为centos7.…

考研失败, 学点Java打小工_Day3_卫语句_循环

1 编码规范——卫语句 表达异常分支时&#xff0c;少用if-else方式。   比如成绩判断中对于非法输入的处理&#xff1a; /*>90 <100 优秀>80 <90 良好>70 <80 一般>60 <70 及格<60 不及格*/Testpu…

企业培训考试系统数字化解决方案优势有哪些?

企业员工内部培训考试系统&#xff0c;用数字技术和互联网平台&#xff0c;为企业提供高效、便捷、个性化的员工培训服务的解决方案。 企业员工培训考试数字化解决方案不仅能够提供更加高效、灵活和互动的学习体验&#xff0c;还能够帮助企业实现长期的人才发展战略&#xff0…

Windows 基本操作快捷键

Windows 基本操作快捷键 1. Windows 7 专业版2. Keyboard shortcuts in WindowsReferences 1. Windows 7 专业版 2. Keyboard shortcuts in Windows Win 键是键盘上图标像窗户键。 快速切换窗口 Alt Tab 快速移到网页末 Ctrl End 快速移到网页首 Ctrl Home 锁屏 Wi…

蓝牙耳机连上电脑后播放音频一卡一卡的还有声音变形,电脑连接后总是容易断开蓝牙

蓝牙耳机连上电脑后播放音频一卡一卡的还有声音变形&#xff0c;电脑连接后总是容易断开蓝牙 问题描述问题排查可能6可能7电脑蓝牙驱动问题 结语&#xff1a; 问题描述 蓝牙耳机连上电脑后播放音频一卡一卡的还有声音变形&#xff0c;电脑连接后总是容易断开蓝牙。 关键之前我…

大数据面试题 —— Kafka

目录 消息队列 / Kafka 的好处消息队列的两种模式什么是 KafkaKafka 优缺点你在哪些场景下会选择 Kafka讲下 Kafka 的整体结构Kafka 工作原理 / 流程Kafka为什么那么快/高效读写的原因 / 实现高吞吐的原理生产者如何提高吞吐量&#xff08;调优&#xff09;kafka 消息数据积压&…

什么是组态软件?Web组态软件又是什么?

从事相关工作的对“组态软件”应该都不陌生&#xff0c;那Web组态软件又是什么呢?本文将对Web组态可视化软件&#xff08;下称“Web组态软件”&#xff09;做简单介绍&#xff0c;可视化编辑器是Web组态软件中的一个重要功能模块。除了编辑器&#xff0c;还有哪些功能模块?又…

15届蓝桥杯第二期模拟赛所有题目解析

文章目录 &#x1f9e1;&#x1f9e1;t1_求余&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t2_灌水&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t3_字符显示&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t4_区间最大和…

yum安装mysql、数据库tab自动补全

一 centos7上面没有mysql&#xff0c;它的数据库名字叫做mariadb &#xff08;自带 5.7版本&#xff09; 一 centos7 安装mariadb [rootlocalhost ~]#yum install mariadb-server -y [rootlocalhost ~]#systemctl start mariadb.service [rootlocalhost ~]#systemctl stop f…

linux之权限管理和组

一&#xff0c;ACL权限 1.1&#xff0c;什么是acl权限&#xff1f; ACL是Access Control List的缩写&#xff0c;即访问控制列表。可以通过下列的实例来理解ACL的作用&#xff1a; 思考如何实现如下的权限控制&#xff1a; 每个项目成员在有一个自己的项目目录&#xff0c;…