- YOLO系列目标检测算法总结对比- 文章链接
- YOLOv1- 文章链接
- YOLOv2- 文章链接
- YOLOv3- 文章链接
- YOLOv4- 文章链接
- Scaled-YOLOv4- 文章链接
- YOLOv5- 文章链接
- YOLOv6- 文章链接
- YOLOv7- 文章链接
- PP-YOLO- 文章链接
- PP-YOLOv2- 文章链接
- YOLOR- 文章链接
- YOLOS- 文章链接
- YOLOX- 文章链接
- PP-YOLOE- 文章链接
本文总结:
- 在PP-YOLO的基础上,通过各种改进技巧提升其性能,相比于PP-YOLO,mAP由45.9%提升到49.5%,速度从68.9FPS提升到106.5FPS;
- 改进的地方:Neck部分使用PAN、在Neck中使用Mish激活函数、使用更大的输入尺寸、改进IoU Aware Branch损失函数等等;
专栏链接:
https://blog.csdn.net/qq_39707285/article/details/124005405
此专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
本章目录
1. 回顾PP-YOLO
1.1 预处理
使用Mixup,50%概率随机RandomColorDistortion、RandomExpand、RandCrop和RandomFlip,然后RGB通道像素标准化,最后输入尺寸变化 [320, 352, 384,416, 448, 480, 512, 544, 576, 608]。
1.2 基本模型
本文继续沿用PP-YOLO的基本模型,PP-YOLO中的backbone是YOLOv3的加强版本,使用ResNet50-vd作为backbone,之后使用总共10个trick进行改进,在提高性能的同时且几乎没有增加推理时间,这10个trick包括Deformable Conv、SSLD、CoordConv、DropBlock和SPP等,具体可以看PP-YOLO这篇文章。
1.3 训练策略
训练时在8个GPU上batchsize设置为96,优化器为SGD,首先迭代500K次,学习率从0-0.005线性增加,当在第400K和450K次时,学习率除以10。同时采用梯度剪切的方法来稳定训练过程。
2. 改进技巧
2.1 PAN(Path Aggregation Network)
检测不同尺度的目标是目标检测中的一个基本挑战。在实践中,开发了一个neck,用于构建所有尺度上的高级语义特征映射。
在PP-YOLO中,采用FPN来组成自底向上的路径。最近,好多FPN变体已被提出来提高金字塔的表示能力,例如,BiFPN、PAN、RFP等等。本文按照PAN的设计来聚合自上而下的信息,具体结构如图2所示。
2.2 Mish Activation Function
Mish激活函数提出后已经广泛应用到多个目标检测其中,例如YOLOv4和YOLOv5中的backbone中。本文采用的PP-YOLO的backbone在ImageNet数据集上已经预训练过了,且分类准确率很高,所以就不在backbone上使用Mish,而在neck中使用Mish。
2.3 Larger Input Size
增大输入图片尺寸,相当于增加目标的面积,从而有更多的信息,因此,性能将会得到提高。然而,大的输入尺寸会占用更多的内存。为此,需要减少batchsize,本文将batchsize从每个GPU的24张图像减少到每个GPU的12张图像,并将最大的输入大小从608扩展到768。输入大小从[320,352,384,416,448,480,512,544,576,608,640,672,704,736,768]中均匀地抽取。
2.4 IoU Aware Branch
在PP-YOLO中,IoU感知损失以软权重格式计算,与初衷不一致。因此,本文应用了一种软标签格式。以下是IoU Aware loss的计算方式:
l
o
s
s
=
−
t
∗
l
o
g
(
σ
(
p
)
−
(
1
−
t
)
∗
l
o
g
(
1
−
σ
(
p
)
)
loss=-t*log(\sigma(p)-(1-t)*log(1-\sigma(p))
loss=−t∗log(σ(p)−(1−t)∗log(1−σ(p))
其中 t t t表示锚与其匹配的GT边界框之间的IoU, p p p为IoU Aware Branch的原始输出, σ ( ⋅ ) \sigma(·) σ(⋅)代表sigmoid激活函数。注意,只计算了阳性样本的IoU感知损失。通过替换损耗函数,IoU感知分支比以前更好。
3. 各类改进技巧实验
本节以一种增量的方式展示每个模块的性能提升,结果如下表所示:
3.1 有提升的技巧
- A
首先,遵循PP-YOLO的原始设计来构建PP-YOLO的backbone。由于在CPU上大量的预处理会减慢训练速度,所以将每个GPU的图像从24减少到12,减少batchsize的理大小使mAP下降了0.2%。 - A
⟶
\longrightarrow
⟶ B
对PP-YOLO有积极影响的第一个改进是PAN,为了稳定训练过程,在PAN模块中添加了几个skip连接,详细细节如结构图2所示。可以看到,PAN和FPN是一组对称的结构,当使用Mish时,它将性能从45.1%mAP提高到47.1% mAP。虽然模型B比模型A稍慢,但如此显著的增益促使在最终的模型中采用PAN。 - B
⟶
\longrightarrow
⟶ C
由于评估期间YOLOv4和YOLOv5的输入大小为640,因此本文将训练和评估的输入大小增加到640,以建立一个公平的比较。性能提高0.6% mAP。 - C
⟶
\longrightarrow
⟶ D
不断增加输入大小应该更有利。但是,不可能将更大的输入大小和更大的batchsize一起使用。用每个GPU12张图像和更大的输入大小来训练模型D,它增加了0.6%,比更大的batchsize带来更多的收益。因此,在最后的实践中选择了较大的输入大小。输入大小从[320,352,384,416,448,480,512,544,576,608,640,672,704,736,768]中均匀地抽取。 - D
⟶
\longrightarrow
⟶ E
在训练阶段,改进后的IoU感知损失比以前表现得更好,在前一个版本中,在训练期间的数百次迭代中,IoU感知损失的值会下降到1e-5。在对IoU感知损失进行修正后,其值与IoU损失值在同一数量级上,这是合理的。使用该策略后,模型E的mAP增加到49.1%,没有任何效率损失。
3.2 不work的trick
-
Cosine学习率衰减
不同于线性步进学习率的衰减,cosine学习速率衰减是学习速率的指数衰减,因此,学习速率的变化是平滑的,这有利于训练过程。虽然cosine学习率衰减在COCO minitrain上取得了更好的性能,但它对初始学习率、步数和结束学习率等超参数很敏感。尝试了几组超参数。然而,最终并没有观察到对2017年COCO train的积极影响。 -
backbobne参数冻结
当对下游任务上的ImageNet预训练参数进行微调时,在前两个阶段冻结参数是一种常见的做法。由于本文预先训练的ResNet50-vd比其他的更强大(Top1准确率82.4%,Top1准确率79.3%),更有动力采用这种策略。在COCO minitrain上,参数冻结带来了1个mAP增益,而在COCO2017 train上,mAP降低了0.8%。不一致现象的一个可能的原因是两个训练集的大小不同,COCO minitrain是2017年COCO train的五分之一。在一个小数据集上训练的参数的泛化能力可能比预先训练的参数更差。 -
SiLU激活函数
尝试在neck部使用SiLU代替Mish,这增加了COCO minitrain数据集mAP的0.3%,但下降了2017 COCO train数据集mAP的0.5%,这个不确定原因。
4. 结论
- 本文对PP-YOLO进行了一些更新,它形成了一个名为PPYOLOv2的高性能目标检测器;
- 与其他目标检测器,如YOLOv4和YOLOv5相比,PP-YOLOv2在速度和精度之间取得了更好的平衡;
- 在本文中,探讨了一系列技巧,并展示了如何将这些技巧结合在PP-YOLO检测器上,并证明了它们的有效性。