YOLO在升级 | PP-YOLO v2开源致敬YOLOV4携带Tricks又准又快地归来(附论文与源码)

简介: YOLO在升级 | PP-YOLO v2开源致敬YOLOV4携带Tricks又准又快地归来(附论文与源码)

1 简介


为了解决效率和性能这两个问题,本文全面评估了一系列现有改进,以提高PP-YOLO的性能,同时几乎保持推理时间不变。本文将分析一系列改进,并通过增量消融研究从经验上评估它们对最终模型性能的影响。

通过结合多项有效的改进,在COCO2017上将PP-YOLO的性能从45.9%mAP提升到49.5%mAP。称之为PP-YOLOv2

在速度方面,PP-YOLOv2在640x640输入尺寸下以68.9FPS的速度运行。具有TensorRT,FP16精度和Batch=1的Paddle推理引擎进一步提高了PP-YOLOv2的推理速度,达到了106.5 FPS。这样的性能超过了具有大致相同数量的参数(即YOLOv4-CSP,YOLOv5l)的现有目标检测器。此外,带有ResNet101的PP-YOLOv2在COCO2017测试开发上达到了50.3%的mAP。


2 PP-YOLO回顾


2.1 Pre-Processing

应用从分布中采样的权重MixUp,其中。

然后,RandomColorDistortion, RandomExpand,RandCrop和RandomFlip以0.5的概率依次应用。

将RGB通道分别减去0.485、0.456、0.406、0.229、0.224、0.225进行归一化处理。

最后,输入大小从[320,352,384,416,448,480,512,544,576,608]均匀抽取。

2.2 Baseline Model

Baseline Model是PP-YOLO,它是YOLOv3的一个增强版本。具体来说,它首先取代ResNet50-vd的BackBone。之后增加了10个几乎可以在不损失效率的情况下提高YOLOv3性能的技巧,如Deformable Conv、SSLD、CoordConv、DropBlock、SPP等。

image.png

2.3 Training Schedule

在COCO train2017上,使用随机梯度下降(SGD)对网络进行500K迭代训练,使用分布在8上的96张图像的小批量训练gpu。学习率从0线性增加到4K迭代时为0.005,分别在400K和450K迭代时除以10。Weight decay设为0.0005,动量设为0.9。最后采用梯度裁剪来稳定训练过程。


3 PP-YOLO v2改进点


3.1 Path Aggregation Network

在不同尺度下检测任务是目标检测的一个基本挑战。在实践中,作者开发了一个检测neck,用于构建所有尺度的高级语义特征map。在本文中PP-YOLO采用FPN来组成自底向上的Path。

image.png

最近,一些FPN的变体被提出以提高金字塔表征的能力。例如,BiFPN,PAN,RFP等。我们遵循PAN的设计来聚合自顶向下的信息。PAN的详细结构如图2所示。

def pan_module(self, input, filter_list, name=None):
        for i in range(1, len(input)):
            ch_out = input[i].shape[1] // 2
            conv_left = self._conv_bn(
                input[i],
                ch_out=ch_out,
                filter_size=1,
                stride=1,
                padding=0,
                name=name + '.{}.left'.format(i))
            ch_out = input[i - 1].shape[1] // 2
            conv_right = self._conv_bn(
                input[i - 1],
                ch_out=ch_out,
                filter_size=1,
                stride=1,
                padding=0,
                name=name + '.{}.right'.format(i))
            conv_right = self._upsample(conv_right)
            pan_out = fluid.layers.concat([conv_left, conv_right], axis=1)
            ch_list = [pan_out.shape[1] // 2 * k for k in [1, 2, 1, 2, 1]]
            input[i] = self.stack_conv(
                pan_out,
                ch_list=ch_list,
                filter_list=filter_list,
                name=name + '.stack_conv.{}'.format(i))
        return input

3.2 Mish Activation Function

其实Mish激活函数已在YOLOv4、YOLOv5等中被证明是有效的。Backbone采用mish激活函数。然而,作者更喜欢使用预先训练的参数,因为有一个强大的模型(在ImageNet上达到了82.4%的top-1精度)。

为了保持Backbone不变,作者将mish激活函数应用于检测neck而不是Backbone。

def mish(x):
    return x * paddle.tanh(F.softplus(x))

3.3 Larger Input Size

增加输入大小可以扩大目标被感知面积。这样,小尺度的物体信息将比以前更容易被保存。因此,性能将得到提高。

然而,更大的输入大小会占用更多的内存。要应用这个技巧需要减少Batch Size。更具体地说,将Batch Size从每个GPU24张图像减少到每个GPU12张图像,并将最大输入大小从608张扩展到768张。输入大小均匀地从[320,352,384,416,448,480,512、544、576、608、640、672、704、736、768]获取。

3.4 IoU Aware Branch

在PP-YOLO中, IoU aware loss 的计算采用了soft weight format,这与最初的意图不一致。因此改进为应用soft label format。以下是IoU aware loss:

image.png

其中t为锚点与ground-truth-bounding box之间的IoU,p为IoU aware branch的原始输出,为sigmoid激活函数。注意,只计算阳性样本的IoU aware loss。通过替换损失函数IoU aware branch比以前更好。

@register
@serializable
class IouAwareLoss(IouLoss):
    """
    iou aware loss, see https://arxiv.org/abs/1912.05992
    Args:
        loss_weight (float): iou aware loss weight, default is 1.0
        max_height (int): max height of input to support random shape input
        max_width (int): max width of input to support random shape input
    """
    def __init__(self, loss_weight=1.0, giou=False, diou=False, ciou=False):
        super(IouAwareLoss, self).__init__(
            loss_weight=loss_weight, giou=giou, diou=diou, ciou=ciou)
    def __call__(self, ioup, pbox, gbox):
        iou = bbox_iou(
            pbox, gbox, giou=self.giou, diou=self.diou, ciou=self.ciou)
        iou.stop_gradient = True
        loss_iou_aware = F.binary_cross_entropy_with_logits(
            ioup, iou, reduction='none')
        loss_iou_aware = loss_iou_aware * self.loss_weight
        return loss_iou_aware


4 不确定Work的Tricks


这里就简单列举一下吧!具体的分析大家去看论文即可:

  • Cosine Learning Rate Decay
  • Backbone Parameter Freezing
  • SiLU Activation Function

5 实验


5.1 Ablation Studies

可以看出这些Trick的加入对于推理时间虽然有所下降,但是影响并不是非常的大,但是mAP提升是很明显的。

5.2 SOTA对比



6 参考


[1].PP-YOLOv2: A Practical Object Detector

[2].https://github.com/PaddlePaddle/PaddleDetection


7 推荐阅读


CVPR2021全新Backbone | ReXNet在CV全任务以超低FLOPs达到SOTA水平(文末下载论文和源码)

CVPR2021-即插即用 | Coordinate Attention详解与CA Block实现(文末获取论文原文)

最强检测 | YOLO V4?都是弟弟! CenterNet2以56.4mAP超越当前所有检测模型(附源码与论文)

全新FPN | 通道增强特征金字塔网络(CE-FPN)提升大中小目标检测的鲁棒性(文末附论文)

最强Vision Trabsformer | 87.7%准确率!CvT:将卷积引入视觉Transformer(文末附论文下载)

VariFocalNet | IoU-aware同V-Focal Loss全面提升密集目标检测(附YOLOV5测试代码)

简单有效 | Transformer通过剪枝降低FLOPs以走向部署(文末获取论文)

经典Transformer | CoaT为Transformer提供Light多尺度的上下文建模能力(附论文下载)

相关文章
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
RT-DETR原理与简介(干翻YOLO的最新目标检测项目)
RT-DETR原理与简介(干翻YOLO的最新目标检测项目)
185 1
|
9月前
|
机器学习/深度学习 人工智能 算法
【ICLR 2018】模型集成的TRPO算法【附代码】
【ICLR 2018】模型集成的TRPO算法【附代码】
|
算法 计算机视觉 异构计算
论文阅读笔记 | 目标检测算法——PP-YOLOv2
论文阅读笔记 | 目标检测算法——PP-YOLOv2
386 0
论文阅读笔记 | 目标检测算法——PP-YOLOv2
|
12月前
|
编解码 并行计算 计算机视觉
最佳Backbone | RepVGG重镇VGG雄风,各大任务独占鳌头(附源码和论文下载)(二)
最佳Backbone | RepVGG重镇VGG雄风,各大任务独占鳌头(附源码和论文下载)(二)
68 0
|
12月前
|
算法 文件存储 计算机视觉
最佳Backbone | RepVGG重镇VGG雄风,各大任务独占鳌头(附源码和论文下载)(一)
最佳Backbone | RepVGG重镇VGG雄风,各大任务独占鳌头(附源码和论文下载)(一)
80 0
|
12月前
|
数据挖掘 测试技术 Go
超越YOLOv7 | YOLOv6论文放出,重参+自蒸馏+感知量化+...各种Tricks大放异彩(一)
超越YOLOv7 | YOLOv6论文放出,重参+自蒸馏+感知量化+...各种Tricks大放异彩(一)
191 0
|
12月前
|
算法 测试技术 文件存储
详细解读 | CVPR 2021轻量化目标检测模型MobileDets(附论文下载)(二)
详细解读 | CVPR 2021轻量化目标检测模型MobileDets(附论文下载)(二)
181 0
|
12月前
|
机器学习/深度学习 设计模式 固态存储
详细解读 | CVPR 2021轻量化目标检测模型MobileDets(附论文下载)(一)
详细解读 | CVPR 2021轻量化目标检测模型MobileDets(附论文下载)(一)
443 0
涨点明显 | 港中文等提出SplitNet结合Co-Training提升Backbone性能(附源码和论文)(二)
涨点明显 | 港中文等提出SplitNet结合Co-Training提升Backbone性能(附源码和论文)(二)
62 0
|
机器学习/深度学习 SQL 编解码
涨点明显 | 港中文等提出SplitNet结合Co-Training提升Backbone性能(附源码和论文)(一)
涨点明显 | 港中文等提出SplitNet结合Co-Training提升Backbone性能(附源码和论文)(一)
138 0