YOLO家族系列模型的演变:从v1到v8(下)

news2024/11/29 6:35:00

昨天的文章中,我们回顾了 YOLO 家族的前 9 个架构。本文中将继续总结最后3个框架,还有本月最新发布的YOLO V8.

YOLOR

Chien-Yao Wang, I-Hau Yeh, Hong-Yuan Mark Liao

“You Only Learn One Representation: Unified Network for Multiple Tasks”2021/05, https://arxiv.org/pdf/2105.04206.pdf

这个名称的翻译可能会有不同,“你只学习一种表示”。作者说这与之前的YOLO版本无关,概念也与YOLO有所不同。

因为有隐性知识(以前经验的概括)和显性知识(通过感官感知)。所以理解图片中显示的内容的人比不理解的普通神经网络能够更好地处理。

卷积神经网络通常执行一个单个的特定的任务, 而 YOLOR 的目标是同时可以训练它们同时解决多个任务,在他们学习解析输入以获得输出的同时,YOLOR 试图迫使卷积网络做两件事:

  • 了解如何获得输出
  • 试图确定所有不同的输出可能是什么。

所以模型有多个输出,而不是一个输出。

YOLOR 试图结合显性和隐性知识。对于神经网络,它们的显性知识存储在靠近输入的层中,而隐性知识存储在较远的层中。YOLOR 成为一个统一的神经网络。

论文介绍了神经网络中内隐性知识与显性知识整合过程中的关键问题:

在隐式知识的学习过程中引入了核空间对齐、预测细化和多任务学习等方法。向量、神经网络和矩阵分解是用来建模隐性知识和分析其有效性的方法。

优点

发布时的检测精度和检出率高于竞争对手

YOLOv6 / MT-YOLOv6

Meituan, China.

“YOLOv6: A Single-Stage Object Detection Framework for IndustrialApplications”2022/09, https://arxiv.org/pdf/2209.02976.pdf

美团的博客地址:https://tech.meituan.com/2022/06/23/yolov6-a-fast-and-accurate-target-detection-framework-is-opening-source.html

v6的改进主要集中在三个方面:

  • backbone 和 neck部分对硬件进行了优化设计
  • forked head 更准确
  • 更有效的训练策略

backbone 和 neck的设计是利用硬件方面的优势,如处理器核心的计算特性,内存带宽等,以进行有效的推理。

backbone

neck

作者分别使用Rep-Pan和EfficientRep块重新设计了架构的部分。

美团团队进行的实验表明,计算延迟和检测精度显著降低。特别是,与YOLOv6-nano模型相比,YOLOv6-nano模型的速度提高了21%,精度提高了3.6%。

头部解耦

分叉头第一次出现在V5中。它用于网络分类部分和回归部分的分离计算。在v6中,这种方法得到了改进。

训练的策略包括:

  • anchorless
  • SimOTA标记策略
  • SIoU盒回归的损失

优点

检测精度和检出率高于竞争对手

使用标准的PyTorch框架,可以方便的进行微调

YOLOv7

Chien-Yao Wang, Alexey Bochkovskiy, Hong-Yuan Mark Liao.

作者与YOLOv4的团队相同,可以认为是YOLO的官方发布。

“YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors”2022/07, https://arxiv.org/pdf/2207.02696.pdf

与其他实时模型相比,所提出的方法达到了最先进的性能。

主要计算单元是E-ELAN(扩展高效层聚合网络)

它的设计考虑了以下影响计算精度和速度的因素:

  • 内存访问成本
  • I / O比率
  • element-wise操作
  • 激活
  • 梯度路径

不同的应用需要不同的模型。在某些情况下检测精度是更重要的-那么模型应该有更多的可训练参数。在其他情况下,速度更重要模型应该更小,以便推理得更快。

在缩放v7时,需要考虑以下超参数:

  • 输入分辨率
  • 宽度(通道数)
  • 深度(层数)
  • 级联(特征金字塔的数量)

下图显示了一个同步模型扩展的示例。

论文还讨论了一套可以在不增加训练成本的情况下提高模型性能的方法。

再参数化是在训练后应用于改进模型的技术。它增加了训练时间,但提高了推理性能。有两种类型的重新参数化,模型级和模块级。

模型重新参数化可以通过两种方式完成:

  • 使用不同的训练数据,训练多个设置相同模型。然后平均它们的权重得到最终模型。
  • 平均模型不同训练轮次权重。

模块化再参数化在研究中较为常用。该方法将模型训练过程划分为大量的模块。对输出进行集成以得到最终模型。

在v7体系结构中,可以有多个头来执行不同的任务,每个头都有自己的损失。标签分配器是一种考虑网络预测和真实预测并分配软标签的机制。它生成软标记而不是硬标记。

优点

发布时检测精度和检出率高于竞争对手

使用标准的PyTorch框架,可以方便的进行微调

前期模型总结

在介绍V8之前,我们再总结一下以前的模型

虽然上表并未提及所有提高性能的改进和发现。但是YOLO的发展我们可以看到一些模式。

Backbone 最初由一个分支(GoogLeNet、VGG、Darknet)组成,然后过渡到包含跳跃连接的架构(Cross-Stage Partial connections — CSPDarknet、CSPRepResNet、Extended-ELAN)。

Neck 最初也由一个分支组成,然后以特征金字塔网络的各种修改形式逐步发展,这样可以在不同尺度下保持物体检测的准确性。

Head:在早期版本中只有一个 head,它包含所有输出参数——分类、bbox 的坐标等。后面的研究发现将它们分成不同的头会更有效率。从基于锚点到无锚点也发生了转变(v7 除外——出于某种原因,它仍然有锚点)。

数据增强:仿射变换、HSV 抖动和曝光变化等早期增强非常简单,不会改变对象的背景或环境。而最近的一些——MixUp、Mosaic、CutOut 等改变了图像的内容。平衡这两个方向增强的比例对于神经网络的有效训练都很重要。

YOLO v8

YOLOv3之前的所有YOLO对象检测模型都是用C语言编写的,并使用了Darknet框架,Ultralytics发布了第一个使用PyTorch框架实现的YOLO (YOLOv3),YOLOv3发布后不久,Joseph Redmon就离开了计算机视觉研究社区。

YOLOv3之后,Ultralytics发布了YOLOv5,在2023年1月,Ultralytics发布了YOLOv8。

YOLOv8包含五个模型,用于检测、分割和分类。YOLOv8 Nano是其中最快和最小的,而YOLOv8 Extra Large (YOLOv8x)是其中最准确但最慢的,具体模型见后续的图。

YOLOv8附带以下预训练模型:

  • 目标检测在图像分辨率为640的COCO检测数据集上进行训练。
  • 实例分割在图像分辨率为640的COCO分割数据集上训练。
  • 图像分类模型在ImageNet数据集上预训练,图像分辨率为224。

与之前的YOLO模型相比,YOLOv8模型似乎表现得更好。不仅是YOLOv5,YOLOv8也领先于YOLOv7和YOLOv6等

与其他在640图像分辨率下训练的YOLO模型相比,所有YOLOv8模型在参数数量相似的情况下都具有更好的吞吐量。

下面我们看看模型到底更新了什么

YOLOv8尚未发表论文,所以我们无法得到构建时的研究方法和消融研究的详细信息。但是我们可以从代码中看到他的改进,下面这张图是由GitHub用户rangging制作,展示了网络架构的详细可视化。

YOLOv8是一种无锚点模型,这意味着它直接预测对象的中心,而不是已知锚框的偏移量。锚点是早期YOLO模型中众所周知的很麻烦的部分,因为它们可能代表目标基准框的分布,而不是自定义数据集的分布。

无锚点减少了预测框的数量,从而加快了非最大抑制(NMS)的速度。下图为V8的检测头部分的可视化

新的卷积

stem 的第一个 6x6 conv 变为 3x3,主要构建块也使用C2f 取代了 C3。该模块总结如下图,其中“f”是特征数,“e”是扩展率,CBS是由Conv、BatchNorm和后面的SiLU组成的块。

在 C2f 中,Bottleneck 的所有输出(两个具有剩余连接的 3x3 卷积)都被连接起来。而在 C3 中,仅使用了最后一个Bottleneck 的输出。

Bottleneck 与YOLOv5中相同,但第一个conv核大小从1x1更改为3x3。我们可以看到YOLOv8开始恢复到2015年定义的ResNet块。

neck部分,特征直接连接,而不强制相同的通道尺寸。这减少了参数计数和张量的总体大小。

Mosaic 增强

深度学习研究往往侧重于模型架构,但YOLOv5和YOLOv8中的训练过程是它们成功的重要组成部分。

YOLOv8在在线训练中增强图像。在每个轮次,模型看到的图像变化略有不同。

Mosaic增强,将四张图像拼接在一起,迫使模型学习新位置,部分遮挡和不同周围像素的对象。

经验表明,如果在整个训练程序中进行这种增强会降低性能。在最后10个训练轮次关闭它则提高了性能。

以下性能来自Ultralytics的github

可以看到,目前来说YOLOv8 的精度和推理延迟都是最先进的。

YOLOv8代码结构

YOLOv8模型利用了与YOLOv5类似的代码,但采用了新的结构,其中使用相同的代码来支持分类、实例分割和对象检测等任务类型。模型仍然使用相同的YOLOv5 YAML格式初始化,数据集格式也保持不变。

ultralytics还提供了通过命令,许多YOLOv5用户应该对此很熟悉,其中训练、检测和导出交互可以通过CLI完成的。

 yolo task=detect mode=val model={HOME}/runs/detect/train/weights/best.pt data={dataset.location}/data.yaml

PIP包也可以很简单的让我们进行定制的开发和微调训练:

 fromultralyticsimportYOLO
 
 # Load a model
 model=YOLO("yolov8n.yaml")  # build a new model from scratch
 model=YOLO("yolov8n.pt")  # load a pretrained model (recommended for training)
 
 # Use the model
 results=model.train(data="coco128.yaml", epochs=3)  # train the model
 results=model.val()  # evaluate model performance on the validation set
 results=model("https://ultralytics.com/images/bus.jpg")  # predict on an image
 success=YOLO("yolov8n.pt").export(format="onnx")  # export a model to ONNX format

这使得可以方便使用我们的数据集进行训练,具体训练的方式有很多文章,我们这里就不说明了。

有兴趣的可以看看官方说明(有中文哦):https://avoid.overfit.cn/post/7596c1ba2d9544189f46e1abf6445c60

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

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

相关文章

JavaWeb-JavaScript

JavaWeb-JavaScript 1,JavaScript简介 JavaScript 是一门跨平台、面向对象的脚本语言,而Java语言也是跨平台的、面向对象的语言,只不过Java是编译语言,是需要编译成字节码文件才能运行的;JavaScript是脚本语言&#…

43. 【农产品溯源项目前后端Demo】后端二次开发的重点修改位置

前面讲过农产品溯源Demo比较简单,如果想二次开发需要重点关注的目录。 如果要开发一个新的API、对接新的合约,需要有哪些步骤? 定义数据结构,在domain包新增Class,定义好数据字段,定义好get、set方法。domain包没有业务的逻辑实现,只有结构、字段定义。 如果字段首字母小…

手摸手学会node框架之一——koa 傻瓜式小白教程

一、Koa简介 基于 Node.js 平台的下一代 web 开发框架。 由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 详细请参考Koa官网进行学习。 二、Koa基础入门 1.项目初始化 执行 npm init -y, 生成…

博客之星规则能否参照“金球奖”

文章目录课前小差粉丝对我的价值粉丝数量的提升KOL与粉丝链接粉丝影响收入博客之星规则设想博客之星新玩法?内部评审展望2023写在最后课前小差 哈喽,大家好,我是几何心凉,这是一份全新的专栏,唯一得倒CSDN王总的授权&…

小侃设计模式(廿一)-状态模式

1.概述 状态模式(State Pattern)是行为型设计模式的一种,它主要用来解决对象存在多种状态转换时,需要对外输出不同的行为。状态模式与策略模式有一定相似,区别在于策略模式行为彼此独立,可以进行相互替换&…

VueJs中的toRef与toRefs函数的一个比较

前言ref是处理基本数据类型响应式API函数,在setup中声明定义的变量,可以直接在模板中使用没有被响应式API包裹处理的变量数据,是不具备响应式能力的也就是往往在逻辑中修改了数据,但是页面不会更新,那怎么样将一个非响应式数据变成响应式数据就需要用到toRef()与toRefs()这两个…

【计算机网络】网络编程套接字

文章目录理解源IP地址和目的IP地址理解端口号和进程ID理解源端口号和目的端口号认识TCP协议认识UDP协议网络字节序socket编程接口socket网址查看socket常见APIUDP协议实现网络通信UDP创建socket文件描述符sockaddr结构UDP绑定端口号UDP接收发送网络数据简单的UDP网络程序TCP协议…

拉伯证券|大股东或易主,阿里巴巴换股入局

三大股指齐上扬,早盘主力埋伏这些股。 到午间收盘,“家居零售榜首股”之称的美凯龙一字涨停,港股红星美凯龙涨24%,此前一度涨超30%。 消息面上,1月13日晚间,美凯龙发布公告称,公司控股股东红星…

transformer算法解析

本文参考: 详解Transformer (Attention Is All You Need) - 知乎 Transformer 代码完全解读!_AI科技大本营的博客-CSDN博客 Transformer学习笔记一:Positional Encoding(位置编码) - 知乎 1、…

【C语言】自定义类型

前言男孩子在外面要保护好自己~一、结构体为什么会有结构体呢&#xff1f;但要描述一个复杂对象时&#xff0c;仅用之前学过的基本数据类型表达不了&#xff08;如&#xff1a;我要描述一个人&#xff0c;仅靠基本数据类型只能说定义他的一种属性<如用 int 定义他的年龄>…

字符串的处理

一、字符数组 用来存放字符型数据的数组称为字符数组&#xff0c;其元素是一个个的字符。 char 字符数组名[常量表达式]&#xff1b; C语言规定字符串是以\0字符作为结束符的字符数组。 在程序中可以通过判断数组元素是否为空字符来判断字符串是否结束。 字符串的输…

介绍Java中的常/变量.各种数据类型以及类型转换和提升的用法

本文简单描述了什么是常量和变量,介绍了Java各种数据类型:基本数据类型(四类八种,大小和范围)和引用数据类型(种类),简单介绍了包装类字符串类型,以及不同数据类型之间的常量和变量,数据类型之间的转换和提升… Java常/变量和数据类型一.什么是常量?二.什么是变量?三.数据类型…

[审核]因为审核人员不了解苹果登录被拒

1.审核被拒信息 Guideline 2.1 - Information Needed We’re looking forward to completing the review of your app, but we need more information to continue. Next Steps Please provide detailed answers to the following questions in your reply to this message i…

寒假集训一期总结(一)–––思维训练

目录 思维训练 走方格 解题思路 参考代码 最短曼哈顿距离 ​编辑 解题思路 参考代码 酒厂选址 解题思路 参考代码 雪地足迹Tracks in the Snow 解题思路 参考代码 一个星期没有更博客了…这一个星期,去学校信竞集训的我收获颇丰,下面就是我的还加集训总结 思…

【小白向】让电脑成为热点WIFI

让电脑成为热点WIFI 本文针对下述情况&#xff0c;有一台电脑&#xff0c;一部手机&#xff0c;但是电脑通过网线连接。此时电脑可以上网&#xff0c;手机没有流量&#xff0c; 仅能通过WIFI上网&#xff0c;但此时没有WIFI。 其实你的电脑可能自己本身就能作为热点发布WIFI&…

绕任一向量旋转矩阵计算思考与实现

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 问题提出 如图所示&#xff0c;在空间中有一向量A&#xff0c;问点O绕A方向逆时针旋转角度α的矩阵如何表示。 问题分析 问题化规 直接去构造一个矩阵是比较困难的。…

自从我学会了Jenkins的自动构建,我再也没有每次都打包上传到服务器然后发布Java服务了

上次我们讲了使用Jenkins部署maven项目 工作两年半&#xff0c;终于学会了Jenkins部署Maven项目 这次我们来讲一下每次提交代码的时候Jenkins自动构建 我们使用的代码仓库是gitee 文章目录&#x1f3c3;第一步&#xff0c;我们在Jenkins中安装gitee插件&#x1f3c3;第二步&am…

Go语言并发编程及依赖管理

目录&#x1f9e1;并发编程GoroutineCSP(Communicating Sequential Processes)&#x1f9e1;依赖管理依赖演变依赖管理三要素&#x1f49f;这里是CS大白话专场&#xff0c;让枯燥的学习变得有趣&#xff01; &#x1f49f;没有对象不要怕&#xff0c;我们new一个出来&#xff0…

Linux (open、write、read、close、lseek、chmod、sync)操作文件的函数详解

目录 一、文件操作方式 二、Linux底层文件操作 1. open 2. write 3. read 4. close 5. lseek 6. chmod 7. sync、syncfs、fsync、fdatasync 三、 Linux 系统调用 四、总结 linux中&#xff0c;一切皆文件&#xff08;网络设备除外&#xff09; 硬件设备也“是”文件&a…

力扣刷题记录——507.完美数、509. 斐波那契数、520. 检测大写字母

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《507.完美数、509. 斐波那契数、520. 检测大写字母》。 目…