YOLOv8来啦!YOLO内卷期模型怎么选?9+款AI硬件如何快速部署?深度解析

news2024/11/14 18:28:18

在这新春佳节到来之际,回顾整个虎年,堪称YOLO内卷元年,各路YOLO系列神仙打架,各显神通。一开始大部分用户做项目做实验还是使用的YOLOv5,然后YOLOv6、YOLOv7、PP-YOLOE+、DAMO-YOLO、RTMDet就接踵而至,于是就在自己的数据集逐一尝试,好不容易把这些下饺子式的YOLO模型训练完测试完,忙完工作准备回家过年时,YOLOv8又闪电发布,YOLOv6又更新了3.0版本...用户还得跟进继续训练测试,其实很多时候就是重复工作。

此外换模型训练调参也会引入更多的不确定性,而且往往业务数据集大则几十万张图片,重训成本很高,但训完了新的精度不一定更高,速度指标在特定机器环境上也未必可观,参数量、计算量的变化尤其在边缘设备上也不能忽视。

所以在这样的内卷期,作为开发者的我们应该怎么选择一个适合自己的模型呢?

接下来,我们将就YOLOv8的升级点、YOLO系列模型选型指南、YOLO系列模型多硬件快速部署几个方面展开讨论。

b6323346ba4cdb861076b66901b06f7e.png

 YOLO历史回顾

​​​​​​​

几天前,目标检测经典模型YOLO系列再添一个新成员YOLOv8,这是Ultralytics公司继YOLOv5之后的又一次重大更新。YOLOv8一经发布就受到了业界的广泛关注,成为了这几天业界的流量担当。

首先带大家快速了解下YOLO的发展历史。YOLO(You Only Look Once,你只看一次)是单阶段实时目标检测算法的开山之作,力求做到“又快又准”。

2016年,Joseph Redmon发布了第一版YOLO(代码库叫做darknet),但他本人只更新到YOLOv3,随后就将darknet库交给了Alexey Bochkovskiy、Chien-Yao Wang 等人,即YOLOv4和YOLOv7作者团队负责。

2020年,Ultralytics公司发布了YOLOv5代码库,同年百度发布了PP-YOLO,2021年旷视发布了YOLOX,2022年百度又发布了PP-YOLOE及PP-YOLOE+,随后又有美团、OpenMMLab、阿里达摩院等相继推出了各自的YOLO模型版本,就在前几天Ultralytics公司又发布了YOLOv8。同时这些系列模型也在不断更新迭代。

由此可见YOLO系列模型算法始终保持着极高的迭代更新率,并且每一次更新都会掀起业界的关注热潮。 

3d0e3e49bd0d268fe11b0755e2f3c412.png

​​​​​​​f7f4e29cbd94151e78db6a905e820f0d.png

YOLOv8升级解读

此次Ultralytics从YOLOv5到YOLOv8的升级,主要包括结构算法、命令行界面、Python API等,精度上YOLOv8相比YOLOv5高出一大截,但速度略有下降。

仅看检测方向的话,简单总结下YOLOv8在结构算法上相比YOLOv5的升级:

  • 骨干网络部分

选用梯度流更丰富的C2f结构替换了YOLOv5中的C3结构,为了轻量化也缩减了骨干网络中最大stage的blocks数,同时不同缩放因子N/S/M/L/X的模型不再是共用一套模型参数,M/L/X大模型还缩减了最后一个stage的输出通道数,进一步减少参数量和计算量。

  • Neck部分

同样是C2f模块替换C3模块,为了轻量化删除了Neck结构中top-down阶段的两个上采样卷积。

  • Head部分

换成了目前主流的Decoupled-Head解耦头结构,将分类分支和定位分支分离,缓解了分类和回归任务的内在冲突。

  • 标签分配和Loss部分

从Anchor-Based换成了Anchor-Free,采用了TAL(Task Alignment Learning)动态匹配,并引入了DFL(Distribution Focal Loss)结合CIoU Loss做回归分支的损失函数,使得分类和回归任务之间具有较高的一致性。

  • 训练策略

训练的数据增强部分最后10 epoch关闭Mosaic增强更有利于模型收敛的稳定,同时训练epoch数从300增大到500使得模型训练更充分。

从上面可以看出,YOLOv8集合了之前提出的诸如YOLOX、YOLOv6、YOLOv7和PPYOLOE等算法的相关设计,尤其是Head标签分配和Loss部分以及PP-YOLOE非常相似。YOLOv8集百家所长达到了实时检测界的一个新高度。

就在YOLOv8发布的当晚,飞桨PaddleDetection团队就支持了YOLOv8的推理部署,并正在研发可训练版本中。

  • 完整教程文档及模型下载链接

https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/docs/feature_models/PaddleYOLO_MODEL.md 

  • YOLO系列多硬件部署示例下载链接

https://github.com/PaddlePaddle/FastDeploy/blob/develop/examples/vision/detection/paddledetection

7d186b3b26a5cc2b022b74f84df7d14c.png

YOLO系列模型选型指南

为了方便统一YOLO系列模型的开发测试基准,以及模型选型,百度飞桨推出了PaddleYOLO开源模型库,支持YOLO系列模型一键快速切换,并提供对应ONNX模型文件,充分满足各类部署需求。

此外YOLOv5、YOLOv6、YOLOv7和YOLOv8在评估和部署过程中使用了不同的后处理配置,因而可能造成评估结果虚高,而这些模型在PaddleYOLO中实现了统一,保证实际部署效果和模型评估指标的一致性,并对这几类模型的代码进行了重构,统一了代码风格,提高了代码易读性。下面的讲解内容也将围绕PaddleYOLO相关测试数据进行分析。

总体来说,选择合适的模型,要明确自己项目的要求和标准,精度和速度一般是最重要的两个指标,但还有模型参数量、FLOPs计算量等也需要考虑。接下来就具体讲一讲这几个关键点。

5dd2304ae0af3997a35a64ac31c8bfe3.jpeg

582d5e518d31969f06791806be53986d.jpeg

注:以上DAMO-YOLO、YOLOv6-3.0均使用官方数据,其余模型均为Paddle复现版本测试数据。

cfcdfd65f11a0d964e2f796134bd2975.jpeg

看精度

首先是精度,从上图YOLO系列Benchmark图可以看出,几乎每个模型的目标都是希望自己的模型折线在坐标轴上是最高的,这也是各个模型的主要竞争点。各家都会训练业界权威的COCO数据集去刷高精度,但是迁移到实际业务数据集上时,效果哪个高并不一定,各个模型的泛化能力并不和COCO数据集上的精度正相关。COCO数据集精度差距在1.0以内的模型,其实业务数据集上差别不会很大,而且实际业务项目一般也不会只看mAP这一个指标,也可能需要关注AP50、AP75、Recall等指标。

要想在业务数据集达到较高精度,最重要是一点其实是加载一个较强的预训练(pre-trained)权重。COCO预训练权重可以极快收敛,精度也会远高于用ImageNet预训练权重训的。一个较强的预训练在下游任务中的效果会优于绝大多数的调参和算法优化。

在2022年9月份,飞桨官方将PP-YOLOE模型升级为PP-YOLOE+,最重要的一点就是提供了Objects365大规模数据集的预训练权重,Objects365数据集含有的数据量可达百万级,在大数据量下的训练可以使模型获得更强大的特征提取能力、更好的泛化能力,在下游任务上的训练可以达到更好的效果。

基于Objects365的PP-YOLOE+预训练模型,将学习率调整为原始的十分之一,在COCO数据集上训练的epoch数从300减少到了只需80,大大缩短了训练时间的同时,获得了精度上的显著提升。实际业务场景中,在遇到比COCO更大规模数据集的情况下,传统的基于COCO预训练的模型就显得杯水车薪了,无论训练200 epoch还是80 epoch,模型收敛都会非常慢,而使用Objects365预训练模型可以在较少的训练轮次epoch数如只30个epoch,就实现快速收敛并且最终精度更高。

此外还有一些自监督或半监督策略可以继续提升检测精度,但是对于开发者来讲,时间资源、硬件资源消耗极大,以及目前的开发体验还不是很友好,需要持续优化。

c8aafbd584e8c9c727facacf3ec50fd8.jpeg

看速度

速度不像精度很快就能复现证明的,鉴于各大YOLO模型发布的测速环境也不同,还是得统一测试环境进行实测。上图是飞桨团队在飞桨框架对齐各大模型精度的基础上,统一在Tesla T4上开启TensorRT以FP16进行的测试。

另外需要注意的是,各大YOLO模型发布的速度只是纯模型速度,是去除NMS(非极大值抑制)的后处理和图片前处理的,实际应用端到端的耗时还是要加上NMS后处理和图片前处理的时间,以及将数据从CPU拷贝到GPU/XPU等加速卡上和将数据从加速卡拷贝到CPU的时间。通常NMS的参数对速度影响极大,尤其是score threshold(置信度阈值) 、NMS的IoU阈值、top-k框数(参与NMS的最多框数)以及max_dets(每张图保留的最多框数) 等参数。

比如最常用的是调score threshold,一般为了提高 Recall(召回率) 都会设置成0.001、0.01之类的,但其实这种置信度范围的低分框对实际应用来说意义不大;如果设置成0.1、0.2则会提前过滤掉众多的低分框,这样NMS速度和整个端到端部署的速度就会显著上升,代价是掉一些mAP,但对于结果可视化在视觉效果上其实影响很小。

总之实际应用中都需要自己实践,加上NMS等前后处理,不能只看论文中提供的纯模型速度。(具体可见下图"Part4. YOLO系列模型多硬件快速部署”实测数据)

针对YOLO系列模型实际部署过程中遇到的前后处理优化问题、以及不同硬件模型的适配优化加速问题,飞桨团队同样提供了全场景高性能AI部署产品FastDeploy,可以快速在NVIDIA GPU、Intel CPU、ARM CPU、Jetson、昇腾、昆仑芯、算能、瑞芯微等硬件上实现优化部署,这部分将在下一章节具体介绍。

143b471e00cc10c8441f588c89d75cd5.png看参数量、计算量

这方面在学术研究场景中一般不会着重考虑,但是在产业应用场景中就非常重要,需要注意设备的硬件限制。例如堆叠一些模块结构来改造原模型,增加了2~3倍参数量提高了一点点mAP,这是AI竞赛常用的“套路”,精度虽然有少许提升,但速度变慢了很多,参数量和FLOPs也都变大了很多,对于产业应用来说意义不大,又如一些特殊模块,例如ConvNeXt,参数量极大但是FLOPs很小,虽然可以提升精度,但也会降低速度,参数量也可能受设备容量限制。

在对资源、显存及其敏感的场景,除了选择参数量较小的模型,也需要考虑和压缩工具联合使用。如下图所示,在YOLO系列模型上,使用PaddleSlim自动压缩工具(ACT)压缩后,可以在尽量保证精度的同时,降低模型大小和显存占用,并且该能力已经在飞桨全场景高性能AI部署工具FastDeploy中集成,实现一键压缩。

3ffe228e8ad41084cd646faa96d0b109.png

总之,在这YOLO“内卷时期”要保持平常心,无论新出来什么模型,都需要大致了解下改进点和优劣势后再谨慎选择,针对自己的需求选适合自己的模型。

056b3f847d553d243243504bd9d0343a.pngYOLO系列模型多硬件快速部署

STEP3中提到的速度,不仅有AI模型端到端的推理速度,也需要考虑到AI模型快速产业落地的速度。在真实产业部署落地场景,架构各异的AI硬件、不同场景的部署需求、不同操作系统和开发语言,通常使部署落地过程踩坑不断。

基于产业落地部署需求,全场景高性能AI部署工具FastDeploy统一了飞桨的推理引擎和生态推理引擎(包括Paddle Inference、Paddle Lite、TensorRT、OpenVINO、ONNX Runtime等多推理后端),并融合高性能的NLP、CV加速库,实现了AI模型端到端的推理性能优化,并涵盖了包括YOLOv5、YOLOv8、PP-YOLOE等在内的160多个产业级特色模型。YOLO系列在FastDeploy中的部署全景能力如下表展示:

  • 各硬件部署示例下载链接

https://github.com/PaddlePaddle/FastDeploy/tree/develop/examples/vision/detection/paddledetection

94df1688f71fa1c1f9faa1e4d53f767e.png

注:*表示:FD目前在该型号硬件上测试。通常同类型硬件上使用的是相同的软件栈,该部署能力可以延伸到同软件架栈的硬件。譬如RK3588与RK3566、RK3568相同的软件栈。

同时,考虑到产业应用实际更关心整体性能,FastDeploy对YOLOv8测试了模型端到端的性能数据。(当然每类硬件都有多款型号,且在具体部署落地中,通常是多batch、动态shape的使用,以下数据仅用于展示端到端推理与AI模型推理的区别。)

c2dabdc5d0eef49b5cbfb938f938c9b3.png

注:「FD Runtime」包括模型推理、NMS、HostToDevice(H2D)、DeviceToHost(D2H)5个部分。H2D是将数据从cpu拷贝到GPU/XPU等所需要的时间,发生在将预处理数据喂给推理引擎时,D2H是将数据从GPU/XPU等拷贝到CPU的时间。「端到端推理速度」在FD Runtime的时间上增加的算法前后预处理。

以上就是本次技术解读,最后想给大家留个共同的思考题:在YOLO如此“内卷”的时代,目标检测是否有新的、更高效的模型结构以及开发范式呢?

最后,飞桨团队提前祝大家春节快乐!来年目标检测精度、速度“兔”飞猛进!也欢迎大家Star支持我们的工作!

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

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

相关文章

SpringBoot原理解析

目录 一、Profile功能 (一)、application-profile功能 (二)、Profile条件装配功能 (三)、profile分组 二、外部化配置 (一)、外部配置源 (二)、配置文…

消息队列 ---nsq

设计 topic和channel 单个nsqd实例旨在一次处理多个数据流。流称为“主题”,一个主题有 1 个或多个“通道”。每个通道都会收到一个主题的所有消息的_副本_。 主题和通道道_不是_提前配置的。主题是在首次使用时通过发布到指定主题或订阅指定主题的通道来创建的。…

如何看懂行业分析报告?

从下面几部分聊聊行业分析:1.什么时候需要做行业分析?2.如何做行业分析?3.案例学习4.在工作中如何应用?5.在生活中如何应用?1.什么时候需要做行业分析呢?当你在对自己进行职业规划的时候,会思考…

【SpringCloud15】SpringCloud Stream消息驱动

1.消息驱动概述 1.1 为什么要引入消息驱动 1.2 是什么 概述:屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型 官网 Spring Cloud Stream是用于构建与共享消息传递系统连接的高度可伸缩的事件驱动微服务框架,该框架提…

一 、Qml开发之环境搭建

进入官网下载相应版本的qtcreator :https://download.qt.io/archive/qt/5.12/5.12.6/ 1.1 安装的时候注意如下对话框,需要选择下图所示的必须选项,因为我是mac 所以选择的macOS下载完之后进行点击安装,安装后运行软件图片如下&…

小程序uni-app介绍

uni-app介绍 uni-app简介 uni-app 是一个使用**Vue.js **开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用…

C++|读写xml文件开源库tingxml2的使用

参考: TinyXML使用方法[通俗易懂] https://cloud.tencent.com/developer/article/2037579 TinyXML2 入门教程(这篇写很好,本文侧重讲解使用不过做多介绍) 不了解xml的建议自行查阅,在此不赘述。 开源库github链接&…

Python中的列表、元组、字典

​​​​​​​列表是一种让程序员在代码中批量表示/保存数据的方式,元组和列表相比,是非常相似的,只是列表中放哪些元素可以修改调整,元组中放的元素是创建元组的时候就设定好的,不能修改调整。 列表和元组类似于其他…

SpringBoot 2-9-2 ServletAPI

使用27个解析器中 ServletRequestMethodArgumentResolver Step1 页面请求 注意RestController ResponseBody Controller Controller 将当前修饰的类注入SpringBoot IOC容器,使得从该类启动后就被实例化 ResponseBody 表示它会以Json字符串的形式返回给客户…

【日常系列】LeetCode《27·动态规划2》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 1&#xff09;爬楼梯、打家劫舍问题 2&#xff09;0-1&#xff0c;多重&#xff0c;完全&#xff0c;二维被动背包问题 lc 70【剑指 10 - 2】【top100】&…

Maven仓库集成与使用

1.概念:Maven主要服务于基于java平台的项目构建(编译、测试、生成文档、打包、部署等)&#xff0c;依赖管理和项目信息管理。 2.四大特性: 2.1:依赖管理系统(jar包管理, jar 升级时修改配置文件即可) 依赖(Coordination):由groupId、artifactId、version组成 …

PHP MySQL 预处理语句

预处理语句对于防止 MySQL 注入是非常有用的。 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句&#xff0c;并且执行效率更高。 预处理语句的工作原理如下&#xff1a; 预处理&#xff1a;创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标…

Python 实现 JSON 解析器

Json 解析 文章目录Json 解析Json 的组成对象结构数组结构词法分析逻辑性解析解析对象类型解析数组类型完整代码小结Json 的组成 JSON结构共有2种 对象结构数组结构 一个合法的JSON字符串可以包含这几种元素: 特殊符号,如"{" “}“表示一个JSON Object&#xff0…

将DataFrame进行转置的DataFrame.transpose()方法

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将DataFrame进行转置 DataFrame.transpose() 选择题 关于以下python代码说法错误的一项是? import pandas as pd dfpd.DataFrame({a:[a1,a2],b:[b1,b2]}) print("【显示】df:\n"…

高德地图红绿灯读秒是怎么实现的?(一)

关于这个读秒实现功能众说风云&#xff0c;目前有两种说法&#xff0c;一种说是靠大数据分析&#xff0c;一种说是靠交管部门数据。 我们先看一下官方的回应&#xff1a;可以自行去抖音看官方号的解释。 以下为原答&#xff1a; 有人说是接入了地方交管数据&#xff0c;其实政策…

2022年度 FinClip 扩展 SDK 推荐!

2022年&#xff0c;FinClip 团队进行了24个产品迭代&#xff0c;为了丰富FinClip 的平台能力&#xff0c;除了核心SDK之外&#xff0c;我们还为开发者们提供了扩展SDK&#xff0c;扩展SDK是一个依赖核心SDK的库&#xff0c;里面提供了核心SDK中所没有的各种小程序API。 官方希…

arduino和物联网云端平台系列---物模型之事件

事件&#xff0c;先下个简单的定义就是发生了什么事件 系列文章都是已经完成了基本的库安装和使用为前提 物模型之事件 基本的添加步骤不描述了&#xff0c;设置一个测试用例 事件我已经设定好了&#xff0c;输出参数代表的是在云端得到的输出&#xff0c;需要我们在设备进行…

【程序环境和预处理】C语言

前言&#xff1a; 到此节便是我们C语言学习的终章了&#xff0c;对C语言的学习便告一段落了&#xff0c;到学完这一章节我们便要进入下一个主题的学习了。 目录1. 程序的翻译环境和执行环境2. 详解编译链接2.1 翻译环境2.2 编译本身也分为几个阶段2.3 运行环境3. 预处理详解3.1…

ESP32设备驱动-L3GD20三轴角速率传感器驱动

L3GD20三轴角速率传感器驱动 1、L3GD20介绍 L3GD20 是一款低功耗三轴角速率传感器。 它包括一个传感元件和一个 I2C 接口,能够通过数字接口 (I2C/SPI) 向外部世界提供测量的角速率。传感元件采用意法半导体开发的专用微加工工艺制造,用于在硅晶片上生产惯性传感器和执行器。…

高通Qualcomm处理器的手机或设备进EDL 9008模式的办法

适用于变砖的设备 由于我们有很多基于 Qualcomm 的设备&#xff0c;其中一些设备可能会古怪地猜测如何进入 EDL 模式&#xff0c;或者如何正确进入。 例如&#xff0c;对于 Alcatel&#xff0c;您必须先按住两个音量键&#xff0c;然后再按住其中一个&#xff0c;对于 CAT B35…