前面我们讲的都是anchor-based方法,那么anchor-based methods总的特征就是在同一像素点上生成多个不同大小和比例的候选框(one-stage模型通常采用滑窗等(聚类)方式生成,而two-stage模型更多的是采用RPN来生成),并对其进行筛选,然后再进行分类和回归。一定程度上它能够解决目标尺度不一和遮挡的问题,提高检测精度。
既然anchor的设计(初始化)对网络模型的影响这么大,我们是不是可以去除掉anchor来进行检测呢?基于上述的思考,anchor-free也开始迎来了自己的发展。那么anchor-free与anchor-based的区别是什么?
实际上我们前面讲的YOLO算法anchor free中比较早期的模型,所以anchor free并不是一个比较新的概念。早期的anchor-free模型可以追溯到15年CVPR的DenseBox,算是Anchor Free的起源吧。比同期的Faster-RCNN系列提前数月,但是论文直到9月才在arxiv上发布(YOLO是16年5月,比YOLO还早)。所以,anchor free的发展历史也可以说是相对久的。截止目前,anchor-free模型的发展主要可以分为早期探索、基于点和基于密集预测的。(这里只罗列出一部分比较有代表性的模型)
由于时间和内容的限制,这里我只介绍时间轴上的这些模型。其中,因为DenseBox对后期密集预测的anchor free模型有较大的影响,所以早期探索的模型只介绍DenseBox模型。
在图像上进行卷积等同于使用滑窗分类,为何不能使用全卷积对整个图像进行目标检测呢?如何将全卷积网络FCN应用到目标检测?
虽然DenseBox是比较早期的论文,但个人感觉DenseBox论文里面很多思想都是那个时期相对比较超前的:
1、单一尺度图片进行训练,多尺度测试。
2、不采用全图训练,大量背景浪费计算资源,crop出有人脸和足够背景的patches。
3、输入图片:crop and resize 240*240,face在中间位置,且有50像素的高度。
4、输出的ground truth经过4倍下采样得到60x60x5的map,第一个channel,positive labeld区域位于边界框的中心。半径位与bounding box中心,大小与box成比例(文中设置系数是box size的0.3),剩余四个channel代表该位置与最近gt box左上角及右下角的距离。
5、patch有多个目标,将位于patch中心(0.8至1.25)区域的目标记为正样本,1channel像素值为1,其余为负样本,1channel像素值为0。
DenseBox中增加landmark定位分支(通过增加若干全卷积分支实现),以提升目标检测准确度的工作,并可以联合landmark热度图和人脸得分热度图进一步提升目标检测精准度。加入关键点检测分支之后,DenseBox根据关键点的置信度图和boudning box的置信度图构成了新的检测损失,并将其命名为Refine Network。
左图为landmark定位新增了一个分支,如果要输出N个landmark,那么landmark定位分支共输出N通道的feature map,feature map上每个像素表示该位置为一个特定landmark的概率(each pixel represent the confidence score of being a landmark at that location);从这点上来看,landmark分支的gt feature map和检测分支的gt feature map是非常相似的,二者的区别在于:检测分支的gt feature map是四通道,landmark分支的gt feature map是N通道,N对应要输出的landmark数目;---- 有多少landmark点,就输出多少通道即可。(人脸是72个关键点,而车辆是作者自己标注的8个关键点)。
对于姿态估计和分割的任务,它们的ground truth就是给点打标签。借此启发,CornerNet的作者认为对于目标检测来说,目标检测的框实际上就等同于左上角和右上角的点,因此,CornerNet摒弃了原本anchor-based的思想,采用keypoint-based的思路来进行检测。CornerNet作者之所以选择角点的原因和比较简单(因为角点相比中心点更容易训练与回归,比如说角点只与两条边相关,而中心点与四条边相关。)
CornerNet采用Hourglass(沙漏网络)作为主干网络来提取特征,然后分成两个支路分别预测左上角和右下角坐标。每个支路文章称之为Prediction Module。在每个Prediction Module之前都会先过一个Corner Pooling(这也是CornerNet文章的一个亮点), 再分成三个子支路Heatmaps、Embeddings、Offsets。【heatmaps某位置是角点的概率、offsets实际角点相对于该位置的偏移、embeddings嵌入向量,角点配对】
在CornerNet中,heatmaps主要通过扩大学习区域并进行corner pooling来确定哪些点是我们所要寻找的corner。
在人体姿态估计中,相对应的角点也会互相匹配,因此,CornerNet也借鉴了这种思想,认为属于同一目标的corner embedding应该具有较高的相似度,而不同物体之间的corner embedding应该具有较远的距离。(寻找一个特征空间来区分不同object之间的corner)
在卷积的过程中是存在下采样的过程的,这就不可避免的是一些点的坐标产生一些偏移,这样就从原始图的输入到最后特征图的输出过程,这些误差就会累计,对于小目标的误差就不可接受了,所以需要引入offset偏移量来修正它。
检测精度可以与anchor-based的方法相媲美,基于关键点检测的方法是有效的。但物体的特征一般集中在物体内部,左上、右下两个点的特征并不明显,不容易确定位置。而且日哟导致同类别不同目标的角点容易错误地组合起来形成误检框。检测速度还有较大的优化空间。
CornerNet-Lite是两个CornerNet变种的组合:
CornerNet-Saccade——注意机制消除了对图像的所有像素进行处理的需要(通过关注子区域的像素来减少处理量),将cornernet单阶段检测器变为两阶段检测器,attention maps作用类似与fasterrcnn中的rpn但又有所不同,将roi区域crop下来进行第二阶段的精细检测,该网络与cornernet相比达到精度提升;
CornerNet-Saccade中的 saccades是single type and multi-object,也就是通过attention map找到合适大小的前景区域,然后crop出来作为下一阶段的精检图片。CornerNet-Saccade 检测图像中可能的目标位置周围的小区域内的目标。它使用缩小后的完整图像来预测注意力图和粗边界框;两者都提出可能的对象位置,然后,CornerNet-Saccade通过检查以高分辨率为中心的区域来检测目标。它还可以通过控制每个图像处理的较大目标位置数来提高效率。主要分为两个阶段估计目标位置和检测目标。
CornerNet-Squeeze——引入一个新的、紧凑的基础网络架构,reducing the amount of processing per pixel,主干网络实为hourglass network、mobilenet、squeezenet结构的变体,在实时检测器领域达到速度和精度的双重提升。CornerNet-Saccade适合离线处理,在不损失检测精度的情况下检测速度提高了6倍,CornerNet-Squeeze是实时检测器,在COCO数据集上其检测速度和精度相比YOLOv3都有提高。在COCO数据集上,43.2% AP at 190ms for CornerNet-Saccade,34.4% AP at 34ms for CornerNet-Squeeze,总而言之,CornerNet-Lite提高了关键点检测器的效率。
CornerNet-Squeeze ideas:SqueezeNet通过将3x3的卷积替换为1x1的卷积,减少3x3卷积的通道数,以及后续的下采样操作来减少网络的参数量。SqueezeNet中的building block及fire module包含前两个思想,Fire Module首先会通过包含一系列1x1卷积核来减少输入的通道数,然后,将结果送到包含1x1及3x3卷积核的扩张层中。
前面我们也说了,左上与右下角点的特征不足以代表目标物体的特征,而且大多的角点都不在目标物体上。因此,单纯地依赖角点进行目标检测,模型可能不能很好地理解目标物体的特征。所以,ExtremeNet把左上与右下角点替换成目标的中心点以及其在四个正方向上的极值点(extreme points)来实现检测。ExtremeNet的极点在对象上,是视觉可分的,有一致的局部外观特征(如人的最上面的是头)。
通过预测每个对象类别的4个heatmaps,得到4个极值点,再利用center heatmap检测中心极值点,匹配算法对所有极值点进行组合,并验证组合中是否存在中心极值点。首先为四个边界方向分别生成一个关键点热图以及一个目标中心的热图。当且仅当四个极值点呈几何对其,且该四个极值点组成的边界框的中心在预测的中心点热图上有较大的响应时才认为该生成的边界框有效。
Center Grouping算法,用来进行匹配的: 对于一个category,去除其中四个方位的heatmap,使用ExtractPeak算法去除其中大于阈值(实验中阈值为0.1)的pixel位置,对这四个集合中的点,进行简单的暴力方法遍历(为O(n^4)的复杂度),四个点组成一个框,然后满足基本的四个点的相对位置后,求出这四个点的中心点位置,那么如果这个中心点的center point heatmap上的值如果大于阈值(实验中阈值为0.1),那么就是一个合格的候选框,框的cls score就是五个点的heatmap值的均值。
ExtremeNet使用HourglassNet检测每个类的5个关键点,offset预测与类别无关,与极值点有关,中心点没有offset预测,所以网络的输出是5C个热图和4∗2个偏移图。
与ExtremeNet类似,CenterNet也是基于中心点来实现目标的检测。但CornerNet和ExtremeNet都需要匹配(配对分组)目标特征点,这个过程仍然略显繁复。所以,CenterNet只考虑使用中心点来定义目标,并通过中心点直接预测目标的特性,比如宽高信息,类别,3维位置和朝向等。(直接回归其所指向的目标类别以及以当前点为中心构建的目标最小外接矩形)
CenterNet优点:
CenterNet缺点:
CircleNet是基于肾小球背景下提出来,而肾小球是细胞。通常这种细胞都比较偏向圆形,因此,使用基于圆形的定义比矩形的定义要好,也更加贴合细胞的形态,而且具有旋转不变性!
通过特征提取网络提取图像的特征,而后分别采用三个输出模块预测(1)heatmap,用来表示circle的中心点;(2)local offset,用来修正circle的中心点位置;(3)circle radius:用来表达circle的半径。
CenterNet和CircleNet中的冲突是目标框的中心点重合(基于输出特征层计算的中心点),作者从COCO数据集的统计信息来看,这种重合框的比例非常少,不到0.1%,基本上不会对训练稳定产生太大影响,因此没有针对这个进行解决。(肾小球数据集不存在中心重叠的问题)
(五)基于密集型系列(源于语义分割)前面讲到的CornerNet、CenterNet等都是基于关键点来检测的,而接下来讲的FCOS则是基于分割的思想来进行检测的。而FCN算是语义分割的鼻祖算法,通过一系列的卷积与反卷积实现了对像素级的分类。FCN在语义分割和姿态估计等领域都取得比较不错的效果。之前的目标检测受制于anchor的使用,所以就没有在FCN上进行进一步的探索。而基于关键点检测的anchor-free存在中心重叠检测的问题,因此,FCOS就使用FCN网络直接对图中的每一个像素点的位置到真实物体四边的距离进行一个回归(预测的话就是四个距离回归加上一个目标分类)。换句话说,FCOS的训练对象跟语义分割的是一样的,也就是我们说的像素点。从总体的思路来看,FCOS可以理解为是 DenseBox(基于FCN) 的改进版。
不管是CenterNet的中心重叠问题,还是语义分割的问题,都是像素点类label只有一个的问题。而且FCOS主要是在行人检测,车辆检测的背景下提出来的。所以上面的问题就更加明显了(23.16%)。因此,FCOS在面临多个目标框重叠时,重叠部分的点的监督信息就有多个,但模型训练时监督信息肯定只能有一个,因此通过引入图中金字塔FPN网络来解决。通过不同尺度的特征图分支头来实现不同物体的检测(简而言之,就是FCOS通过多尺度检测来缓解目标重叠问题)。
但语义分割跟目标检测还是不一样的,比如左边这个图(人与羽毛球拍)。在语义分割中,每个像素点只有一个类别的label,但在目标检测中如果发生物体区域重叠的现象,那么一个像素点就不仅只有一个类别label,可能是两个甚至更多个。
FCOS的网络架构,其中C3, C4, C5表示骨干网络的特征图,P3到P7是用于最终预测的特征级别。这五层的特征图后分别会跟上一个head,head中包括了三个分支,分别用于分类、中心点置信度、回归的预测。FCOS网络最后的输出层包含**(4+C)个通道,分别对应预测C个类别得分及4维包围框参数**。整体的架构非常简洁,有很多人通过修改FCOS的输出分支,用于解决实例分割、关键点检测、目标追踪等其他任务。
在FCOS中使用FCN多层预测多尺度的物体,可以有效解决这个模糊性的问题。换言之,重叠的物体就可以不用一张图去预测了,就可以把大物体放在一个深的特征图上,小物体放在一个浅的特征图上去预测了。(这点更YOLOv3中引入多个分支不同分支采用不同的anchor的思想相类似)。同样的,FCOS中分类损失仍然采用Fcoal loss,而回归损失则不再采用点的L1 loss了,而是通过回归四边的距离得到对应真实物体的四个顶角,进而采用IOU loss来进行优化。
因为多尺度结构的存在,就需要确定这个真实框box分配给哪个层级呢?传统的FPN做法是会根据这个box的面积进行分配,而FCOS,就会根据Box中点到四边的最大距离来分配,也就是上面公式的四个分量,怎么分配呢?我们会给每一个层级分配阈值范围,然后看四个分类的最大值落在哪个区间就分配给哪个层级。
FCOS内,我们会把目标框内所有的点平等的作为正样本,这样就会导致产生一个离目标框中心距离远的低质量的目标框。于是,在FCOS中就提出了中心度的概念,也就是center-ness分支,来抑制这些低质量的目标框。center-ness作用于网络中,和分类分支是并行的,是用来预测每个点的中心度。训练的时候,使用二值交叉熵loss,测试的时候,就会把中心度的得分和分类分支的得分做一个相乘,作为某一个点的最终得分。这样每一个位置就有了权重得分了。真正远离中心点的点就会被削弱。后面就可以用NMS的方法将这些点过滤掉了。
我们可以看到较大物体的AP显著提高,这就是由于较大物体的中心偏离比较严重,总体AP提高了有3点。
FCOS的优点
1.将检测和FCN进行结合,可充分利用思想。
2.proposal free和anchor free,减少了超参的设计。
3.不使用trick,达到了单阶段检测的最佳性能。
4.模块化,对其他视觉任务具有较大的可扩展性。
FCOS的缺点
FCOS没有很明确确定中心点,它是依赖于标注信息的。box预测的分配不是很合理。
作为与FCOS和FSAF同期的Anchor-free论文,FoveaBox在整体结构上也是基于DenseBox加FPN的策略,主要差别在于FoveaBox只使用目标中心区域进行预测且回归预测的是归一化后的偏移值,还有根据目标尺寸选择FPN的多层进行训练。
但FoveaBox的整体实现方案太纯粹了,与其它Anchor-free方法很像,所以一直投稿到2020才中…
在FoveaBox中,正样本区域(fovea)的选择并不是真实框所包围的全部像素,而是原区域的一个衰减区域(可以看作是目标的中心区域,缩放因子是人为设定的),这个与DenseBox的设置一样,这样设置的原因是为了防止语义区域的相互交叠!
网络的目标是预测目标的边界,直接预测是不稳定的,因为目标尺寸的跨度很大。为此,论文将目标尺寸归为多个区间,对应特征金字塔各层,各层负责特定尺寸范围的预测。(用于控制特征金字塔每层的回归尺寸范围的缩放因子也是人为设定的)
与DenseBox和UnitBox不同,FoveaBox并不是直接学习目标中心到四个边的距离,而是去学习一个预测坐标与真实坐标的映射关系。
主干网络采用特征金字塔的形式,每层接一个预测Head,包含分类分支和回归分支。论文采用较简单的Head结构,使用更复杂的Head可以获得更好的性能。论文提出了特征对齐的trick,主要是对预测Head进行改造。
和anchor-base进行比较,anchor-free最大的优势就在于其检测器的检测速度,因为不需要预设anchor,只需要对不同尺度的特征图的目标中心点和宽高进行回归,极大的减少了耗时和需要的算力。其缺点则是在于它的精度并不能达到anchor-base方法的SOTA。近两年还提出了一些结合anchor-base和anchor-free的检测器。
各种anchor-free方法的关键在于它们的ground truth是如何定义的。合适的ground truth更加贴合物体真实形态的分布,因此,从先验上来看,模型的检测精度也会对应的提高。走在前端(时间轴)的anchor-free方法灵感大多来源于人体姿态估计和语义分割的处理思想。由此对应地衍生出了我们前面所讲的Keypoint-based和Dense-predicted的anchor-free模型,这两种方法的本质将anchor转换成了point或者说是region来实现物体的检测。
CornerNet、CenterNet等基于关键点的anchor-free模型通过高斯模型泛化关键点区域来定义正样本数据点(heatmap定义),减少模型负样本的惩罚力度;FCOS定义bbox内的像素点均为正样本,而FoveaBox通过衰减因子将bbox缩放,并将缩放后区域FoveaBox内的像素点定义为正样本。
anchor-free的方法能够在精度上媲美 anchor-based的方法,最大的功劳应该归于 FPN,其次归于Focal Loss。在每个位置只预测一个框的情况下,FPN 的结构对尺度起到了很好的弥补,FocalLoss则是对中心区域的预测有很大帮助。
目标检测的gt是一个矩形框,然而用这个矩形框信息来检测目标显然是不合理的,因为矩形框内只有一小部分是目标,而剩下的是背景,这可能会导致检测器的精度下降,而anchor-free改变了gt的定义。gt重新定义之后,需要检测的目标语义变得更加明确了,有利于分类和回归。