目标检测算法——YOLOV9——算法详解

news2024/11/24 9:19:25

一、主要贡献

        深度网络输入数据在逐层进行特征提取和空间变换时,会丢失大量的信息。针对 信息丢失问题,研究问题如下:
        1)从可逆功能的角度对现有深度神经网络架构进行了理论分析,解释了许多过去难以解释的现象,设计了PGI 辅助可逆分支,可以用于各种深度的网络,并取得了出色的结果。
        2)同时考虑了参数数量、计算复杂性、准确性和推理速度,设计的GELAN只使用传统卷积,以实现比基于最先进技术的深度卷积设计更高的参数使用率,同时显示出轻量、快速和准确的巨大优势。
        3)结合所提出的PGI和GELAN,设计了YOLOv9在MS COCO数据集上的目标检测性能在各个方面大大超过了现有的实时目标检测器。

PS

        截止20240416 的git 代码实现:
        1)作者仅仅开源了c和e模型的配置文件,而且只有两个head,共计6个输出头,和论文的9头几乎对不上。
        2)所谓的PGI作者解释的很学术范,实现就是复制一个backbone,然后结合辅助分支,感觉这个pgi的故事,其实就是两个不同大小的模型互相蒸馏,然后推理可以只保留某个(或大或小)的主分支。
        3)关于GELAN的创新,主要就是ELAN的拓展,允许把里面最简单的CNN,套娃换为CSPNet等。
        4)后文那个可视化(不同backbone的随机初始化权重得到的结果就能证明信息保留程度),我是真的没有看懂,首先网络都没有下采样,网络的结构是什么样的?其次我自己的拙见,也有人在issue中提问,这里的丢失信息和网络本来的拟合目标的能力有正相关吗?拟合过程本身也是一个统计并去冗余过程。
        综上,个人目前建议大概看看论文就好,还是让子弹飞一飞吧,这个V9的名字靠这两个创新点+真正实现对不上文章感觉。。。。

二、主要思路

PGI

        整个PGI的结构论文提到如下图d. 关于PGI讲的故事这里简单用作者在git issue的一张图吧,因为实现其实就是另一个并行backbone+辅助分支,所以感觉看看就好。

GELAN

        就是ELAN的扩展,允许讲conv 变为任意模块,并验证有效性。

三、具体细节

    正真实现的时候,官方放出来了c 和 e 的模型,都并不是论文中的3个head 9个输出,也在issue中被大家追问(手动狗头),下面是有人画出的c对应的网络图(原作者链接: Summary of YOLOv9 Architecture · Issue #355 · WongKinYiu/yolov9 · GitHub )。
    如何来看网络,其实主要参考三个文件:
    1)模型配置文件: yolov9/models/detect/yolov9-c.yaml at main · WongKinYiu/yolov9 · GitHub 
    2)模型实现文件: yolov9/models/yolo.py at main · WongKinYiu/yolov9 · GitHub 这里作者也实现了不同的类对应不同的分支头数,但是目前开源的代码实现了TripleDetect类,但是没有使用。
    3)loss文件: yolov9/utils/loss_tal_dual.py at main · WongKinYiu/yolov9 · GitHub 这里作者实现了三个loss:loss_tal.py、loss_tal_dual.py、oss_tal_triple.py
    再围观看一下GELAN的代码
class RepNCSPELAN4(nn.Module):
    # csp-elan
    def __init__(self, c1, c2, c3, c4, c5=1):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        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))

1、input

640*640,正常的预处理。

2、backbone

主要就是多了一条(或两条分支)backhone。
backbone使用了’RepNCSPELAN4 ‘模块。

3、neck & head

主要是增加了辅助头。

4、loss function

loss为DFL Loss + CIoU Loss,匹配策略为TaskAlign样本匹配,和YOLOv8、YOLOE、YOLOv6等算法保持一致。

5、trics

推理时可以去掉分支,见参考链接部分。

6、inference

测试阶段(非训练阶段)过程

四、结果

    1、与sota比较

    它比较好,也有网友做了性能和推理速度比较,目前看确实还是有优势的,所以后续持续关注。

    2、消融实验

    GELAN
        PGI
    
    GELAN & PGI
    

    可视化
  

参考链接

三个分支9个头的配置文件: How to use TripleDDetect? · Issue #226 · WongKinYiu/yolov9 · GitHub
结构图: Summary of YOLOv9 Architecture · Issue #355 · WongKinYiu/yolov9 · GitHub 
推理速度对比: yolov5 yolov8 yolov9 speed test on T4 (tensorrt ) · Issue #178 · WongKinYiu/yolov9 · GitHub
训练速度对比: training speed is 3 times slower than yolov8 · Issue #173 · WongKinYiu/yolov9 · GitHub 
去掉分支:  GitHub - spacewalk01/TensorRT-YOLOv9: Cpp and python implementation of YOLOv9 using TensorRT API

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

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

相关文章

AppleScript初体验,让你的mac实现自动化UI操作

AppleScript 简介 AppleScript是苹果公司开发的一种脚本语言,用于操作MacOS及其应用程序,在实现MacOS自动化工作方面非常给力。 我们可以使用AppleScript用来完成一些重复琐碎的工作,AppleScript具有简单自然的语法,另外系统也提…

【Java】@RequestMapping注解在类上使用

RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到控制器(controller类)的处理方法上。 Request Mapping 基础用法 在 Spring MVC 应用程序中,RequestDispatcher (在 Front Controller 之下) 这…

2024-14.python前端+Django

第四篇 web前端 第1章 、Web的基本概念 前端基础总共分为三部分:html、css和js。 1.3、HTTP协议 1.3.1 、http协议简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web &am…

使用Python进行自动化测试【第163篇—自动化测试】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 如何使用Python进行自动化测试:测试框架的选择与应用 自动化测试是软件开发过程…

✯✯✯宁波 IATF16949 认证:助力汽车企业迈向卓越✯✯✯

🌈🌈🌈宁波IATF16949认证:💝助力汽车企业迈向卓越💗 🕵️‍♂️宁波,这座繁华的🦊港口城市,不仅以其🐯独特的地理位置和丰富的🕊️历史…

第十五届蓝桥杯题解-数字接龙

题意:经过所有格子,并且不能进行交叉,走的下一个格子必须是当前格子值1%k,输出路径最小的那一条(有8个方向,一会粘图) 思路:按照8个方向设置偏移量进行dfs,第一个到达终…

[node 库推荐] rosie 测试用生成数据

[node 库推荐] rosie 测试用生成数据 最近发现一个用来生成 dummy data 非常好用的库,做测试或者 storybook 都挺合适的,npm 官方地址在 rosie,同时有 TS 支持 rosie 用的是 factory pattern,使用真的还蛮简单的,官方…

transformer上手(9)—— 翻译任务

运用 Transformers 库来完成翻译任务。翻译是典型的序列到序列 (sequence-to-sequence, Seq2Seq) 任务,即对于每一个输入序列都会输出一个对应的序列。翻译在任务形式上与许多其他任务很接近,例如: 文本摘要 (Summarization):将长…

Java集合进阶——泛型

1.泛型 介绍&#xff1a; 泛型可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 应用场景&#xff1a; 如果在定义类、方法、接口的时候&#xff0c;如果类型不确定&#xff0c;就可以使用泛型。 格式&#xff1a; <数据类型> 注意&#xff1a; 泛型只支持引…

[C++][算法基础]判定二分图(染色法)

给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环。 请你判断这个图是否是二分图。 输入格式 第一行包含两个整数 n 和 m。 接下来 m 行&#xff0c;每行包含两个整数 u 和 v&#xff0c;表示点 u 和点 v 之间存在一条边。 输出格式 如果给定图是二分图…

OpenHarmony、HarmonyOS和Harmony NEXT 《我们不一样》

1. OpenHarmony 定义与地位&#xff1a;OpenHarmony是鸿蒙系统的底层内核系统&#xff0c;集成了Linux内核和LiteOS&#xff0c;为各种设备提供统一的操作系统解决方案。 开源与商用&#xff1a;OpenHarmony是一个开源项目&#xff0c;允许开发者自由访问和使用其源代码&#…

【【相机运动】_Camera_shake镜头晃动动画】

【相机运动】:Camera shake镜头晃动动画 2022-07-20 20:28 评论(0)

绝地求生:PCL大名单公布,艾伦格三巨头惨遭拆散

就在4.16号PCL官博公布了春季赛的参赛大名单&#xff0c;此次比赛不再像以前一样分为艾伦格、米拉玛和维寒迪三组&#xff0c;而是重新打乱分成了A、B、C三组。 具体名单如下 不仅多了很多新战队&#xff0c;还有一些老家伙也回到了赛场上&#xff0c;比如四大名捕的TSG。

HarmonyOS开发实战:【亲子拼图游戏】

概述 本篇Codelab是基于TS扩展的声明式开发范式编程语言编写的一个分布式益智拼图游戏&#xff0c;可以两台设备同时开启一局拼图游戏&#xff0c;每次点击九宫格内的图片&#xff0c;都会同步更新两台设备的图片位置。效果图如下&#xff1a; 说明&#xff1a; 本示例涉及使…

鸿蒙画布组件使用介绍

一、前言 DevEco Studio版本&#xff1a;4.0.0.600 前些天写了一篇 鸿蒙自定义控件实现罗盘数字时钟效果 的文章&#xff0c;有同学私信说能不能介绍鸿蒙中的画布组件&#xff0c;下面文章介绍下鸿蒙中的Canvas画布、CanvasRenderingContext2D绘制组件&#xff0c;实现绘制文…

权限管理Ranger详解

文章目录 一、Ranger概述与安装1、Ranger概述1.1 Ranger介绍1.2 Ranger的目标1.3 Ranger支持的框架1.4 Ranger的架构1.5 Ranger的工作原理 2、Ranger安装2.1 创建系统用户和Kerberos主体2.2 数据库环境准备2.3 安装RangerAdmin2.4 启动RangerAdmin 二、Ranger简单使用1、安装 R…

Docker Container (容器) 常见命令

Docker 容器的生命周期 什么是容器&#xff1f; 通俗地讲&#xff0c;容器是镜像的运行实体。镜像是静态的只读文件&#xff0c;而容器带有运行时需要的可写文件层&#xff0c;并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容 器有初建、运行、停止、暂停和删除…

Unity类银河恶魔城学习记录12-18,19 p140 Options UI-p141 Finalising ToolTip源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_ToolTip.cs using TMPro; using UnityEngine;public class UI_ToolTip :…

Git回滚操作,工作区和暂存区恢复修改删除的文件

在利用git协作过程中&#xff0c;经常需要进行代码的撤销操作&#xff0c;这个行为可能发生在工作区&#xff0c;暂存区或者仓库区&#xff08;或版本库&#xff09;。 我们先讨论在工作区与暂存区发生的撤销行为&#xff0c;这里会有两个命令提供帮助&#xff0c;git restore…

【管理咨询宝藏72】MBB大型城投集团能源板块行业分析报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏72】MBB大型城投集团能源板块行业分析报告 【格式】PDF版本 【关键词】战略规划、商业分析、管理咨询、MBB顶级咨询公司 【强烈推荐】 这是一套…