零:前言

YOLO经过这么多年的发展,在预测方式从YOLOv1的anchor free再到YOLOv2,v3,v4,v5和PP-YOLOv1,v2的anchor base,结果历史是个圈兜兜转转到了YOLOX与PP-YOLOE又回到了anchor Free方式,当时在YOLOv2时从anchor free到anchor base精准度下降但是回归率提升了,因此当时YOLO作者Joseph Redmon选择拥抱anchor base,在anchor base时代COCO的Map被不断刷高,但是anchor的引入又带来了一群很麻烦的超参数,在FCOS论文中又开始嫌弃anchor base,于是又把目光放回到了anchor free。这篇就为大家来详解一下anchor free方式。并以PPYOLOE为具体结果进行详解

为了更好的讲解anchor free 在此先说几个我想到与看到的问题与解答


anchor 是什么?

目标检测通常被建模为对候选框的分类和回归,不过,按照候选区域的产生方式不同,分为二阶段(two-step)检测和单阶段(one-step)检测,前者的候选框通过RPN(区域推荐网络)网络产生proposal,后者通在特定特征图上的每个位置产生不同大小和宽高比的先验框(anchor)。如下图


anchor-based目标检测存在的缺陷

  1. anchor会引入很多需要优化的超参数, 比如anchor number、anchor size、anchor ratio
  2. 因为anchor的大小、比例、数量都是提前确定的,会影响模型的泛化性能。对于新的检测任务,需要重新设计anchor的各种参数。
  3. 为了保证high recall rate,需要大量密集分布的anchor boxes,会导致训练阶段正负样本不均衡的问题。
  4. 因为anchor boxes数量特别多,训练阶段需要计算所有anchor boxes和ground-truth boxes的IOU,导致特别大的计算量和内存(显存)占用

现在的anchor free与YOLOv1的anchor free有什么不同

没有anchor的YOLOv1是直接将目标框和特征图上的cell绑定在一起,目标框的中心点落在这个cell内

但我当将特征图上cell和目标框直接关联在一起,而不用anchor,这样目标检测就和语义分割一样变成了直接的pixel预测(pixel和cell是等同的)

虽然都叫anchor free但是预测的方式还是不同的,总而言之就是时代在进步

一:几种网络 anchor free方式介绍


1.1:FCOS解码预测

FCOS是一种密集预测的anchor-free检测算法,使用RetinaNet的骨架,直接在feature map上回归目标物体的长宽,并预测物体的类别以及centerness(feature map上像素点离物体中心的偏移程度),centerness最终会作为权重来调整物体得分

在19年FCOS首先有一次掀起anchor free的风潮
在这里插入图片描述

FCOS的Head在Reg预测会输出一个[N,4,H,W]的tensor,4代表着特征图中每一个pixel的位置预测参数,这四个参数分别代表着 left right top bottom

当得到这四个参数后FCOS使用以下的公式分别预测xmin ymin xmax ymax
在这里插入图片描述

其中Cx与Cy指的是预测图片在原尺寸中每个网格中心点X,Y坐标,而l,r,t,b就是Reg预测参数,s是指预测图的下采样倍率

其中需要注意的是FCOS的预测是在原尺度层次预测

1.2:YOLOX解码预测

YOLOX是旷视科技(Megvii)在YOLOv3基础上改进的。主要改进的部分在于 Decoupled Head、Anchor Free、SimOTA、Data Aug。另外为了yolov5对比,主干网络引入了yolov5的FOCUS、CSPNet、PAN Head、SiLU激活。

在这里插入图片描述

YOLOX的位置预测参数也是4个只不过这四个参数分别为Tx Ty Th Tw,分别代表的是中心点的x和y的偏移参数,以及高和宽的预测参数

在这里插入图片描述

YOLOX与FCOS不同的是它的输出预测方式为网格的中心点的坐标和网格的高和宽。

其中Cx与Cy分别为每个网格的左上角的坐标,因此只需要将网格左上角的坐标与Tx与Ty相加就可以了,而H与W直接使用e的Tw和Th次方即可

需要注意的是YOLOX是在特征图尺度进行预测,因此最后还要等比例放大到原本图片大小尺寸

1.3:PP-YOLOE解码预测

PP-YOLOE是基于PP-YOLOv2的卓越的单阶段Anchor-free模型,超越了多种流行的yolo模型。PP-YOLOE有一系列的模型,即s/m/l/x,可以通过width multiplier和depth multiplier配置。PP-YOLOE避免使用诸如deformable convolution或者matrix nms之类的特殊算子,以使其能轻松地部署在多种多样的硬件上。

在这里插入图片描述

PP-YOLOE在Head out Reg参数方面与FCOS类似都是输出 l,t,r,b 也就是 left right top bottom
在这里插入图片描述

当得到这四个参数后PP-YOLOE使用以下的公式分别预测xmin ymin xmax ymax

在这里插入图片描述

其中Cx与Cy指的是预测图片在特征预测图中每个网格中心点X,Y坐标,而l,r,t,b就是Reg预测参数,需要注意的是这里得到的xmin ymin xmax ymax 都是预测特征图尺寸的,因此最后还需要乘上stride还原到原尺度。

二:PPYOLOE预测详解

下面我们通过一套代码来详解YOLOE的预测过程

2.1 Head层

在这里插入图片描述

forward_eval就是PPYOLOE HEAD在eval以及infer阶段的forward

其中Feats为C5,C4,C3组成的列表

  • C5 为[N,768,20,20]
    
  • C4 为[N,384,40,40]
    
  • C3 为[N,192,80,80]
    

2.1.1:anchor_points,stride_tensor

可以看到 前四行会生成两个变量分别为anchor_points以及stride_tensor
在这里插入图片描述

上面函数展示了它俩的生成过程,
其中anchor_points是将三个特征图的所有网格的中心点坐标拍平后相连

具体的过程可以看下图在这里插入图片描述

而stride_tensor就很简单代表着每个cell的缩放倍数

2.1.2:cls_score,reg_dist

cls_score表示每个cell各个类别的可能性,

reg_dist则代表每个cell的ltrb参数

2.1.2.1:cls预测过程

在这里插入图片描述

首先先遍历三个feat图层

然后获取该图层的H,W 并得到L=H*W

然后将特征图经过 avgpooling将[N,C,H,W]变为[N,C,1,1]

然后经过ESE Block施加通道注意力,然后经过pred_cls将通道数从[N,C,H,W]变为[N,num_cls,H,W]然后经过一个Sigmoid得到各类别可能性后放入到list中

最后将三个特征图在H*W维度进行拼接最后就得到了类别预测参数

2.1.2.2:reg预测过程

在这里插入图片描述

首先先遍历三个feat图层

然后获取该图层的H,W 并得到L=H*W

然后将特征图经过 avgpooling将[N,C,H,W]变为[N,C,1,1]

然后经过ESE Block施加通道注意力,然后再经过pred_reg将通道数从[N,C,H,W]变为[N,4*(reg_max+1),H,W],这里的reg_max设置为16

然后将特征图reshape为[N,4,reg_max+1,HW]再transpose为[N,reg_max+1,4,HW]

然后通过一个Sigmoid后再通过一个Conv将feat变为[N,1,4,H*W]

然后再reshape为[N,4,H*W]后放入到list中

最后将三个特征图在H*W维度进行拼接最后就得到了ltrb预测参数

2.2 : post_process

当我们得到了类别预测参数与Reg预测参数后接下来就需要进行公式计算得到最终结果了

在这里插入图片描述

post_process过程由以上函数进行

首先该函数需要传入三个参数分别为,

head的输出也就是2.1讲的四个参数,

图片的输入尺寸:这里为640,640

图片的缩放因引子:也就是图片的原尺寸除以输入尺寸

2.2.1:获取预测框

获取预测框是由第二行的函数负责,首先需要中心点网络tensor,以及Reg预测参数,这里Reg预测参数被转换为[N,H*W,4]

在这里插入图片描述

上面的函数就是PPYOLOE的解码预测公式过程

最后就变成[N,H*W,(xmin,ymin,xmax,ymax)]

但是此时的预测结果是在该预测特征尺寸的结果,因此还需要乘以stride_tensor变成640*640尺寸的预测结果,最后再/一个缩放因子改成原图的预测尺寸。

最后再经过一个NMS得到最终的预测结果

三:预测实践

!git clone https://gitee.com/paddlepaddle/PaddleDetection.git
%cd PaddleDetection
!pip install -r requirements.txt
!python tools/infer.py -c configs/ppyoloe/ppyoloe_crn_l_300e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_l_300e_coco.pdparams --infer_img=demo/000000014439_640x640.jpg 

3.1:效果展示

在这里插入图片描述

四:结尾

现在已经到了第三弹了,下一弹应该会说一下正负样本匹配。然后PPYOLOE的结构就差不多都说完了。

AiStudio原项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4239225

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐