PP-YOLO: An Effective and Efficient Implementation of Object Detector(2020.8)


文章目录

  • Abstract
  • 1. Introduction
    • 先介绍了一堆前人的work
    • 自己的work
    • expect
  • 2. Related Work
    • 先介绍别人的work
    • 与我们的区别
  • 3.Method
    • 3.1. Architecture
      • Backbone
      • Detection Neck
      • Detection Head
    • 3.2. Selection of Tricks
      • Larger Batch Size
      • EMA
      • DropBlock
      • IoULoss
      • IoU Aware
      • Grid Sensitive
      • Matrix NMS
      • CoordConv
      • SPP
      • Better Pretrain Model
  • 4. Experiment
  • 5. Conclusions

原文链接
源代码

Abstract

目标检测是计算机视觉研究的重要领域之一,在各种实际场景中起着至关重要的作用。在实际应用中,由于硬件的限制,往往需要牺牲精度来保证检测器的推断速度。因此,必须考虑目标检测器的有效性和效率之间的平衡
本文的目标是实现一种可以直接应用于实际应用场景的效果和效率相对平衡的目标检测器,而不是提出一种新的检测模型
鉴于YOLOv3在实际中得到了广泛的应用,我们开发了一种基于YOLOv3的新型目标检测器。我们主要尝试结合现有的各种几乎不增加模型参数和FLOPs数量的技巧,以达到在保证速度几乎不变的情况下尽可能提高检测器精度的目的
由于本文所有的实验都是基于PaddlePaddle进行的,所以我们称之为PP- YOLO。通过结合多种技巧,PP-YOLO可以在效率(45.2% mAP)和效率(72.9 FPS)之间取得更好的平衡,超过了现有的最先进的探测器,如EfficientDet和YOLOv4

1. Introduction

先介绍了一堆前人的work

自己的work

本文介绍了一种基于PaddlePaddle的改进YOLOv3模型(PP-YOLO),添加了一些几乎不会增加推断时间的技巧来提高模型的整体性能( bag of freebies)
与YOLOv4不同,我们没有探索不同的骨干网络和数据增强方法,也没有使用NAS搜索超参数
对于骨干网,我们直接使用最常见的ResNet[13]作为PP-YOLO的骨干网
对于数据增强,我们直接使用了最基本的MixUp[43]
一个原因是ResNet的使用更加广泛,各种深度学习框架都针对ResNet系列进行了深度优化,在实际部署中会更加方便,在实践中会有更好的推断速度
另一个原因是主干网的替换和数据扩充是相对独立的因素,与本文讨论的技巧几乎无关
用NAS搜索超参数通常会消耗更多的计算能力,因此通常没有条件在每个新场景中使用NAS执行超参数搜索
因此,我们仍然使用YOLOv3[32]后面手动设置的参数

expect

本文的重点是如何将一些不影响效率的有效技巧叠加起来,从而获得更好的性能
本文并不打算介绍一种新的目标检测器,它更像是一个食谱,告诉你如何一步一步地制造一个更好的检测器。我们发现了一些对YOLOv3检测器有效的技巧,可以节省开发人员的试错时间。最终的PP-YOLO模型将COCO上的mAP从43.5%提高到45.2%,速度比YOLOv4快

2. Related Work

先介绍别人的work

近两年来,人们提出了大量新的无锚法,它们可以分为两种类型
基于锚点的检测器基于锚点而不是锚盒进行对象边界盒回归,包括FSAF[49]、FCOS[36]、FoveaBox[17]、SAPD[48]
基于关键点的检测器将目标检测重新定义为关键点局部化问题,包括CornerNet[19]、CenterNet[8]、ExtremeNet[47]和RepPoint[40]
无锚方法打破了手工锚的限制,显示出极端物体尺度和宽高比[16]的巨大潜力
YOLO系列探测器[30,31,32,1]由于其优异的有效性和高效性,在实践中得到了广泛的应用
YOLOv4讨论了大量的技巧,包括许多不会增加推理时间的“bag of freebies”,以及一些少量增加推理成本但能显著提高目标检测精度的“特价包”。YOLOv4极大地提高了YOLOv3[32]的有效性和效率

与我们的区别

本文也是基于YOLOv3模型开发的,也探索了很多技巧。与YOLOV4不同的是,我们没有探索一些被广泛研究的部分,如数据增强和骨干。本文讨论的许多技巧与YOLOV4不同,技巧的详细实现也不同

3.Method

基于单阶段锚点的检测器通常由主干网、检测颈部(典型的特征金字塔网络(FPN))和用于目标分类和定位的检测头部组成。它们也是大多数基于锚点的一级无锚探测器中常见的元件。我们首先对YOLOv3的详细结构进行了修改,并引入了一个修改版本,将主干替换为ResNet50-vd-dcn,作为本文的基本基线。然后我们介绍了一堆技巧,可以提高YOLOv3的性能,几乎不损失效率

3.1. Architecture


YOLOv3的整体架构如图2所示

Backbone

在原始的YOLOv3[32]中,首先使用DarkNet-53提取不同尺度的特征图,我们在PP-YOLO中用ResNet50-vd取代了原来的主干DarkNet-53。考虑直接用ResNet50-vd替代DarkNet-53会影响YOLOv3探测器的性能。我们用可变形的卷积层替换了ResNet50-vd中的一些卷积层
为了平衡效率和有效性,我们只在最后阶段用DCNs替换3 × 3卷积层。我们将这个修改后的主干命名为ResNet50-vd-dcn,并将第3,4和5阶段的输出命名为c3, c4, c5

Detection Neck

使用FPN[21]构建特征映射之间具有横向连接的特征金字塔。特征映射c3、c4、c5输入到FPN模块,我们将金字塔层1的输出特征映射表示为pl,其中在我们的实验中l = 3,4,5。对于尺寸为W × H的输入图像,p1的分辨率为W/2的l次方 × H/2的l次方

Detection Head

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

3.2. Selection of Tricks

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

Larger Batch Size

使用更大的批大小可以提高训练的稳定性,得到更好的结果。这里我们将训练批大小从64个更改为192个,并相应地调整训练计划和学习率

EMA

在训练模型时,保持训练参数的移动平均线通常是有益的。使用平均参数的评估有时会产生比最终训练值[35]好得多的结果。指数移动平均线(EMA)使用指数衰减计算训练参数的移动平均线。对于每个参数W,我们维持一个shadow参数

其中λ是衰减。我们采用衰减λ为0.9998的EMA,并使用阴影参数Wema进行评估

DropBlock

与原论文不同的是,我们只在FPN中应用DropBlock,因为我们发现在骨干网络中添加DropBlock会导致性能下降。DropBlock的详细注入点在图2中用“三角形”标记

IoULoss

边界盒回归是目标检测的关键步骤。在YOLOv3中,采用L1损失进行边界盒回归。它不适合mAP评估度量,它强烈地依赖于交联(IoU)。为了解决这一问题,已经提出了IoU损失和其他变化,如CIoU损失和GIoU损失[46,34]。与YOLOv4不同的是,我们没有直接用IoU损失代替L1损失,我们增加了一个分支来计算IoU损失。我们发现各种IoU损失的改进是相似的,所以我们选择了最基本的IoU损耗

IoU Aware

在YOLOv3中,分类概率和客观得分相乘作为最终检测置信度,不考虑定位精度。为了解决这一问题增加了IoU预测分支来衡量定位的准确性。在训练过程中,采用IoU感知损失训练IoU预测分支。在推理过程中,将预测的IoU与分类概率和客观评分相乘,计算出与定位精度更相关的最终检测置信度。然后将最终检测置信度用作后续NMS的输入。IoU感知分支会增加额外的计算成本。但是,只增加了0.01%的参数个数和0.0001%的flop,几乎可以忽略不计

Grid Sensitive

网格敏感是YOLOv4引入的一种有效的技巧。当我们解码边界框中心x和y的坐标时,在原始的YOLOv3中,我们可以得到它们

其中σ是s型函数,gx和gy是整数,s是比例因子

显然,x和y不能完全等于s·g x或s·(g x + 1),这使得很难预测刚刚位于网格边界上的边界框的中心。我们可以解决这个问题,把方程变成

其中,本文将α设为1.05。这使得模型更容易准确地预测网格边界上的边界框中心。GridSensitive增加的FLOPs非常小,完全可以忽略

Matrix NMS

矩阵NMS是由软NMS驱动的,它将其他检测分数作为它们重叠的单调递减函数来衰减。但是,这个过程像传统的贪心NMS一样是顺序的,不能并行实现。Matrix NMS从另一个角度看待这个过程,并以并行的方式实现它。因此,矩阵网管比传统网管速度更快,不会带来任何效率损失

CoordConv

CoordConv,它的工作原理是通过使用额外的坐标通道让卷积访问自己的输入坐标。CoordConv允许网络学习完全的平移不变性或不同程度的平移依赖性。考虑到CoordConv将在卷积层中增加两个输入通道,因此将增加一些参数和FLOPs。为了尽可能减少效率的损失,我们不改变骨干中的卷积层,只将FPN中的1x1卷积层和检测头中的第1卷积层替换为CoordConv。CoordConv的详细注入点在图2中用“菱形”标记

SPP

空间金字塔池(SPP)是由He等人首先提出的。SPP将SPM集成到CNN中,使用最大池化操作代替 bag-of-word操作。YOLOv4通过连接内核大小为k × k的最大池输出来应用SPP模块,其中k = {1,5,9,13}, stride = 1。在这种设计下,较大的k × k最大池化有效地增加了骨干特征的接受场。具体而言,SPP仅应用于图2中带有“星号”标记的顶部特征图。SPP本身不引入任何参数,但接下来的卷积层的输入通道数量会增加。因此,大约2%的额外参数和1%的额外flop被引入

Better Pretrain Model

在ImageNet上使用分类精度更高的预训练模型可以获得更好的检测性能。这里我们使用蒸馏的ResNet50-vd模型作为预训练模型[29]。这显然不影响检测器的效率

4. Experiment


5. Conclusions

文介绍了一种基于PaddlePaddle的目标检测器的新实现,称为PP-YOLO
PP- YOLO比其他最先进的探测器(如EfficientDet和YOLOv4)更快(FPS)和更准确(COCO mAP)
在本文中,我们探索了许多技巧,并展示了如何在YOLOv3检测器上组合这些技巧并演示了它们的有效性
我们希望本文能够帮助开发人员和研究人员节省探索时间,并在实际应用中获得更好的性能

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python 随机密码生成器

最近在研究PySimpleGUI库,把之前写的一个随机密码生成器改成GUI版本发出来,有兴趣的兄弟们可以拿走。 因为能力有限,目前只能写生成一个随机密码的Gui版本,等我学了更多的内容再慢慢完善。 核心代码很简单,界面也很粗陋…

2023年华为杯数学建模E题——代码复盘(第一问)

2023年华为杯数学建模E题 代码复盘 写在最前面目录问题1a计算时间间隔思路说明代码输出结果 插值求解思路代码输出结果 绘图绘制3D图(待修改) 问题1b数据预处理思路代码 模型训练思路代码输出结果网格调参代码输出结果 写在最前面 超开心又有点遗憾 结果…

Vue3 watch监视和watchEffect函数

Vue3 中的watch使用效果和Vue2 中配置watch配置项的使用效果是一致的。 使用watch监视之前,需要先对watch进行引入。 import {watch} from vue; 一、监视一个ref对象 以下情况只适用于监视一个ref对象。 watch(监视对象, (newValue, oldValue) > { // 监视操作…

使用清华智谱ChatGLM2大模型搭建本地私有知识库

首先放上该方案项目的git地址:https://github.com/chatchat-space/Langchain-Chatchat 以下是我的搭建和踩坑经验记录 一、环境准备 1、python安装 在环境中安装python,我安装的是3.9版本的python,官方要求的是Python 3.8 - 3.10 版本。不知…

Java学习之路 —— Day1(环境配置、变量)

文章目录 前言1. 搭建Java开发环境1.1 下载java1.2 JDK组成1.3 使用idea开发 2. java基本语法2.1 变量类型2.2 Scanner输入2.3 随机数2.4 数组 前言 已经好久没有写博客了,打开这个网站有一种熟悉又陌生的感觉。 前段时间一直在准备秋招,现在也告一段落…

【C++代码】最接近的三数之和,括号生成,合并两个有序链表,合并 K 个升序链表

题目&#xff1a;最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 ""。 class Solution { public:string longestCommonPrefix(vector<string>& strs) {string res"";int index 0; f…

专题知识点-二叉树-(非常有意义的一篇文章)

这里写目录标题 二叉树的基础知识知识点一(二叉树性质 )树与二叉树的相互转换二叉树的遍历层次优先遍历树的深度和广度优先遍历中序线索二叉树二叉树相关遍历代码顺序存储和链式存储二叉树的遍历二叉树的相关例题左右两边表达式求值求树的深度找数找第k个数二叉树非递归遍历代码…

Swift 警惕“隐式异步(implicitly asynchronous)”方法的执行陷阱

概览 actor 是 Swift 5.5 中一个“不可思议”的新类型&#xff0c;可以把它看做成一个数据同步器。actor 中所有属性和方法都会被自动“串行”&#xff08;serializes&#xff09;访问和执行&#xff0c;从而有效避免了数据竞争的发生。 不过&#xff0c;在一些微妙的情境下使…

笔记51:循环神经网络入门

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\循环神经网络 a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a

29.第三方登录

1►第三方登录 当今社会&#xff0c;微信登录、QQ登录、抖音登录等等三方登录已经层出不穷&#xff0c;学会三方登录势在必行。 微信登录要认证开发者&#xff0c;必须为企业&#xff0c;个人不行&#xff0c;而且还要交300块钱。 QQ登录也要申请、微博登录也要申请。 还好…

ppt画思路图 流程图 医学药学生画图素材

关注微信&#xff0c;回复: 素材 &#xff0c;即可领取

基于 React 的 HT for Web ,由厦门图扑团队开发和维护 - 用于 2D/3D 图形渲染和交互

本心、输入输出、结果 文章目录 基于 React 的 HT for Web &#xff0c;由厦门图扑团队开发和维护 - 用于 2D/3D 图形渲染和交互前言什么是 HT for WebHT for Web 的特点如何使用 HT for Web相关链接弘扬爱国精神 基于 React 的 HT for Web &#xff0c;由厦门图扑团队开发和维…

基于闪电搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于闪电搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于闪电搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于闪电搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

任意文件读取漏洞 (Arbitrary File Read/Download Vulnerability)

任意文件读取漏洞 文章目录 任意文件读取漏洞漏洞场景漏洞危害漏洞分类任意文件读取重要函数readfile()file_get_contents()fread()$_GET任意文件读取 任意文件下载html实现a标签PHP实现任意文件下载 任意⽂件读取攻防过滤../防守绕过 任意文件读取挖掘漏洞防御 ​ 一些网站的需…

十年测试告诉你35岁测试程序员,互联网技术岗,何去何从?

今年的就业情形&#xff0c;想必大家都深有感触。企业裁员&#xff0c;求职市场岗位大幅减少&#xff1b;薪资降低&#xff0c;岗位能力要求越来越高&#xff1b;好像一瞬间大家都从万米高空坠落&#xff0c;失重带来的眩晕和迷茫&#xff0c;让求职者和招聘企业都显得有点手忙…

路由器ipsec|vpn实验分析

AR1 和 AR2代表两个公司的出口&#xff0c;R2模拟互联&#xff0c;两个公司通信&#xff0c;通过ipsec vpn 加密隧道进行业务通信 切记&#xff1a;ipsec 路由器一定用AR系列&#xff0c;千万别用R&#xff0c;否则会给你惊喜 R2只有接口配ip&#xff0c;无任何配置&#xff…

【Err】jetBrains远程开发报错:Failed to exec spawn helper: pid: 18310, exit value: 1

最近双11阿里云打折&#xff0c;买了台服务器做了下远程开发环境&#xff0c;在IDEA远程开发时遇到了个问题&#xff0c;导致项目启动失败&#xff0c;报错如下&#xff1a; JetBrains远程开发报错 Failed to exec spawn helper: pid: 18310, exit value: 1 &#xff08;我改好…

解析SQL 获取表、字段及SQL查询参数

解析SQL 获取表、字段及SQL查询参数 1. 执行效果2. 使用2.1 引入依赖2.2 相关实体2.3 工具类 1. 执行效果 2. 使用 2.1 引入依赖 <!-- sql 解析处理--><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifa…

Potrace:一个基于多边形的跟踪算法

Potrace算法通过几个步骤将位图转换为矢量轮廓。 第一步&#xff0c;将位图分解为若干条路径&#xff0c;在黑白区域间形成边界。 在第二步中&#xff0c;每条路径由一个最优多边形逼近。 在第三步中&#xff0c;每个多边形被转换成光滑的轮廓。 在可选的第四步中&#xff0c;通…

【管理运筹学】运筹学“背诵手册”(二) | 对偶理论与灵敏度分析

二、对偶理论与灵敏度分析 用矩阵形式表示原问题和对偶问题&#xff1a; max ⁡ z C X s . t . { A X ≤ b X ≥ 0 \max z\pmb{CX}\\ s.t.\begin{cases} \pmb{AX\leq b} \\ \pmb{X}\geq\pmb{0} \end{cases} maxzCXs.t.{AX≤bX≥0​ 其中 C ( c 1 , c 2 , ⋯ , c n ) , X (…