目标检测是计算机视觉研究的重要领域之一,在各种实际场景中起着至关重要的作用。在实际应用中,由于硬件的限制,往往需要牺牲精度来保证检测器的推断速度。因此,必须考虑目标检测器的有效性和效率之间的平衡
本文的目标是实现一种可以直接应用于实际应用场景的效果和效率相对平衡的目标检测器,而不是提出一种新的检测模型
鉴于YOLOv3在实际中得到了广泛的应用,我们开发了一种基于YOLOv3的新型目标检测器。我们主要尝试结合现有的各种几乎不增加模型参数和FLOPs数量的技巧,以达到在保证速度几乎不变的情况下尽可能提高检测器精度的目的
由于本文所有的实验都是基于PaddlePaddle进行的,所以我们称之为PP- YOLO。通过结合多种技巧,PP-YOLO可以在效率(45.2% mAP)和效率(72.9 FPS)之间取得更好的平衡,超过了现有的最先进的探测器,如EfficientDet和YOLOv4
本文介绍了一种基于PaddlePaddle的改进YOLOv3模型(PP-YOLO),添加了一些几乎不会增加推断时间的技巧来提高模型的整体性能( bag of freebies)
与YOLOv4不同,我们没有探索不同的骨干网络和数据增强方法,也没有使用NAS搜索超参数
对于骨干网,我们直接使用最常见的ResNet[13]作为PP-YOLO的骨干网
对于数据增强,我们直接使用了最基本的MixUp[43]
一个原因是ResNet的使用更加广泛,各种深度学习框架都针对ResNet系列进行了深度优化,在实际部署中会更加方便,在实践中会有更好的推断速度
另一个原因是主干网的替换和数据扩充是相对独立的因素,与本文讨论的技巧几乎无关
用NAS搜索超参数通常会消耗更多的计算能力,因此通常没有条件在每个新场景中使用NAS执行超参数搜索
因此,我们仍然使用YOLOv3[32]后面手动设置的参数
本文的重点是如何将一些不影响效率的有效技巧叠加起来,从而获得更好的性能
本文并不打算介绍一种新的目标检测器,它更像是一个食谱,告诉你如何一步一步地制造一个更好的检测器。我们发现了一些对YOLOv3检测器有效的技巧,可以节省开发人员的试错时间。最终的PP-YOLO模型将COCO上的mAP从43.5%提高到45.2%,速度比YOLOv4快
近两年来,人们提出了大量新的无锚法,它们可以分为两种类型
基于锚点的检测器基于锚点而不是锚盒进行对象边界盒回归,包括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不同,技巧的详细实现也不同
基于单阶段锚点的检测器通常由主干网、检测颈部(典型的特征金字塔网络(FPN))和用于目标分类和定位的检测头部组成。它们也是大多数基于锚点的一级无锚探测器中常见的元件。我们首先对YOLOv3的详细结构进行了修改,并引入了一个修改版本,将主干替换为ResNet50-vd-dcn,作为本文的基本基线。然后我们介绍了一堆技巧,可以提高YOLOv3的性能,几乎不损失效率
在原始的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
使用FPN[21]构建特征映射之间具有横向连接的特征金字塔。特征映射c3、c4、c5输入到FPN模块,我们将金字塔层1的输出特征映射表示为pl,其中在我们的实验中l = 3,4,5。对于尺寸为W × H的输入图像,p1的分辨率为W/2的l次方 × H/2的l次方
YOLOv3的检测头非常简单,它由两个卷积层组成,采用3×3卷积层和1×1卷积层进行最终预测。每个最终预测的输出通道为3(K + 5),其中K为类数。每个最终预测图上的每个位置都与三个不同的锚相关联。对于每个锚点,前K个通道是K类的概率预测。以下4个通道是对边界框定位的预测,最后一个通道是客观性评分的预测。对于分类和定位,分别采用交叉熵损失和L1损失。对象损失[32]用于监督对象得分,该分数用于识别是否存在对象
本文并没有提出一种新的检测方法,而只是着重于结合现有的技巧来实现一个有效和高效的检测器。由于许多技巧不能直接应用于YOLOv3,我们需要根据它的结构进行调整
使用更大的批大小可以提高训练的稳定性,得到更好的结果。这里我们将训练批大小从64个更改为192个,并相应地调整训练计划和学习率
在训练模型时,保持训练参数的移动平均线通常是有益的。使用平均参数的评估有时会产生比最终训练值[35]好得多的结果。指数移动平均线(EMA)使用指数衰减计算训练参数的移动平均线。对于每个参数W,我们维持一个shadow参数
其中λ是衰减。我们采用衰减λ为0.9998的EMA,并使用阴影参数Wema进行评估
与原论文不同的是,我们只在FPN中应用DropBlock,因为我们发现在骨干网络中添加DropBlock会导致性能下降。DropBlock的详细注入点在图2中用“三角形”标记
边界盒回归是目标检测的关键步骤。在YOLOv3中,采用L1损失进行边界盒回归。它不适合mAP评估度量,它强烈地依赖于交联(IoU)。为了解决这一问题,已经提出了IoU损失和其他变化,如CIoU损失和GIoU损失[46,34]。与YOLOv4不同的是,我们没有直接用IoU损失代替L1损失,我们增加了一个分支来计算IoU损失。我们发现各种IoU损失的改进是相似的,所以我们选择了最基本的IoU损耗
在YOLOv3中,分类概率和客观得分相乘作为最终检测置信度,不考虑定位精度。为了解决这一问题,增加了IoU预测分支来衡量定位的准确性。在训练过程中,采用IoU感知损失训练IoU预测分支。在推理过程中,将预测的IoU与分类概率和客观评分相乘,计算出与定位精度更相关的最终检测置信度。然后将最终检测置信度用作后续NMS的输入。IoU感知分支会增加额外的计算成本。但是,只增加了0.01%的参数个数和0.0001%的flop,几乎可以忽略不计
网格敏感是YOLOv4引入的一种有效的技巧。当我们解码边界框中心x和y的坐标时,在原始的YOLOv3中,我们可以得到它们
其中σ是s型函数,gx和gy是整数,s是比例因子
显然,x和y不能完全等于s·g x或s·(g x + 1),这使得很难预测刚刚位于网格边界上的边界框的中心。我们可以解决这个问题,把方程变成
其中,本文将α设为1.05。这使得模型更容易准确地预测网格边界上的边界框中心。GridSensitive增加的FLOPs非常小,完全可以忽略
矩阵NMS是由软NMS驱动的,它将其他检测分数作为它们重叠的单调递减函数来衰减。但是,这个过程像传统的贪心NMS一样是顺序的,不能并行实现。Matrix NMS从另一个角度看待这个过程,并以并行的方式实现它。因此,矩阵网管比传统网管速度更快,不会带来任何效率损失
CoordConv,它的工作原理是通过使用额外的坐标通道让卷积访问自己的输入坐标。CoordConv允许网络学习完全的平移不变性或不同程度的平移依赖性。考虑到CoordConv将在卷积层中增加两个输入通道,因此将增加一些参数和FLOPs。为了尽可能减少效率的损失,我们不改变骨干中的卷积层,只将FPN中的1x1卷积层和检测头中的第1卷积层替换为CoordConv。CoordConv的详细注入点在图2中用“菱形”标记
空间金字塔池(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被引入
在ImageNet上使用分类精度更高的预训练模型可以获得更好的检测性能。这里我们使用蒸馏的ResNet50-vd模型作为预训练模型[29]。这显然不影响检测器的效率
文介绍了一种基于PaddlePaddle的目标检测器的新实现,称为PP-YOLO
PP- YOLO比其他最先进的探测器(如EfficientDet和YOLOv4)更快(FPS)和更准确(COCO mAP)
在本文中,我们探索了许多技巧,并展示了如何在YOLOv3检测器上组合这些技巧并演示了它们的有效性
我们希望本文能够帮助开发人员和研究人员节省探索时间,并在实际应用中获得更好的性能