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

相关文章

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.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学