PP-YOLOE: An evolved version of YOLO
Abstract
- 在本报告中,我们介绍了PP-YOLOE,一种具有高性能和友好部署的工业最先进的目标探测器。我们在之前的PP-YOLOv2的基础上进行优化,采用无锚模式,更强大的骨干和颈部配备CSPRepResStage, ET-head和动态标签分配算法TAL。我们为不同的实践场景提供s/m/l/x模型。结果,pp - yoloe - 1在COCO测试开发上实现了51.4 mAP,在Tesla V100上实现了78.1 FPS,与之前的先进工业车型PP-YOLOv2和YOLOX相比,分别实现了(+1.9 AP, +13.35%提速)和(+1.3 AP, +24.96%提速)的显著提升。在TensorRT和fp16精度下,PP-YOLOE推理速度达到149.2 FPS。我们还进行了大量的实验来验证我们设计的有效性。源代码和预训练模型可在PaddleDetection PaddlePaddle/PaddleDetection: Object Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection. (github.com)。
- 论文地址:[2203.16250] PP-YOLOE: An evolved version of YOLO (arxiv.org)
- 首先PP-YOLOE-l 在COCO数据集上达到了51.4mAP。相比较PP-YOLOv2提升1.9AP和13.35%的速度,相比较YOLOX提升1.3AP和24.96%的速度。PP-YOLOE中主要的改进点是:anchor-free,powerful backbone and neck,TAL动态label assign,ET-head。
- 该检测器的设计机制包括:Anchor free无锚盒机制,可扩展的backbone和neck,由CSPRepResStage(CSPNet+RMNet)构成,使用Varifocal Loss(VFL)和Distribution focal loss(DFL)的头部机制ET-head,动态标签分配算法Task Alignment Learning(TAL)
Introduction
-
单级目标检测器由于具有良好的速度和精度平衡,在实时应用中很受欢迎。单级探测器中最突出的结构是YOLO系列。自YOLOv1以来,YOLO系列目标检测器在网络结构、标签分配等方面发生了巨大的变化。目前,YOLOX在Tesla V100上以68.9 FPS的速度实现了50.1 mAP的速度和精度的最佳平衡。
-
YOLOX引入了先进的无锚方法,配备了动态标签分配,提高了探测器的性能,在精度上明显优于YOLOv5。受YOLOX的启发,我们进一步优化了之前的作品PP-YOLOv2。PP-YOLOv2是一款高性能一级探测器,在特斯拉V100上具有49.5 mAP, 68.9 FPS的速度。在PP-YOLOv2的基础上,提出了YOLO的演进版本,命名为PP-YOLOE。PP-YOLOE避免使用可变形卷积和矩阵NMS等算子,以便在各种硬件上得到很好的支持。此外,PPYOLOE可以轻松扩展到具有不同计算能力的各种硬件的一系列模型。这些特点进一步推动了PP-YOLOE在更广泛的实际场景中的应用。
-
如图所示,PP-YOLOE在速度和精度权衡方面优于YOLOv5和YOLOX。具体而言,pp - yoloe - 1以 78.1 FPS的速度在640 × 640分辨率的COCO上实现了51.4 mAP,比pp - yolo2 和yolox - 1分别高出1.9%和1.3% AP。此外,PP-YOLOE有一系列型号,可以像YOLOv5一样通过宽度乘倍器和深度乘倍器进行简单配置。我们的代码已经在PaddleDetection上发布,支持TensorRT和ONNX。
-
PP-YOLOE与其他先进型号的比较。pp - yoloe - l在COCO测试开发上实现了51.4 mAP,在Tesla V100上实现了78.1 FPS,比pp - yoloe - v2获得了1.9 AP和9.2 FPS的提升。
-
PP-YOLOv2的总体情况包括:(1)backbone:具有可变形卷积的ResNet50-vd;(2)neck:具有SPP层的PAN,DropBlock;(3)head:轻量级的IoU感知;(4)激活函数:在backbone中使用ReLU激活,neck中使用Mish激活;(5)标签分配:为每个ground truth目标分配一个anchor box;(6)损失:分类损失、回归损失、目标损失,IoU损失和IoU感知损失;
-
PP-YOLOE是基于PP-YOLOv2的卓越的单阶段Anchor-free模型,超越了多种流行的YOLO模型。PP-YOLOE有一系列的模型,即s/m/l/x,可以通过width multiplier和depth multiplier配置。PP-YOLOE避免了使用诸如Deformable Convolution或者Matrix NMS之类的特殊算子,以使其能轻松地部署在多种多样的硬件上。
-
PPYOLOE中的anchor free方法,主要就是将之前anchor base中预测相较于anchor的xywh,改进为预测ltrb(left,top,right,bottom),并将ltrb结果乘上当前特征图的stride。
Method
-
在本节中,我们将首先回顾我们的基线模型,然后从网络结构、标签分配策略、头部结构和损失函数等方面详细介绍PP-YOLOE的设计(下图)。
-
我们PP-YOLOE的模型架构。主干是CSPRepResNet,颈部是Path Aggregation Network (PAN),头部是Efficient Task-aligned head (ET-head)。
A Brief Review of PP-YOLOv2
- PP-YOLOv2的整体架构包括具有可变形卷积的ResNet50-vd 主干、具有SPP层和DropBlock的PAN主干和轻量级IoU感知头。在PPYOLOv2中,主干使用ReLU激活函数,颈部使用mish激活函数。继YOLOv3之后,PP-YOLOv2只为每个 GT 值对象分配一个锚框。除了分类损失、回归损失和对象损失外,PP-YOLOv2还使用IoU损失和IoU感知损失来提高性能。
Improvement of PP-YOLOE
-
Anchor-free。如上所述,PP-YOLOv2以基于锚点的方式分配基础真理。然而,锚定机制引入了许多超参数,并且依赖于手工设计,这可能不能很好地推广到其他数据集。基于以上原因,我们在PP-YOLOv2中引入无锚法。根据FCOS[26]在每个像素上贴合一个锚点,我们为三个检测头设置上下限,将ground truth分配给相应的feature map。然后,计算边界框的中心,选择最接近的像素作为正样本。根据YOLO序列,预测一个四维向量(x, y, w, h)进行回归。这个修改使模型更快了一点,损失了0.3 AP,如表2所示。虽然根据PPYOLOv2的锚点尺寸仔细设置了上界和下界,但基于锚点和无锚点的赋值结果仍然存在一些小的不一致,这可能导致精度下降不大。PPYOLOE解析1 Backbone - 飞桨AI Studio (baidu.com)
-
Backbone and Neck。残差连接和密集连接在现代卷积神经网络中得到了广泛的应用。残差连接引入了解决梯度消失问题的捷径,也可以看作是一种模型集成方法。密集连接集合了具有不同接收域的中间特征,在目标检测任务中表现出良好的性能。CSPNet利用跨级密集连接来降低计算负担而不损失精度,这种方法在YOLOv5、YOLOX等有效的目标检测器中很流行。VoVNet和随后的TreeNet在对象检测和实例分割方面也表现出优异的性能。受这些作品的启发,我们提出了一种结合残差连接和密集连接的新型RepResBlock,用于我们的Backbone and Neck。
-
源自TreeBlock,我们的RepResBlock在训练阶段如下图(b)所示,在推理阶段如下图©所示。首先,我们对原始TreeBlock进行简化(下图(a))。然后,我们用元素相加操作代替连接操作(下图(b)),因为RMNet在某种程度上显示了这两种操作的近似。因此,在推理阶段,我们可以将RepResBlock重新参数化为ResNet-34以RepVGG风格使用的基本残差块(下图©)。
-
我们的RepResBlock和CSPRepResStage的结构
-
我们使用所提出的RepResBlock来构建Backbone and Neck。与ResNet类似,我们的主干名为CSPRepResNet,包含一个由三个卷积层组成的主干,以及由我们的RepResBlock堆叠的四个后续阶段,如上图(d)所示。在每一步中,采用跨阶段部分连接,避免了大量 3 × 3 卷积层带来的大量参数和计算负担。ESE(有效挤压和提取)层也用于在构建主干时在每个CSPRepResStage中施加信道注意。我们在PP-YOLOv2之后使用所提出的RepResBlock和CSPRepResStage构建颈部。与主干不同的是,主干去掉了RepResBlock中的残差链接和CSPRepResStage中的ESE层。
-
我们使用宽度乘法器α和深度乘法器β像YOLOv5一样对基本 Backbone and Neck 进行联合缩放。因此,我们可以得到一系列具有不同参数和计算量的检测网络。基本骨干宽度设置为[64,128,256,512,1024]。除主干外,基本主干的深度设置为[3,6,6,3]。基本颈宽设置为[192,384,768],深度设置为3。下表给出了不同模型的宽度乘法器α和深度乘法器β的规格。
-
宽度乘法器α和深度乘法器β规范的一系列网络
-
这样的修改使AP性能提高了0.7%,即49.5%,如下表所示。
-
pp - yoloe - l在COCO val上的烧蚀研究。我们使用640×640分辨率作为输入,采用fp32精度,在特斯拉V100上进行测试,不进行后处理。
-
任务一致性学习(TAL)。为了进一步提高准确性,标签分配是另一个需要考虑的方面。YOLOX使用SimOTA作为标签分配策略来提高性能。然而,为了进一步克服分类和定位的错位,在 TOOD 中提出了任务对齐学习(task alignment learning, TAL),它由动态标签分配和任务对齐损失组成。动态标签分配意味着预测/损失意识。根据预测,为每个真值分配动态的正锚点个数。通过显式地对齐这两个任务,TAL可以同时获得最高的分类分数和最精确的边界框。在PP-YOLOE训练时,前5个epoch是使用ATSS中的分配方式,后续的epochs才使用TAL作为label assign方式。主要原因是TAL需要模型具有一定表现的基础上,才能具有比较好的分配效果。
-
比较值得注意的是,往常我们在计算class分支的loss时候,使用BCEloss时候,输入分别是pred_score和label_one_hot向量。而在PP-YOLOE中,将label_one_hot向量替换成了TAL分配时的alignment metric。alignment metric中分数越高,就意味着越是高质量样本,模型希望高质量样本拥有更高的class score。
-
对于与任务对齐的损失,TOOD使用一个归一化的 t,即 t ^ \hat{t} t^ 来代替损失中的目标。它采用每个实例中最大的IoU作为规范化。分类的二进制交叉熵(Binary Cross Entropy, BCE)可以重写为:
- L c l s − p o s = ∑ i = 1 N p o s B C E ( p i , t i ^ ) , ( 1 ) L_{cls-pos}=\sum_{i=1}^{N_{pos}}BCE(p_i,\hat{t_i}),(1) Lcls−pos=i=1∑NposBCE(pi,ti^),(1)
-
我们研究了使用不同标签分配策略的性能。本文以CSPRepResNet为骨干,在上述改进的模型上进行了实验。为了快速得到验证结果,我们只在COCO train2017上训练了36个epoch,并在COCO val上进行验证,如下表所示,TAL达到了最佳的45.2% AP性能。我们使用TAL替代标签分配,如FCOS样式,并实现0.9% AP改进- 50.4% AP,如上表所示。
-
不同的标签分配在基本模型上。我们使用CSPRepResStage作为主干和颈部,一个1×1 conv层作为头部,在COCO train2017上只训练了36个epoch。
-
高效任务对齐头(ET-head)。在目标检测中,分类与定位之间的任务冲突是一个众所周知的问题。许多文献都提出了相应的解决方案。YOLOX的解耦头吸取了大多数一级和二级检测器的经验,并成功应用于YOLO模型,提高了精度。但是,解耦的头部可能会使分类和定位任务分离和独立,缺乏针对任务的学习。在TOOD的基础上,我们改进了头,提出了以速度和精度为目标的ET-head。如图上所示,我们使用ESE取代了tod中的层关注,将分类分支的对齐简化为shortcut,将回归分支的对齐替换为分布焦损(distributed focal loss, DFL)层。通过上述变化,ET-head在V100上增加了0.9ms。
-
对于分类和定位任务的学习,我们分别选择了变焦损失(VFL)和分布焦损失(DFL)。PP-Picodet成功地将VFL和DFL应用于目标检测器,并获得了性能提升。对于VFL,与[Generalized focal loss]中的质量焦点损失(quality focal loss, QFL)不同,VFL使用目标分数来加权阳性样本的损失。这种实现使得高IoU的阳性样本对损失的贡献相对较大。这也使得模型在训练时更加关注高质量的样本,而不是那些低质量的样本。相同的是,两者都使用IACS作为预测的目标。这可以有效地学习分类分数和定位质量估计的联合表示,使训练和推理之间具有较高的一致性。对于DFL,为了解决边界框表示不灵活的问题,[Generalized focal loss]提出使用一般分布来预测边界框。我们的模型由损失函数监督:
-
L o s s = α ⋅ L o s s V F L + β ⋅ L o s s G I O U + γ ⋅ L o s s D F L ∑ i N p o s t ^ , ( 2 ) Loss=\frac{\alpha·Loss_{VFL}+\beta ·Loss_{GIOU}+\gamma ·Loss_{DFL}}{\sum^{N_{pos}}_i\hat t},(2) Loss=∑iNpost^α⋅LossVFL+β⋅LossGIOU+γ⋅LossDFL,(2)
-
其中, t ^ \hat t t^表示归一化目标得分,见式(1)。如上表所示,ET-head获得0.5% AP改善- 50.9% AP
-
-
分类分支:VFL提出了非对称的加权操作。正负样本有不平衡的问题,同样在正样本中也有不等权的问题,意思就是要更多的发现有价值的正样本。在为负样本的时候,不同的负样本的weight主要由当前pred_score决定,pred_score越大,weight越大,loss越大。而在为正样本的时候,weight为gt_score,而gt_score来源于TAL assign时。这也就达到了①正样本和负样本权重计算方式不同,②每个正负样本在计算loss时的权重都是不同的,达到了非对称的加权操作。
-
回归分支:目标检测任务中做回归一般是直接预测某个回归值,或者预测相较于anchor的比例,而distribution focal loss (DFL)作者认为之前的bbox regression 采用的表示不够灵活,没有办法建模复杂场景下的uncertainty。用直接回归一个任意分布来建模框的表示可以有更好的效果。在PP-YOLOE中,将回归看作是一个分布预测任务。
Experiment
- 在本节中,我们给出了实验的细节和结果。所有实验都在MS COCO-2017训练集上进行训练,该训练集有80个类,118k张图像。对于消融研究,我们在5000张图像的MS COCO-2017验证集上使用具有单一尺度的标准COCO AP度量。我们使用MS COCO-2017 test-dev报告最终结果。
Implementation details
- 我们使用随机梯度下降(SGD),动量= 0.9,权重衰减= 5e-4。我们使用余弦学习率计划,总epochs为300次,热身次数为5次,基本学习率为0.01。在8 × 32 G V100 GPU设备上,总批大小默认为64个,我们遵循线性缩放规则来调整学习率。在训练过程中也采用衰减= 0.9998的指数移动平均(EMA)策略。我们只使用一些基本的数据增强,包括随机裁剪、随机水平翻转、颜色失真和多尺度。特别地,输入大小均匀地从320绘制到768,步幅为32。
Comparsion with Other SOTA Detectors
-
下表显示了MS-COCO测试分裂与其他最先进的目标检测器的结果比较。我们使用官方代码库重新评估YOLOv5和YOLOX,因为它们有非预定的更新。我们比较了批处理大小= 1(没有数据预处理和非最大抑制)的模型推理速度。而PP-YOLOE系列采用桨叶推理引擎。此外,为了公平比较,我们还在相同的环境下测试了基于tensorRT 6.0的FP16精度速度。应该强调的是,PaddlePaddle2正式支持用于模型部署的tensorRT。因此,PPYOLOE可以直接使用带有tensorRT的桨叶推理,其他测试遵循官方指南。
-
不同目标检测器在COCO 2017测试开发中的速度和精度比较。标注“+”的结果为官方发布的更新结果。用“*”标记的结果在我们的环境中使用官方代码库和模型进行测试。在验证和速度测试中,YOLOv5的输入大小不是640 × 640的平方,所以我们在表中跳过它。默认精度的速度是FP32的无trt和FP16的有trt。此外,我们为YOLOX w/o trt场景提供了FP32和FP16, FP32的速度在分割线的左侧,FP16的速度在右侧。PP-YOLOE+使用在Objects365数据集上预训练的模型。
Conclusion
-
在本报告中,我们提出了PPYOLOv2的几个更新,包括可扩展的主干颈架构,高效的任务对齐头,先进的标签分配策略和改进的目标损失函数,形成了一系列高性能的目标检测器,称为PP-YOLOE。同时,我们提出了s/m/l/x模型,可以覆盖不同的实际场景。此外,在PaddlePaddle官方支持下,这些模型可以顺利过渡到部署。我们希望这些令人鼓舞的设计可以为开发人员和研究人员提供灵感。
-
Backbone 翻译为主干网络的意思,既然说是主干网络,就代表其是网络的一部分,那么是哪部分呢?翻译的很好,主干部分,哈哈哈哈,文字游戏了哈。这个主干网络大多时候指的是提取特征的网络,其作用就是提取图片中的信息,共后面的网络使用。这些网络经常使用的是resnet VGG等,而不是我们自己设计的网络,因为这些网络已经证明了在分类等问题上的特征提取能力是很强的。在用这些网络作为backbone的时候,都是直接加载官方已经训练好的模型参数,后面接着我们自己的网络。让网络的这两个部分同时进行训练,因为加载的backbone模型已经具有提取特征的能力了,在我们的训练过程中,会对他进行微调,使得其更适合于我们自己的任务。(14 封私信 / 80 条消息) 深度学习网络中backbone是什么意思? - 知乎 (zhihu.com)
SAHI:超大图片中对小目标检测的切片辅助超推理库
-
目标检测和实例分割是迄今为止计算机视觉中最重要的应用领域。然而,小物体的检测和大图像的推理仍然是实际使用中的主要问题。切片推理的概念基本上是;对原始图像的较小切片执行推理,然后合并原始图像上的切片预测。可以用下图表示:
-
为了提高你的模型在小目标上的性能,推荐以下技术:medium.com
- 提高图像采集的分辨率
- 增加模型的输入分辨率
- tile你的图像
- 通过增强生成更多数据
- 自动学习模型anchors
- 过滤掉无关的类别
-
检测小物体的另一个重要策略是将图像切割后形成batch,这个操作叫做tile,作为预处理步骤。tile可以有效地将检测器聚焦在小物体上,但允许你保持所需的小输入分辨率,以便能够运行快速推断。