anchor free 目标检测_目标检测中的Anchor Free方法

最近大致梳理了下最近一些Anchor Free方法的发展脉络,不考虑早期的YOLO和DenseBox等算法的话,SOTA的应该是18年CVPR提出的CornerNet,而进入2019年之后,Anchor Free方法颇有点井喷的感觉。今天将总结一下CornerNet/CenterNet/ExtremeNet这一基于keypoint启发的Anchor Free思路,而FCOS/FSAF/FoveaBox这一完全不同的Anchor Free会放在下次,总结不会涉及太多细节,主要介绍一些Motivation和整体网络思想,细节将在之后具体谈论文的时候给出介绍。

1. 从Anchor Based方法谈起

目前主流的目标检测算法,包括多阶段的各种RCNN和单阶段的SSD、RetinaNet上都是基于Anchor来做的。Anchor的本质是候选框,在设计了不同尺度和比例的候选框后,DNN学习如何将这些候选框进行分类:是否包含object和包含什么类别的object,对于postive的anchor会学习如何将其回归到正确的位置。它扮演的角色和传统检测算法中的滑动窗口等机制比较类似。但是,这种设计思路有很多问题:

大部分object是不规则的,所以Bounding Box涵盖了大量非object的区域,从而引入比较多的干扰

Anchor的设置需要手动去设计,对不同数据集也需要不同的设计,相当麻烦,也不符合DNN的设计思想

Anchor的匹配机制使得极端尺度(特别大和特别小的object)被匹配到的频率相对于大小适中的object被匹配到的频率更低,DNN在学习的时候不太容易学习好这些极端样本

Anchor的庞大数量使得存在严重的不平衡问题,这里就涉及到一个采样的过程,实际上,类似于Focal loss的策略并不稳定,而且采样中有很多坑,今年的Libra R-CNN有个改进点就是采样时候的iou是不平衡的,实际上这种平衡广泛存在,例如不同的类别、尺度等等,有着很多隐藏问题

自从去年8月CornerNet开始,Anchor-Free的目标检测模型层出不穷,最近达到了井喷的状态,宣告着目标检测迈入了Anchor-Free时代。

​其实Anchor-Free并不是一个新概念了,大火的YOLO算是目标检测领域最早的Anchor-Free模型,而最近的Anchor-Free模型如FASF、FCOS、FoveaBox都能看到DenseBox的影子。

下面主要讲一下有代表性的Anchor-Free模型(包括DenseBox、YOLO、CornerNet、ExtremeNet、FSAF、FCOS、FoveaBox),分成3个部分来介绍(早期探索、基于关键点、密集预测),具体细节就不展开了~

早期探索

1.DenseBox

​最早知道这篇文章,是在去年刚接触目标检测的时候,看了一篇地平线对DenseBox作者的采访,当时因为刚接触感触不深,但是从当前的时间节点回头看,DenseBox的想法是多么的超前啊。采访中说道,当年DenseBox其实早在2015年初就已经开发出来了,这比同期的Faster-RCNN系列提前数月,但是论文直到9月才在arxiv上发布。如果DenseBox能在2015年初就发表,那么最近几年目标检测的发展会不会是另外一番景象呢~~

两点贡献:

1.证明单个FCN可以检测出遮挡严重、不同尺度的目标。

2.通过多任务引入landmark localization,能进一步提升性能。

​如图1所示,单个FCN同时产生多个预测bbox和置信分数的输出。测试时,整个系统将图片作为输入,输出5个通道的feature map。每个pixel的输出feature map得到5维的向量,包括一个置信分数和bbox边界到该pixel距离的4个值。最后输出feature map的每个pixel转化为带分数的bbox,然后经过NMS后处理。

Ground Truth Generation

​第一个通道ground truth map的正标签区域由半径为r的圆填充,圆的中心点位于bbox的中点。而剩下的4个通道由bbox的2个角点决定。

Refine with Landmark Localization

​在FCN结构中添加少量层能够实现landmark localization,然后通过融合landmark heatmaps和score map可以进一步提升检测结果。

2.YOLO

​YOLO将目标检测作为一个空间分离的边界框和相关的类概率的回归问题。可以直接从整张图片预测出边界框和分类分数。

三个优点:

1.速度快

2.通过整幅图进行推理得到预测结果

3.能学到目标的一般特征

Unified Detection

​YOLO将输入图片分成SXS个网格,如果某个目标的中心点落到其中一个格点,那么该格点就负责该目标的检测。每个格点预测出B个bbox和每个bbox的置信分数。

定义置信度为:

​每个bbox由5个预测值组成:x,y,w,h 和 置信度。每个格点也预测C个类概率

​测试的时候,将类概率和置信分数相乘,得到类置信分数

​举个例子,在Pascal VOC数据集上评估YOLO,使用S=7,B=2,VOC有20类,所以C=20,那么最终的预测结果是7x7x30的向量。

DenseBox和YOLO的区别:

1.DenseBox应用于人脸检测,相当于只有两类,而YOLO是通用检测,通常大于两类。

2.DenseBox是密集预测,对每个pixel进行预测,而YOLO先将图片进行网格化,对每个grid cell进行预测。

3.DenseBox的gt通过bbox中心圆形区域确定的,而YOLO的gt由bbox中心点落入的grid cell确定的。

基于关键点

3.CornerNet

两点贡献:

1.通过检测bbox的一对角点来检测出目标。

2.提出corner pooling,来更好的定位bbox的角点。

Detecting Corners

​首先预测出两组heatmaps,一组为top-left角点,另一组为bottom-right角点。每组heatmaps有C个通道,表示C个类别,尺寸为HxW。每个通道是一个binary mask,表示一个类的角点位置。

​对于每个角点来说,只有一个gt正例位置,其他都为负例位置。训练时,以正例位置为圆心,设置半径为r的范围内,减少负例位置的惩罚(采用二维高斯的形式),如上图所示。

Grouping Corners

​受到多人姿态估计论文的启发,基于角点embedding之间的距离来对角点进行分组。

Corner Pooling

​在每个pixel位置,最大池化第一个feature map右方的所有特征向量,最大池第二个feature map下方的所有特征向量,然后将两个池化结果相加。

你可能感兴趣的:(anchor,free,目标检测)