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

news/2024/7/10 1:46:33 标签: YOLO, 深度学习, 目标检测


文章目录

  • 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检测器上组合这些技巧并演示了它们的有效性
我们希望本文能够帮助开发人员和研究人员节省探索时间,并在实际应用中获得更好的性能


http://www.niftyadmin.cn/n/5180155.html

相关文章

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

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

Spring面试题:(七)Spring AOP思想及实现

AOP思想的概念 AOP的实现:动态代理技术 通过spring容器获取目标对象和增强对象,通过动态代理生产代理对象,在目标对象的目标方法执行增强方法,返回生成代理对象给spring容器,在获取bean时则获取代理对象。 JDK代理和…

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

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

Java的XWPFTemplate word生成列表

Java的XWPFTemplate工具类导出word.docx的使用_xwpftemplate 语法_youmdt的博客-CSDN博客 如果是表格的列表参考上面这篇文章即可,比较复杂的列表遍历暂时还没找到方法,只能手动创建表格了 上面是模板,非常简单,以为我们是要自己创…

Pytorch数据集读出到transform全过程

最近写代码又遇见了这个问题,又忘记了,于是写一篇博客记录一下。 一般我们使用pytorch获取CIFAR10数据集,一般这样写: mean [0.4914, 0.4822, 0.4465] std [0.2023, 0.1994, 0.2010] transform transforms.Compose([transform…

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) > { // 监视操作…

OpenAI 的 CEO Sam Altman :OpenAI 正在研发下一代 AI 模型 GPT-5 但没有承诺发布时间

本心、输入输出、结果 文章目录 OpenAI 的 CEO Sam Altman :OpenAI 正在研发下一代 AI 模型 GPT-5 但没有承诺发布时间前言Sam Altman 接受《金融时报》的采访 消息汇总GPT-4 turboOpenAI 目标 AGI (通用人工智能)弘扬爱国精神OpenAI 的 CEO Sam Altman :OpenAI 正在研发下…