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

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


本文总结:

  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)等。



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,这显然不会影响检测器的效率。

猜你喜欢

转载自blog.csdn.net/qq_39707285/article/details/128143064