YOLOv9理性解读 | 网络结构损失函数耗时评估

在这里插入图片描述

  • 论文:https://arxiv.org/pdf/2402.13616.pdf
  • HuggingFace Demo:https://hf-mirror.com/spaces/kadirnar/Yolov9
  • Github:https://github.com/WongKinYiu/yolov9

由台北中研院和台北科技大学等机构的研究团队推出的新的目标检测算法,一作Wang Chien-Yao也是Yolov4、Yolov7的作者之一,之前在Alexey Bochkvoskiy(Yolov4的第一作者)的团队中。

1 论文核心内容

YOLOv9是在YOLOv7的基础上进行的改进,指出现有方法存在如下的2个问题

  • 现有方法都是关注如何设计一个更好的损失函数,而一个好的网络结构可以获取更多的信息以提升预测效果;
  • 现有方案忽略了在一层一层的特征提取中会损失大量信息的问题;

针对以上两个问题,论文的解决方案(创新点)主要有以下2点:

  • 提出了一个轻量级的网络结构:Generalized Efficient Layer Aggregation Netwwork(GELAN)
  • 提出PGI(programmable gradient information):解决网络随着深度的增加,损失大量信息的问题。

1.1 GELAN

GELAN = RepCSPNet + ELAN

RepConv[1]^:通过结构参数化思想,让训练网络的多路结构在推理时转换为单路结构,以节省内存并提高前向处理速度。
在这里插入图片描述
source:Ding X et al.

将ELAN中的卷积组,替换成带有RepConv的CSPNet,相当于增加网络的宽度。这种增加网络宽度的方式看似可以增加梯度流,但是损失了卷积的连贯性,这对于板端部署来说是不友好的,会增加耗时。
在这里插入图片描述

1.2 PGI(programmable gradient information)

在这里插入图片描述
PGI:一种附属的监督框架(auxiliary supervision framework),用于在训练时提供更多的、更有效的监督信息,推理时该部分会被忽略。包含3个部分:

  • 主分支:main branch,推理过程只用主分支,因此不会增加额外的计算;
  • 附属可逆分支:auxiliary reversible branch,解决网络深度带来的信息丢失问题;
  • 多级附属信息:multi-level auxiliary information,解决深度监督带来的错误累积问题,尤其是这种多预测分支的网络结构;

1.2.1 Auxiliary Reversible Branch

其实就是YOLOv7[2]里面辅助头的变种,YOLOv7中复用原网络提取的特征图:
在这里插入图片描述
source:Wang C Y et al.

YOLOv9直接从输入开始,搭建了跟主干网络类似的网络结构,使用辅助分支自己提取的特征来预测目标,从而计算辅助loss。在训练时相当于增加了一倍的权重,因此训练时间也会随着增加。
在这里插入图片描述

1.2.2 Multi-level Auxiliary Information

YOLOv7在计算辅助头时,使用的特征图是独立的,而YOLOv9是融合了多种特征图之后再计算辅助头的输出,详细见下一章的网络结构图。

2 网络结构详解

在这里插入图片描述

  • GELAN就是中的RepNCSPELAN,将原始ELAN中的卷积组换成带有RepConv的CSPNet block;
  • CBFuse就是文中提到的Multi-level Auxiliary Information,将不同的层的特征图通过上采样到同一尺寸后再相加,再输出预测结果;
  • 网络的输出与YOLOv8[3]类似的解耦头,有类别和box分支,其中box不是直接进行边界框回归,而是将回归任务转化成分类任务。

解耦头解释:
在这里插入图片描述
source:Openmmlab

BBOX分支中,4表示anchor点到上下左右4个边界的距离,每个距离对应一个长度为reg_max的向量,reg_max一般设置为16。在网络预测完成后,将向量进行softmax,得到权重,这些权重再与[0,1,2,…, 15]进行加权,得到anchor点到4个边界的距离,从而得到预测框的信息。
在这里插入图片描述
source:Zhi Tian et al.

3 正负样本匹配策略与损失函数

3.1 正负样本匹配策略

样本匹配依旧使用的是TaskAlign样本匹配。和YOLOv8、YOLOv6等算法保持一致;TaskAlignedAssigner的匹配策略就是:根据分类与回归的分数加权的分数去选择正样本。
t = s a ∗ u b t = s^{a}*u^{b} t=saub
针对每一个gt,其中s是每个anchor点对应的gt类别的分类置信度,u是每个anchor点对应预测的目标框与gt的IoU,a,b表示外部配置的指数,两者相乘就可以衡量对齐程度alignment metrics。再直接基于对齐程度选取topk作为正样本。

3.2 损失函数

  • 分类损失:BCE Loss
  • 回归损失:DFL Loss + CIoU Loss

4 耗时评估与初步使用建议

4.1 AX650耗时

作者:圈圈虫

链接:https://www.zhihu.com/question/645376390/answer/3406848125

YOLOv9-c在ax650单帧平均耗时26ms。 YOLOv9-C是第三大的模型,稍微小一点的模型M,S相较于v8并没有显著的优势。
在这里插入图片描述

4.2 其他评价

作者:JerryFxckingWong

链接:https://www.zhihu.com/question/645376390/answer/3409418697

bilibili上一位up在vis drone做的实验结果:

在这里插入图片描述

  • 训练时间翻倍,论文中提到的监督方式基本上多了一倍的网络结构
  • 同规模下推理时间增加(由于split操作的引入)

用split的方式看似丰富了所谓的梯度流,减少了参数量,但是大大增加了推理的时间,尤其对于端设备来说,这会导致推理的各种不连续性。

4.3 总体评价

  • 相较于之前的YOLOv8,YOLOv9指标并没有显著的提升;
  • v9以牺牲耗时为代价,换来部分指标提升,整体网络结果对于板端部署并不友好,耗时可能会相较于项目中使用的模型会偏高;
  • 在耗时允许范围内,使用YOLOv9,相同量级参数下,指标可能会好一些,需要在实际业务上测试。

5 参考资料

[1] Ding X, Zhang X, Ma N, et al. Repvgg: Making vgg-style convnets great again[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2021: 13733-13742.

[2] Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475.

[3] YOLOv8:https://github.com/ultralytics/ultralytics/tree/main

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

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

相关文章

应用存储与持久化数据卷

1、PV 引入场景: ① Deployment 管理的 pod,在做镜像升级的过程中,会产生新的 pod并且删除旧的 pod ,新旧 pod 之间如何复用数据? ② 宿主机宕机的时候,如何实现带卷迁移? ③ 多个 pod 之间&…

基于springboot+vue的相亲网站

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Stable Video Diffusion(SVD)视频生成模型发布 1.1版

前言 近日,随着人工智能技术的飞速发展,图像到视频生成技术也迎来了新的突破。特别是Stable Video Diffusion(SVD)模型的最新版本1.1,它为我们带来了从静态图像生成动态视频的全新能力。本文将深入解析SVD 1.1版本的核…

gpt-3.5-turbo与星火认知大模型v3.5回答对比

创建kernel // Create a kernel with OpenAI chat completionKernel kernel Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId:"使用的模型id" ,apiKey: "APIKey").Build();使用讯飞星火认知大模型的话,可以参考我这一篇文章&#xff…

Linux系统——Nginx负载均衡模式

目录 一、Nginx优点 二、Nginx配置项——Conf Upstream 模块 三、Nginx负载均衡 1.负载均衡策略 1.1轮询 1.2IP_hash 1.3URL_hash 1.4Least_conn 1.5Weight 1.6Fair 2.Nginx负载均衡配置状态参数 3.什么是会话保持 3.1会话保持有什么作用呢 3.2Nginx会话保持 3…

JVM工作原理与实战(四十一):ShenandoahGC原理

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、ShenandoahGC介绍 二、ShenandoahGC 1.0版本 三、ShenandoahGC 2.0版本 四、ShenandoahGC执行流程 总结 前言 JVM作为Java程序的运行环境,其负责解释和执行字节码&…

ywtool check命令及ywtool clean命令

一.ywtool check命令 1.1 ywtool check -I 1.2 ywtool check all 1.3 ywtool check io 1.4 ywtool check elk 1.5 ywtool check php 1.6 ywtool check mysql 1.7 ywtool check nginx 1.8 ywtool check system 1.9 ywtool check docker_nbip [容器名称] 1.10 ywtool check 1.10…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之FlowItem容器组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之FlowItem容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、FlowItem组件 子组件 可以包含子组件。 接口 FlowItem() 使用该接口来…

从0到1使用C++实现一个模拟器-1-【实现最简CPU】

文章目录 uint64_tstdstd::arrayCPU和CU类构造函数size_tstatic_caststd::ifstreamriscv64-unknown-elf-objcopy -O binary add-addi add-addi.binriscv64-unknown-elf-gcc -Wl,-Ttext0x0 -nostdlib -o add-addi add-addi.s-wlstd::hex std::setw() std::setfill()各自的用法he…

DOM 创建节点、添加节点和删除节点

创建元素节点 document.createElement(‘标签名’) 创建文本节点document.createTextNode ( 内容 ) 根据传入的标签名创建出一个空的元素对象创建出来的默认不显示,要成为别人的子元素才能显示,所以要结合appendChild使用 添加节点(后面&am…

【数据结构与算法】回溯法解题20240301

这里写目录标题 一、78. 子集1、nums [1,2,3]为例把求子集抽象为树型结构2、回溯三部曲 二、90. 子集 II1、本题搜索的过程抽象成树形结构如下: 三、39. 组合总和1、回溯三部曲2、剪枝优化 四、LCR 082. 组合总和 II1、思路2、树形结构如图所示:3、回溯…

Kaggle 竞赛入门

打比赛不用写算法源码,应用的时候不用自己写。学习的时候可以自己写。 Kaggle 竞赛入门 认识 Kaggle 平台Kaggle竞赛知识前提结构化数据前提图像数据文本数据 Kaggle竞赛套路一个赛题的完整流程 认识 Kaggle 平台 Kaggle 官网 主页,比赛(数据…

Git分布式版本控制系统——git学习准备工作

一、Git仓库介绍 开发者可以通过Git仓库来存储和管理文件代码,Git仓库分为两种: 本地仓库:开发人员自己电脑上的Git仓库 远程仓库:远程服务器上的Git仓库 仓库之间的运转如下图: commit:提交&#xff…

【HbuilderX】 uniapp实现 android申请权限 和 退出app返回桌面

目录 android申请权限: 监听用户是否开启权限或关闭权限: 退出app返回桌面: android申请权限: 首先在 manifest.json 内添加你所需要用到权限 添加权限插件 permission.js 一次就好1/权限插件 - Gitee.comhttps://gitee.co…

安装 docker 可视化工具 portainer

portainer 官方网站 https://www.portainer.io/ 一、portainer 介绍 Portainer是一款开源的容器管理平台,它提供了一个直观易用的Web界面,帮助用户管理Docker容器集群、镜像、卷等资源。Portainer 支持多种 Docker 环境,包括本地Docker、Sw…

k8s 存储卷详解与动静部署详解

目录 一、Volume 卷 1.1 卷类型 emptyDir : hostPath: persistentVolumeClaim (PVC): configMap 和 secret: 二、 emptyDir存储卷 2.1 特点 2.2 用途: 2.3 示例 三、 hostPath存储卷 3.1 特点 3.2 用途 …

面试经典 150 题 ---- 轮转数组

面试经典 150 题 ---- 轮转数组 轮转数组方法一:使用额外的数组方法二:数组翻转 轮转数组 方法一:使用额外的数组 我们可以使用额外的数组来将每个元素放至正确的位置。用 n 表示数组的长度,我们遍历原数组,将原数组…

Jenkins笔记(一)

个人学习笔记(整理不易,有帮助点个赞) 笔记目录:学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 目录 一:简单了解 二:什么是DevOps 三:安装Jenkins 四&#xff1…

OSCP靶场--DVR4

OSCP靶场–DVR4 考点(1.windows:路径遍历获取私钥getshell 2.ssh shell中runas切换用户) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.161.179 --min-rate 2000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-29 07:14 EST…

nextjs13如何进行服务端渲染?

目录 一、创建一个新项目 二、动态获取后端数据进行服务端渲染出现的问题 三、nextjs13如何进行服务端渲染 nextjs13是nextjs的一个重大升级,一些原本在next12当中使用的API在nextjs13上使用十分不便。本文将着重介绍在nextjs13及以上版本当中进行服务端渲染的方…