【论文笔记】PP-YOLOE: An evolved version of YOLO

PP-YOLOE

  • 简介
  • 改进
    • 1.针对泛化性
      • 1)可变卷积(deformable convolution)
      • 2)Matrix NMS
    • 2. Anchor-free
    • 3. 骨干网络和Neck
      • 1)RepResBlock
      • 2)跨阶段部分连接(cross stage partial connections)
      • 3)ESE (Effective Squeeze and Extraction)
    • 4. Task Alignment Learning (TAL).
      • 1)任务对齐样本分配
      • 2) Task-aligned Loss
    • 5. ET-head(Efficient Task-aligned Head)
      • 1)Varifocal Loss(VFL)
      • 2)Distribution focal loss(DFL)
  • 消融实验
  • 性能
  • 笔者思考总结
    • 1.关于PP-YOLOE速度上的提升
    • 2.关于PP-YOLOE精度上的提升

简介

2022.3.24,百度飞浆推出PP-YOLOE,作为22年的第一个YOLO改进版,官方号称测试性能(在MS COCO上)全面领先YOLOX。
尤其是速度方面,在-s模型上达到208FPS,相较于YOLOX-s的119FPS,几乎翻倍!
而在性能上,以PP-YOLOE-x为例,在MS COCO上的mAP达到52.2%,毫无疑问是目前综合性能最好的yolo版本。

【论文笔记】PP-YOLOE: An evolved version of YOLO_第1张图片
论文地址
项目地址(只有接口!!)

由于paddledetdction中只提供了训练和推理的接口,并没有源代码,所以本文将从论文出发,对比分析PP-YOLOE的各项改进。

改进

分五个部分进行对比分析。

1.针对泛化性

PP-YOLOE去除了可变卷积(deformable convolution)和Matrix NMS,从而在各种硬件上得到很好的支持,进一步提升了泛化性能。支持TensorRT 和 ONNX。

1)可变卷积(deformable convolution)

可变卷积在普通的卷积层上增加位移变量,这个变量根据数据的情况学习,偏移后,相当于卷积核每个方块可伸缩的变化,从而改变了感受野的范围,感受野成了一个多边形。
结构图如下:
【论文笔记】PP-YOLOE: An evolved version of YOLO_第2张图片
虽然有助于提高精度,但额外增加的一个卷积层用来学习offset,增加了许多的计算负担,并且飞浆认为这样不利于模型部署。

2)Matrix NMS

利用排序过后的上三角化的IoU矩阵,并且将mask IoU并行化,然后论文同样采取了得分惩罚机制来抑制冗余mask。

优点:

  1. 实现了mask IoU的并行计算,对于box-free的密集预测实例分割模型很有使用价值。
  2. 与Fast NMS一样,只需一次迭代。

缺点:

  1. 与Fast NMS一样,直接从上三角IoU矩阵出发,可能造成过多抑制。
  2. 同样的,飞浆不认为这个操作带来的性能提升优于其带来的额外计算负担,并且为了便于部署,将其舍弃。

2. Anchor-free

作为PP-YOLOv2的改进版本,PP-YOLOE与其最大的不同之处就体现在基于Anchor-free,根据FCOS的思想,对每一个目标像素设置一个锚点,将 ground truths分配给相应的特征图。此举使得模型损失了0.3的AP,但提升了模型速度。
这个部分没啥好讲的,FCOS用语义分割的像素级处理方式处理目标检测,相比于传统的Anchor-based大大减少了运算量和参数量,实际效果上算是拿精度换速度了。
感兴趣的小伙伴可以 戳这里(FCOS论文)

3. 骨干网络和Neck

使用飞浆自己改进的 RepResBlock构造骨干网络,命名CSPRepResNet,采用和ResNet一样的结构,包含一个由三个卷积层和四个后续阶段组成的stem,这四个后续阶段由 RepResBlock堆叠而成。

1)RepResBlock

RepResBlock源自TreeBlock,首先将其简化成如下形式,其中圆圈C代表连接运算(concatenation opearation)
【论文笔记】PP-YOLOE: An evolved version of YOLO_第3张图片

由于连接运算(concatenation operation)和元素加运算(element-wise add operation)之间的相似性已经在
Rmnet论文中得到证实(具体细节不展开,我也没看懂),所以飞浆将其进行替换,得到训练阶段的RepResBlock,如下图所示,其中圆圈+代表元素加运算。
【论文笔记】PP-YOLOE: An evolved version of YOLO_第4张图片

然后,又将训练阶段的 RepResBlock进行重参数化( re-parameterizes),得到一个符合RepVGG风格的基本残差块,并在推理阶段使用,如下图所示
【论文笔记】PP-YOLOE: An evolved version of YOLO_第5张图片
而在骨干网络中,飞浆使用两个trick对RepResBlock进行了改造,分别是跨阶段部分连接(cross stage partial connections)和ESE(Effective Squeeze and Extraction),

2)跨阶段部分连接(cross stage partial connections)

由CSPNet提出,CSP即Cross Stage Partial的缩写。
在resnet的基础上,将每一个stage的头尾两部分的特征图集成起来,用于减少在网络优化的过程中花费在重复的梯度信息上的计算。
与ResNet的结构对比如下图
【论文笔记】PP-YOLOE: An evolved version of YOLO_第6张图片

3)ESE (Effective Squeeze and Extraction)

【论文笔记】PP-YOLOE: An evolved version of YOLO_第7张图片
综合上述两种trick,得到最终在三个卷积层后进行堆叠的CSPRepResStage,如下图所示。
【论文笔记】PP-YOLOE: An evolved version of YOLO_第8张图片
其中的ResBlock在推理阶段和训练阶段稍有不同,差别在于重参数化后,推理阶段的ResBlock少了一条带有1*1卷积的残差边。

backbone和neck的宏观结构如下:
【论文笔记】PP-YOLOE: An evolved version of YOLO_第9张图片

4. Task Alignment Learning (TAL).

对标YOLOX的标签分配策略SimOTA。
为了更进一步克服分类和定位的错位,飞浆在PP-YOLOE中使用TOOD中提出的task alignment learning (任务对齐学习)。

Task Alignment Learning (TAL) 显式的把两个任务的最优anchor拉近。这是通过设计一个样本分配策略和任务对齐loss来实现的。样本分配器计算每个anchor的任务对齐度,同时任务对齐loss可以逐步将分类和定位的最佳anchor统一起来。
【论文笔记】PP-YOLOE: An evolved version of YOLO_第10张图片

1)任务对齐样本分配

anchor对齐度量
用分类得分和预测框和gt的IoU的高阶组合来表示这个度量:
在这里插入图片描述
这里α和β可以用来控制得分和IoU对这个指标的影响程度。

训练样本分配
对于每个gt,我们选择m个具有最大t值的anchor作为正样本点,其余的为负样本。另外,训练的时候还会计算一个新loss,用来对齐分类和定位。

2) Task-aligned Loss

分类目标函数
为了显式的增加对齐的anchor的得分,减少不对齐的anchor的得分,我们用t来代替正样本anchor的标签。我们发现,当α和β变换导致正样本的标签变小之后,模型无法收敛,因此,我们使用了归一化的t,这个归一化有两个性质:1)确保可以有效学习困难样本,2)保持原来的排序。
【论文笔记】PP-YOLOE: An evolved version of YOLO_第11张图片

公式中tˆ,是标准化后的t,来替换损失中的目标。
TOOD文中其实还有借鉴focal loss的思想,得到最后的损失函数,但PP-YOLOE中没有提及,我也就不放到本文中了。

消融实验
不同分配策略在COCO train2017上训练36epochs的结果。
【论文笔记】PP-YOLOE: An evolved version of YOLO_第12张图片

5. ET-head(Efficient Task-aligned Head)

T-head:
【论文笔记】PP-YOLOE: An evolved version of YOLO_第13张图片
飞浆在T-head的基础上,改进得到ET-head。
【论文笔记】PP-YOLOE: An evolved version of YOLO_第14张图片
对比可以看到,飞浆使用ESE代替TOOD中的层注意,将分类分支的对齐简化为shortcut,用分布焦点损失(DFL)层代替回归分支的对齐。

对于分类任务和定位任务的学习,作者分别选择了Varifocal Loss(VFL)(来自论文VarifocalNet)戳这里和Distribution focal loss(DFL)(来自论文Generalized Focal Loss)戳这里

1)Varifocal Loss(VFL)

Varifocal Loss由Focal Loss演化而来,【论文笔记】PP-YOLOE: An evolved version of YOLO_第15张图片
其中,α是用来平衡正负样本的权重, 和 用来调制每个样本的权重,使得困难样本有较高的权重,避免大量的简单的负样本主导了训练时候的loss。借用了Focal Loss中的这种加权的思想,用Varifocal Loss来训练回归连续的IACS,和Focal Loss不一样的是,Focal Loss对于正负样本的处理是相同的,而这里是不对等的,所以Varifocal Loss定义为:
在这里插入图片描述
其中p是预测的IACS,q是目标IoU得分,对于正样本,q是预测包围框和gt框之间的IoU,对于负样本,q为0。

2)Distribution focal loss(DFL)

在这里插入图片描述

其中:
在这里插入图片描述在这里插入图片描述

消融实验

【论文笔记】PP-YOLOE: An evolved version of YOLO_第16张图片

性能

笔者思考总结

1.关于PP-YOLOE速度上的提升

PP-YOLOE和YOLOX整体的结构相差不大,但在速度上有很大的提高,在-s模型上,甚至提升了74%!
这么大的提高,我认为除了模型本身的优化和tricks的使用外,残差结构的大量使用,也有一定影响。模型中所有部件,从backbone和neck中的RepResBlock、CSPRepResStage到ET-head中的shortcut和ESEBlock,无不使用或借鉴了残差结构。
虽然残差结构的主要作用是解决网络退化问题,使得层间信息传播更加顺畅,但在较高层间使用残差结构,不可置否地使得计算开销减小。

2.关于PP-YOLOE精度上的提升

因为还没有完全开源的代码(再吐槽一下飞浆只给接口),不好直接debug各个部件进行对比,以后有机会再将此部分补充完整。

你可能感兴趣的:(目标检测,论文笔记,deep,learning,目标检测,计算机视觉)