[卷积神经网络]YoloV9

一、概述

         代码路径为:

YoloV9icon-default.png?t=N7T8https://github.com/WongKinYiu/yolov9 

        YoloV9的作者在论文中指出:现在的深度学习方法大多都在寻找一个合适的目标函数,但实际上输入数据在进行特征提取和空间变换的时候会丢失大量信息。针对这个问题,本文提出了一个可编程梯度信息(PGI),目标是提供完整的输入信息给目标函数,从而获得更可靠的权值来更新网络。

        从上面的图片可以看出,传统骨干网络提供给目标函数的数据多多少少都存在丢失的情况。为了解决这个问题,通过辅助的可逆分支生成可靠的梯度,使深度特征仍然可以保持执行目标任务的关键特征。基于上述理论,本文设计了一种基于梯度路径规划的轻量级网络结构:广义高效层聚合网络(GELAN)。

二、模型

        1.可编程梯度信息(PGI)

        本文提出了一种辅助监督框架,称为可编程梯度信息(PGI),如上图(d)所示。PGI主要由三个部分组成:①主分支(main branch);②辅助可逆分支(auxiliary reversible branch);③多层次辅助信息(multi-level auxiliary information)。由于推理过程中,模型会仅使用主分支,因此并不需要付出额外的推理成本。

        另外,上图所示的其他方法为:(a)路径聚合网络(PAN);(b)可逆列(RevCol);(c)常规深度监督(c)。

        2.GELAN

        GELAN(广义有效聚合网络)通过结合CSPNet和ELAN两种网络的结构,使用梯度路径规划设计。

         如上图所示,通过模仿CSPNet,将ELAN扩展到GELAN中去。

三、实验

        实验基于MS COCO 2017数据集进行,与几种经典算法进行比较。均以M型为例

参数量(M)浮点计算量(G)mAP@.50(%)
YoloV5-m21.249.045.4
YoloV7-m36.9104.751.2
YoloV8-m25.978.950.2
YoloV9-m20.076.351.4

        可见,在精度相当的情况下,YoloV9比较显著的缩小了参数量(-49%)和浮点计算量(-43%),同时,相较于YoloV8拥有更高的精度。

四、模块解析

        1.RepNCSPELAN4

class RepNCSPELAN4(nn.Module):
    # csp-elan
    def __init__(self, c1, c2, c5=1):  # c5 = repeat
        super().__init__()
        c3 = int(c2 / 2)
        c4 = int(c3 / 2)
        self.c = c3 // 2
        self.cv1 = Conv(c1, c3, 1, 1)
        self.cv2 = nn.Sequential(RepNCSP(c3 // 2, c4, c5), Conv(c4, c4, 3, 1))
        self.cv3 = nn.Sequential(RepNCSP(c4, c4, c5), Conv(c4, c4, 3, 1))
        self.cv4 = Conv(c3 + (2 * c4), c2, 1, 1)
 
    def forward(self, x):
        y = list(self.cv1(x).chunk(2, 1))
        y.extend((m(y[-1])) for m in [self.cv2, self.cv3])
        return self.cv4(torch.cat(y, 1))
 
    def forward_split(self, x):
        y = list(self.cv1(x).split((self.c, self.c), 1))
        y.extend(m(y[-1]) for m in [self.cv2, self.cv3])
        return self.cv4(torch.cat(y, 1))

        2.SPPELAN金字塔池化

class SP(nn.Module):
    def __init__(self, k=3, s=1):
        super(SP, self).__init__()
        self.m = nn.MaxPool2d(kernel_size=k, stride=s, padding=k // 2)
 
    def forward(self, x):
        return self.m(x)
 
 
class SPPELAN(nn.Module):
    # spp-elan
    def __init__(self, c1, c2, c3):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        self.c = c3
        self.cv1 = Conv(c1, c3, 1, 1)
        self.cv2 = SP(5)
        self.cv3 = SP(5)
        self.cv4 = SP(5)
        self.cv5 = Conv(4*c3, c2, 1, 1)
 
    def forward(self, x):
        y = [self.cv1(x)]
        y.extend(m(y[-1]) for m in [self.cv2, self.cv3, self.cv4])
        return self.cv5(torch.cat(y, 1))

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

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

相关文章

MySQL数据类型:字符串类型详解

MySQL数据类型:字符串类型详解 在MySQL数据库中,字符串数据类型用于存储各种文本信息。这些数据类型主要包括CHAR、VARCHAR、TEXT和BLOB等。 CHAR与VARCHAR CHAR CHAR类型用于存储固定长度的字符串。它的长度在创建表时就已确定,长度范围…

书生·浦语大模型实战营之Llama 3 高效部署实践(LMDeploy 版)

书生浦语大模型实战营之Llama 3 高效部署实践(LMDeploy 版) 环境,模型准备LMDeploy chatTurmind和Transformer的速度对比LMDeploy模型量化(lite)LMDeploy服务(serve) 环境,模型准备 InternStudio 可以直接使用 studio-conda -t …

查找总价格为目标值的两个商品 ---- 双指针

题目链接 题目: 分析: 解法一: 暴力解法, 将每两个的和都算出来, 判断是否为目标值解法二: 数组中的数是按升序排序的, 我们可以定义左右指针 如果和小于目标值, 则应该让和变大, 所以左指针右移如果和大于目标值, 则应该让和变小, 所以右指针左移 思路: 定义left 0, righ…

使用Krukal算法解决图的最小生成树问题

Kruskal 算法 Kruskal算法是一种用于寻找连通图中最小生成树的算法。最小生成树是一个包含图中所有顶点的树,且边权重之和最小。Kruskal算法是一种贪心算法,它的基本思想是:每次选择边权重最小的边来扩展树,直到树包含所有的顶点…

一周学会Django5 Python Web开发-Django5 ORM执行SQL语句

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计49条视频,包括:2024版 Django5 Python we…

Spring 注解开发详解

1. 注解驱动入门案例介绍 1.1 需求描述 1.需求:实现保存一条数据到数据库。 2.表结构:create table account(id int primary key auto_increment,name varchar(50),money double(7,2)); 3.要求:使用spring框架中的JdbcTemplate和DriverMana…

Python 使用相对路径读取文件失败

python open一个问及那时使用绝对路径可以,但是使用相对路径时报错,找不到指定文件 解决步骤如下: 添加Python配置 在新增的配置Json文件添加下图红框这一行

阿里云OSS

进入阿里云官网,手机号短信登录

Ansible 中的copy 复制模块应用详解

作者主页:点击! Ansible专栏:点击! 创作时间:2024年4月25日13点40分 Ansible 中的 copy 模块用于将文件或目录从本地计算机或远程主机复制到远程主机上的特定位置。它是一个功能强大的模块,可用于各种文…

prometheus helm install 如何配置告警模版

对接企业微信 获取企业id 注册完成之后,通过企业微信官网登录后台管理,在【我的企业】的企业信息里面,获取到Alertmanager服务配置需用到的第一个配置:企业ID 获取部门id 部门ID 在【通讯录】中,添加一个子部门&a…

无人机+自组网:2U机架车载式自组网电台技术详解

自组网的特点包括自发现、自动配置、自组织和自愈等。由于网络中的节点可以随时加入或离开,自组网需要能够自动感知拓扑结构的变化,并快速调整路由策略以适应新的网络环境。此外,自组网中的节点还需要具备节能、安全和分布式管理等特性&#…

maixcam如何无脑运行运行别人的模型(以安全帽模型为例)

maixcam如何无脑运行运行别人的模型(以安全帽模型为例) 本文章主要讲如何部署上传的模型文件,以及如果你要把你模型按照该流程应该怎么修改,你可以通过该文章得到你想要的应该,该应用也包含的退出按钮,是屏…

质量管理系统( QMS):一文扫盲,质量重于泰山。

一、什么是QMS系统 QMS系统是质量管理系统(Quality Management System)的缩写。它是一种组织内部用于管理和控制质量相关活动的体系,旨在确保产品或服务符合质量标准和客户要求。 QMS系统通常包括一系列文件、程序和流程,用于规…

Linux常用命令总结(四):文件权限及相关命令介绍

1. 文件属性信息解读 1. 文件类型和权限的表示 0首位表示类型。在Linux中第一个字符代表这个文件是目录、文件或链接文件 符号对应文件类型-代表文件dd 代表目录l链接文档(link file); 1-3位确定属主(该文件的所有者)拥有该文件的权限。 4-6…

【信息收集】端口扫描masscan负载均衡识别lbd

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、什么是masscan masscan在kali系统上是自带的端口扫描…

【golang学习之旅】报错:a declared but not used

目录 报错原因解决方法参考 报错 代码很简单,如下所示。可以发现a和b都飙红了: 运行后就会出现报错: 报错翻译过来就是a已经声明但未使用。当时我很疑惑,在其他语言中从来没有这种情况。况且这里的b不是赋值了吗,怎…

SSL证书一年要多少钱

经常会被人问道:“安装SSL证书一年得要多少钱?”其实证书的类型不同、功能不同、品牌不同,证书的价格也会不一样。SSL证书的价格因其类型、品牌、购买渠道以及所包含的服务和支持等因素而有所不同。通常一年的费用从几十元到几万元不等。 一…

[Swift]单元测试

编写单元测试是确保你的代码质量和功能正确性的重要步骤 一、编写单元测试的详细流程 1. 创建一个新的Xcode项目 如果你尚未创建一个项目,首先你需要在Xcode中创建一个新的iOS项目: 打开Xcode,选择“File” > “New” > “Project”…

【黑马点评Redis——004达人探店】

1.发布探店笔记 2.点赞 利用Redis中的Set集合来判断是否点赞过。 3.点赞排行榜 可以通过SortedSet来按点赞时间进行排序。 4.好友关注 4.1.关注和取关 4.2.共同关注 可以通过set实现交集的功能 4.3.关注推送 4.3.1 拉模式 拉模式(Pull)&#x…

Android 13 Layer数据结构

Layer::State state的定义 State mDrawingState; 一个mDrawingState的变量struct State {Geometry active_legacy;Geometry requested_legacy;int32_t z;ui::LayerStack layerStack;#endifuint32_t flags;uint8_t reserved[2];int32_t sequence; // changes when visible regi…