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

news2024/10/7 2:21:34

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

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

本文总结:

  1. PP-YOLO以YOLOv3为基础进行开发,主要尝试结合现有的各种几乎不增加模型参数和FLOPs的多个的tricks,以尽可能提高检测器的精度,同时确保速度几乎不变;
  2. Backbone使用ResNet50-vd替代YOLOv3中的DarkNet-53;为了解决替换backbone可能造成的问题,平衡效率和性能,仅在最后一阶段,使用可变形卷积替换3×3的卷积层。
  3. 使用其他多种trick,例如更大的Batch Size、EMA、DropBlock、IoU Loss、IoU Aware、Grid Sensitive、Matrix NMS、CoordConv、SPP和更好的预训练模型等;

深度学习知识点总结

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

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


本章目录

  • 1. 简介
  • 2. 算法
    • 2.1 网络结构
      • 2.1.1 Backbone
      • 2.1.2 Neck
      • 2.1.3 Head
    • 2.2 trick的选择


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

2020.7.23 PP-YOLO:《PP-YOLO: An Effective and Efficient Implementation of Object Detector》

1. 简介

  由于硬件的限制,往往需要舍弃准确率来确保算法的推理速度。本文的目的是实现一种具有相对平衡的既有效又高效的目标检测器,可以直接应用于实际的应用场景,而不是提出一种新的检测模型。以YOLOv3为基础进行开发,主要尝试结合现有的各种几乎不增加模型参数和FLOPs的多个的tricks,以尽可能提高检测器的精度,同时确保速度几乎不变。由于本文的所有实验都是基于PaddlePaddle进行的,所以称之为PP-YOLO。

  与YOLOv4不同,PP-YOLO没有探索新的的主干网络和数据增强方法,也没有使用NAS来搜索超参数。对于backbone,直接使用ResNet,对于数据增强,直接使用基本的MixUp。所以若是使用更好的骨干网络,使用更有效的数据增强方法,并使用NAS搜索超参数,可以进一步提高PP-YOLO的性能。

  本文的重点是如何堆叠一些几乎不影响效率的有效技巧,以获得更好的性能。这些技巧不能直接应用于YOLOv3的网络结构,因此需要进行小的修改。本文不打算介绍一种新的目标检测器。它更像是一个食谱,它会告诉你如何一步一步地构建一个更好的检测器。也发现了一些对YOLOv3检测器有效的技巧,可以节省开发人员的试验时间。

2. 算法

  PP-YOLO是一阶段的anchor-based的目标检测算法,包含backbone、Neck和Head。本文首先修改了YOLOv3的结构,并引入了一个修改后的版本,将backbone替换为ResNet50-vd-d-dcn。然后介绍了一些技巧,可以在几乎不失去效率的情况下提高YOLOv3的性能。

2.1 网络结构

在这里插入图片描述

2.1.1 Backbone

  YOLOv3的整体结构下图所示。在原始的YOLOv3中,DarkNet-53首先被用于提取不同尺度的特征图。ResNet已经得到了广泛的应用,研究也更加广泛,有更多不同的变体可供选择,它也通过深度学习框架得到了更好的优化。因此,本文PP-YOLO使用ResNet50-vd取代了原来的Backbone DarkNet-53。

  考虑到直接替换bacnbone可能造成原始检测器的性能,所以使用可变形卷积替换ResNet50-vd中的部分卷积层(可变形卷积网络(Deformable Convolutional Networks,DCN)的有效性已在许多检测模型中得到验证)。DCN本身不会增加模型的参数量和FLOPs,但在实际应用中,太多DCN层会明显增加推理时间。因此,为了平衡效率和性能,仅在最后一阶段,使用DCNs替换了3×3的卷积层。将这个修改后的Backbone表示为ResNet50-vd-dcn,阶段3、4和5的输出表示为C3、C4、C5。

2.1.2 Neck

  然后利用FPN构建一个特征图之间具有横向连接的特征金字塔。特征图C3、C4、C5输入到FPN模块,将金字塔级l的输出特征图表示为 P l P_l Pl l = 3 , 4 , 5 l=3,4,5 l=3,4,5,对于输入大小为W×H的图像,Pl的分辨率为 W 2 l × H 2 l \frac{W}{2^l} × \frac{H}{2^l} 2lW×2lH ,FPN的详细结构如图所示。

2.1.3 Head

  YOLOv3的检测头十分简单,由两个卷积层组成,采用3×3卷积层和1×1卷积层得到最终的预测。每个最终预测的输出通道为 3 × ( K + 5 ) 3×(K + 5) 3×(K+5),其中K为类别数。每个最终预测图上的每个位置都与三个不同的锚点相关联。对于每个锚点,前K个通道是K个类的概率预测,接下来的4个通道是对边界框位置的预测,最后一个通道是对objectness得分的预测。对于分类和定位,分别采用交叉熵loss和L1 loss,objectness loss用于监督客观性评分,用于识别是否存在对象。

2.2 trick的选择

  本文没有提出一种新的检测方法,而只是注重结合现有的trick来实现一种有效和高效的检测器。由于很多技巧不能直接应用于YOLOv3,所以本文需要根据它的结构进行调整。

  • Larger Batch Size
    使用更大的batch size可以提高训练的稳定性,得到更好的效果。本文将训练的batch size从64改为192,并相应地调整训练schedule和学习率。

  • EMA
    在训练一个模型时,保持训练参数的移动平均值通常是有益的。使用平均参数的评估有时会产生比最终训练值明显更好的结果。指数移动平均数(Exponential Moving Average,EMA)使用指数衰减来计算训练参数的移动平均数。对于每个参数W,保持一个阴影参数:
    W E M A = λ W E M A + ( 1 − λ ) W E M A W_{EMA}=\lambda W_{EMA}+(1-\lambda)W_{EMA} WEMA=λWEMA+(1λ)WEMA
    其中 λ \lambda λ是衰减因子,本文使用λ为0.9998的EMA,并使用阴影参数 W E M A W_{EMA} WEMA进行评估。

  • DropBlock
    DropBlock是dropout的一种形式,丢掉一些特征图相邻区域的单元。与原论文不同的是,本文只将DropBlock应用于FPN,因为研究发现在backbone中添加DropBlock会导致性能下降。DropBlock的详细注入点在图中用“三角形”标记。

  • IoU Loss
    边界框回归是目标检测的关键步骤,在YOLOv3中,边界框回归采用L1 loss。它不是为mAP评估指标定制的,它强烈依赖于交并比(IoU)。IoU loss和其他变形,如CIoU loss和GIoU loss已经被提出来解决这个问题。与YOLOv4不同的是,本文不直接用IoU loss代替l1 loss,而是添加了另一个分支来计算IoU loss。发现各种IoU loss的变体是相似的,所以本文选择了最基本的IoU loss。

  • IoU Aware
    在YOLOv3中,分类概率和objectness得分相乘得到最终的检测置信度,这没有考虑定位精度。为了解决这一问题,增加了一个IoU预测分支来测量定位的精度。在训练过程中,采用IoU aware loss对IoU预测分支进行训练。在推理过程中,将预测的IoU乘以分类概率和objectness得分,计算出最终的检测置信度,这与定位精度的相关性更强。最后,将最终的检测置信度用作后续NMS的输入。IoU aware分支将增加额外的计算成本。但是,只添加了0.01%的参数和0.0001%的FLOPs,这几乎可以忽略不计。

  • Grid Sensitive
    Grid Sensitive是在YOLOv4中引入的一个有效的技巧。当解码边界框中心x和y的坐标时,在原始的YOLOv3中,可以得到:
    在这里插入图片描述
    其中 σ \sigma σ s i g m o i d sigmoid sigmoid函数, g x g_x gx g y g_y gy是整数, s s s是一个尺度因子。很明显,因为 s i g m o i d sigmoid sigmoid很难完全等于0和1,所以 x x x y y y不能完全等于 s ⋅ g x s \cdot g_x sgx s ⋅ ( g x + 1 ) s \cdot (g_x+1) s(gx+1) 。这使得很难预测仅位于网格边界上的边界框的中心。为了解决这个问题,通过改变方程到:
    在这里插入图片描述
    在本文中 α \alpha α设置为1.05,这使得模型更容易预测哪些位于网格边界上的边界盒中心。Grid Sensitive所增加的FLOPs非常很小,可以完全忽略。

  • Matrix NMS
    Matrix NMS是由Soft-NMS修改得到的,Soft-NMS将其他检测分数衰减为重叠的单调递减函数。然而,这种过程像传统的贪婪NMS一样是顺序的,不能并行实现。Matrix NMS从另一个角度查看这个过程,并以并行的方式实现它。因此,Matrix NMS比传统的NMS速度快,不会带来任何效率损失。

  • CoordConv
    CoordConv通过使用额外的坐标通道提供卷积访问自己的输入坐标。CoordConv允许网络学习完全的翻转不变性或不同程度的翻转依赖性。考虑到CoordConv将向卷积层添加两个输入通道,因此会增加一些参数量和FLOPs。为了尽可能减少效率的损失,本文不改变backbone中的卷积层,只用CoordConv替换FPN中的1x1卷积层和检测头中的第一个卷积层。CoordConv的详细注入点在图中用“方块”标记。

  • SPP
    Spatial Pyramid Pooling (SPP)将SPM集成到CNN中,使用最大池化操作,而不是词袋操作。YOLOv4通过将最大池输出与内核大小k×k连接起来来应用SPP模块,其中k = {1,5,9,13},步幅等于1。在这种设计下,相对较大的最大池有效地增加了主干特征的接受域。具体来说,SPP只应用于顶部特征图,如图2中带有“星号”标记的位置。SPP本身不引入任何参数,但下面的卷积层的输入通道数会增加。所以引入了大约2%的额外参数量和1%的额外FLOPs。

  • Better Pretrain Model
    在ImageNet上使用具有较高分类精度的预训练模型可以获得更好的检测性能。本文使用蒸馏的ResNet50-vd模型作为Backbone,这显然不会影响检测器的效率。

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

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

相关文章

爬虫之selenium

目录 selenium介绍 基本使用 selenium用法 元素操作 等待元素被加载 元素各项属性 执行js代码 切换选项卡 浏览器前进后退 无界面浏览器 xpath的使用 简单介绍 selenium中使用 异常处理 登录获取cookie保存 动作链 打码平台使用(验证码破解) selenium介绍 由…

JavaScript -- 正则表达式及示例代码介绍

文章目录正则表达式1 正则表达式的介绍2 创建正则表达式3 通过整个表达式检查字符串是否符合规则4 正则表达式的基本语法5 提取符合规则的字符串6 例子正则表达式 1 正则表达式的介绍 正则表达式用来定义一个规则通过这个规则计算机可以检查一个字符串是否符合规则或者将字符…

python PyQt6 常用操作以及常见问题解决

因为需求需要写一个简单的Python GUI界面,期间遇到了一些问题,在这里记录下 安装PyQt6: pip install pyqt6使用QTDesigner绘制界面: 我使用Anaconda下载的pyqt6里已经自带了两种工具,下面只需要把工具导入到pycharm中&#xff0…

[附源码]计算机毕业设计旅游网的设计与实现Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

『Python学习笔记』使用Cython编程语言编译python文件

使用Cython编程语言编译python文件 文章目录一. Cython简介一. Cython编译2.1. 编译过程2.2. 环境安装2.3. disutils库2.4. 引入C源文件三. 总结参考文献一. Cython简介 Cython官网地址:https://cython.org/Cython的下载和安装:https://pypi.org/projec…

嵌入式分享合集117

一、获取STM32代码运行时间的技巧 测试代码的运行时间的两种方法: 使用单片机内部定时器,在待测程序段的开始启动定时器,在待测程序段的结尾关闭定时器。为了测量的准确性,要进行多次测量,并进行平均取值。 借助示波器…

NFV概述

NFV(网络功能虚拟化)是指利用虚拟化技术在标准化的通用IT设备(X86服务器,存储和交换设备)上实现各种网络功能。NFV的目标是取代通信网络中私有、专用和封闭的网元,实现统一通用硬件平台业务逻辑软件的开放架…

争议不断的AI绘画,靠什么成为了顶流?

今年以来,AIGC迅速崛起。所谓AIGC,即AI-Generated Content,指的是利用人工智能来生成内容,被认为是继专业产出内容(PGC)、用户产出内容(UGC)后的新型内容创作方式。不久前掀起热议的…

客户需求太多,如何有效沟通完成项目?

1、向客户明确:工作量、时间与质量的关系 需要想客户明确,某时间内在保障开发质量的前提下,实际的工作量。如果加大工作量,在赶工情况下,开发质量无法保障。如要保障开发质量,开发时间会延长,那…

【电力系统】基于Matlab实现风电光伏概率潮流计算

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

threejs官方demo学习(1):animation

前言 之前的threejs入门视频教学已经学习完了,下面会陆续学习官方demo。官方网址太卡了建议在本地进行搭建,具体见:threejs视频教程学习(1):本地搭建threeJS官网、渲染第一个场景 官方的例子都是html格式…

Qt源码编译aarch等架构可参考

前言: 我的建议是: 编译环境一定要有网络,依赖的包才可以方便安装!!! 一、准备工作 有网但ping不通、或者没有源的 可能需要先配置: 源路径: /etc/apt/source.list 系统默认DNS配置: /etc/r…

iTOP3588开发板编译Android内核方法一

iTOP3588开发板编译Android内核方法一: 在 Android 源码目录下执行如下命令编译 Android 内核: ./build.sh -CKA 编译完成后如下图所示: 编译后会在 rockdev/Image-rk3588_s 目录下生成 boot.img,boot.img 为内核镜像。boot.i…

《操作系统实战 45 讲》系统环境搭建 (Ubuntu + Vmware)

系统环境搭建 1. Ubuntu下载2. Vmware安装 Ubuntu系统2.1 配置电脑2.2 安装系统(Ubuntu16.04)3、配置网络和修改yum源3.1. 编辑 VMware 的网络配置3.2 windows 的网络配置3 .3 虚拟机网络 IP 修改地址配置3.4 修改yum源3.5 安装vm-tools1. Ubuntu下载 清…

【泊车】基于强化学习实现智能泊车附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

仿照string类,实现自定义My_strng类,以及相关操作

代码 #include <iostream> #include <cstring>using namespace std;class My_string { private:char* cstr;int len; public:My_string():cstr(NULL),len(0) //无参构造{}My_string(const char* str) //有参构造{this->len strlen(s…

【C++笔试强训】第二天

选择题 1.使用printf函数打印一个double类型的数据&#xff0c;要求&#xff1a;输出为10进制&#xff0c;输出左对齐30个字符&#xff0c;4位精度。以下哪个选项是正确的&#xff1f; A %-30.4e B %4.30e C %-30.4f D %-4.30f 对于 %m.nf &#xff0c;double对应%f.要求打印…

爬虫之Scrapy架构

目录 Scrapy架构介绍 Scrapy下载 Scrapy基本使用 Scrapy目录结构 Scrapy解析数据 settings相关配置 基础配置 增加爬虫的爬取效率 去重规则&#xff08;布隆过滤器&#xff09; 持久化方案(数据保存) request和response传递参数 网页解析下一页继续爬取 爬虫和下载…

Java安全之深入了解SQL注入

深入了解Java中的SQL注入 本文以代码实例复现了Java中JDBC及Mybatis框架采用预编译和非预编译时可能存在SQL注入的几种情况&#xff0c;并给予修复建议。 JDBC 首先看第一段代码&#xff0c;使用了远古时期的JDBC并且并没有使用预编译。这种简单的字符串拼接就存在SQL注入 …

信息化带来的制造业生产管理系统究竟有哪些作用呢?

制造业是一个现代国家的经济基础&#xff0c;决定着着国家的兴衰存亡。长期以来人们和国家都对制造业给予高度重视&#xff0c;无论是资金投入还是管理的手段和方法的提高&#xff0c;制造业在生产行业中的优势越来越明显。尤其是随着科学技术的快速发展&#xff0c;制造业的现…