PPYOLOE解析第三弹——什么是anchor free
anchor Free究竟是什么?
零:前言
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目标检测存在的缺陷
- anchor会引入很多需要优化的超参数, 比如anchor number、anchor size、anchor ratio
- 因为anchor的大小、比例、数量都是提前确定的,会影响模型的泛化性能。对于新的检测任务,需要重新设计anchor的各种参数。
- 为了保证high recall rate,需要大量密集分布的anchor boxes,会导致训练阶段正负样本不均衡的问题。
- 因为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
更多推荐
所有评论(0)