YOLO系列目标检测算法——PP-YOLOE

2023-10-13 12:20

本文主要是介绍YOLO系列目标检测算法——PP-YOLOE,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

YOLO系列目标检测算法目录 - 文章链接

  • YOLO系列目标检测算法总结对比- 文章链接
  • YOLOv1- 文章链接
  • YOLOv2- 文章链接
  • YOLOv3- 文章链接
  • YOLOv4- 文章链接
  • Scaled-YOLOv4- 文章链接
  • YOLOv5- 文章链接
  • YOLOv6- 文章链接
  • YOLOv7- 文章链接
  • PP-YOLO- 文章链接
  • PP-YOLOv2- 文章链接
  • YOLOR- 文章链接
  • YOLOS- 文章链接
  • YOLOX- 文章链接
  • PP-YOLOE- 文章链接

本文总结:

  1. 本文借鉴YOLOX的成功方法,在PP-YOLOv2的基础上进行了优化,使用了anchor-free模式、更强大的backbone和neck结构,配备了CSPRepResStage、ET-head和动态标签分配算法TAL等等;
  2. PP-YOLOE避免使用可变形卷积和Matrix NMS等操作,以支持更好的部署在各种硬件上。

深度学习知识点总结

专栏链接:
https://blog.csdn.net/qq_39707285/article/details/124005405

此专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。


本章目录

  • 1. PP-YOLOv2回顾
  • 2 PP-YOLOE的改进
    • 2.1 Anchor-free
    • 2.2 Backbone和Neck
    • 2.3 Task Alignment Learning (TAL)
    • 2.4 Efficient Task-aligned Head (ET-head)
  • 3. 结论


YOLO系列目标检测算法-PP-YOLOE
2022.3.30 PP-YOLOE:《PP-YOLOE:PP-YOLOE: An evolved version of YOLO》

1. PP-YOLOv2回顾

PP-YOLOv2的主要功能点包含:

  • Backbone:带有可变性卷积的ResNet50-vd
  • Neck:带有SPP layer和DropBlock的PAN
  • Head:轻量级的IoU aware head
  • ReLU激活函数用于backbone中,Mish激活函数用于neck
  • 和YOLOv3保持一致,PP-YOLOv2仅为每个GT目标分配一个anchor
  • 除了分类loss、回归loss和objectness loss之外,PP-YOLOv2还使用IoU loss和IoU aware loss来提高性能
  • 更多细节参考文章PP-YOLOv2

2 PP-YOLOE的改进

2.1 Anchor-free

  PP-YOLOv2中使用的使anchor-based的模式,这种模式引入了许多参数,且在不同数据集上需要进行不同的手工配置,扩展到其他数据集很复杂,所以在PP-YOLOE中将其改为anchor-free模式。

  参考FCOS(在每个像素上平铺一个锚点)之后,本文为三个检测head设置上限和下限,以将GT分配给相应的特征图。然后,计算边界框的中心以选择最近的像素作为正样本。参考YOLO系列,预测4D向量(x,y,w,h)用于回归,实验结果如表2所示,该修改使模型速度稍快,但损失了0.3AP。尽管根据PP-YOLOv2的锚点大小仔细设置了上限和下限,但基于锚点的方式和无锚点的方式之间的分配结果仍存在一些细微的不一致,这可能会导致精度下降。
在这里插入图片描述

2.2 Backbone和Neck

在这里插入图片描述
  通过结合残差连接和dense连接,提出了一种新的RepResBlock,用于backbone和neck。

  参考TreeBlock,RepResBlock在训练阶段如图3(b)所示,推理阶段如图3(c)所示。
首先简化了TreeBlock(如图3(a)),然后将串联操作替换为元素加法操作,因为RMNet在某种程度上显示了这两种操作的结果相近,因此,在推断阶段,将RepResBlock重参数化为ResNet-34以RepVGG样式使用的基本残差块。

  使用RepResBlock构建backbone和neck。与ResNet类似,backbone命名为CSPRepResNet——包含一个stem由三个卷积层和由RepResBlock堆叠的四个后续阶段组成,如图3(d)所示。在每个阶段,使用跨阶段部分连接,以避免大量3×
3个卷积层。ESE((Effective Squeeze and Extraction)层还用于在构建backbone时在每个CSPRepResStage中施加通道attention。

  在PP-YOLOv2之后,使用RepResBlock和CSPRepResStage构建neck,与backbone不同,RepResBlock中的快捷方式和CSPRepResStage中的ESE层在neck中被删除。

  像YOLOv5一样,本文使用宽度系数α和深度系数β来缩放基本backbone和neck。因此,可以得到一系列具有不同参数和计算成本的检测网络。backbone的宽度设置为[64、128、256、512、1024],backbon的深度设置为[3,6,6,3],neck的宽度设置和深度设置分别为[192、384、768]和3。表1显示了不同模型的宽度乘数α和深度乘数β的规格。如表2所示,此类修改可提高0.7%的AP性能–49.5%的AP
在这里插入图片描述

2.3 Task Alignment Learning (TAL)

  YOLOX中使用SimOTA作为标签分配策略,以提高性能。然而,为了进一步克服分类和定位的失准,TOOD中提出了任务对齐学习(TAL),它由动态标签分配和任务对齐loss组成。动态标签分配意味着预测/损失感知。根据预测,它为每个GT实况分配动态数量的正锚。通过明确对齐两个任务,TAL可以同时获得最高的分类分数和最精确的边界框。

  对于任务对齐loss,TOOD使用标准化的t,即t^来替换丢失的目标,它采用每个实例中最大的IoU作为标准化。分类的Binary Cross Entropy(BCE)可以改写为:
在这里插入图片描述
  本文使用不同的标签分配策略来研究性能,在上述修改的模型上进行了这个实验,该模型使用CSPRepResNet作为backbone。如表3所示,TAL实现了最好的45.2%AP性能。使用TAL替代FCOS风格的标签分配,并得到了0.9%的AP改善(50.4%的AP),如表2所示。
在这里插入图片描述

2.4 Efficient Task-aligned Head (ET-head)

  在目标检测中,分类和定位任务之间的冲突是一个众所周知的问题。许多论文中给出了相应的解决办法,例如YOLOX的去耦头借鉴了大多数一阶段和两阶段检测器的经验,并成功应用于YOLO模型以提高精度。但是,解耦头可能会使分类和定位任务分离和独立,并且缺乏特定任务的学习。

在这里插入图片描述
  本文改进了头部,并提出了以速度和精度为目标的ET头部。如图2所示,使用ESE来替换TOOD中的层注意力,简化分类分支到捷径的对齐方式,并用分布Focal loss(DFL)层替换回归分支的对齐。

  对于分类和定位任务的学习,分别选择变焦距损失(varifocal loss,VFL)和分布focal loss(distribution focal loss,DFL)。对于的VFL,与的质量focal loss(quality focal loss,QFL)不同,VFL使用目标分数来加权正样本的损失。这种实现使得具有高IoU的正样本对loss的贡献相对较大。这也使得模型在训练时更加关注高质量的样本,而不是那些低质量的样本。相同的是,两者都使用IoU-aware分类分数(IoU-aware classification score,IACS)作为预测目标。这可以有效地学习分类分数和定位质量估计的联合表示,实现了训练和推理之间的高度一致性。对于DFL,为了解决边界框表示不灵活的问题,有论文中提出使用一般分布来预测边界框。本文的模型的损失函数如下:
在这里插入图片描述
  其中t^表示标准化目标分数,见等式(1)。如表2所示,ET-head获得0.5%的AP改善,达到50.9%的AP。

3. 结论

  本文对PPYOLOv2进行了一些更新,包括可扩展的backbone-neck架构、高效的任务对齐head、高级标签分配策略和精确的目标损失函数,这一切的改进形成了PP-YOLOE。同时,提出了s/m/l/x模型,这些模型可以涵盖实际中的不同场景。

这篇关于YOLO系列目标检测算法——PP-YOLOE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/203173

相关文章

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.