本文探讨了目标检测中一直存在的一个问题,网络的结构和分类、分割有很大的不同,整个流程太复杂,主要原因是anchor的使用,我们知道,从RCNN开始使用selective生成密集box,到faster rcnn使用RPN模块来生成密集anchor,这种方法在目标检测中取得了很大的成功。但是这种方式背离了全卷积这种优雅的结构方式,因此作者这里提出了一种不依赖anchor的方法。
一、Introduction
基于anchor检测方法的缺点:(1)检测的效果对anchor的大小、宽高比和数量很敏感。(2)由于anchor的大小和宽高比是固定的,因此网络对和设定的anchor相差较大的目标效果不好,特别是小目标。(3)由于anchor的数量密集,但是大部分是negative的,这会造成训练样本的不均衡,要靠人工筛选限定的方式来解决这个问题。(4)在训练过程中需要大量计算IoU,这需要的计算量很大。
二、Related work
Yolo v1直接使用回归的方式去计算目标框,我们知道这种方法的漏检率比较高,特别是对于小目标,根本原因是网络只是利用了目标框的中心点所在的格子来检测,而这个数量是比较少的,对于特征图没有充分的利用。
CornerNet是基于关键点的检测,不仅计算量大而且对现有的网络架构不适合。
三、FCOS
1、:网络的第i层特征图,s代表stride步长。代表gt_box。、分别代表左上角和右下角的坐标。:物体类别。
对于中的任意一个点,其在原图上对应的组标为,如果落在gt_box内部,则其为positive,我们计算距离gt_box四条边的距离,分别为,回归的目标为,具体如下图左边部分。
2、网络输出
(1)分类分支:,这里不是直接进行c分类,而是改为c个二分类。
(2)回归分支:,因为我们知道回归的目标肯定是正的,因此我们用指数函数exp(x)作用在网络的输出结果上。我们知道exp函数的取值范围是,因此这种做法是合理的。
(3)在分类分支旁边新增要给center-ness分支,迎来抑制距离gt_box中心较远的,维度为:
(4)借鉴focal loss中的做法,在每个分支的head中增加4个卷积层,而且这个head在FPN的结构中是共享的。
3、loss
其中是focal loss,是IoU loss,这里可以考虑改用GIoU loss或者DIoU loss。
四、FPN结构
基于anchor的方法,是在不同的特征图中使用不同大小的anchor。我们这里的做法是直接使用限制回归的范围,在不同特征图中回归不同大小的目标,原则就是在低层中检测小目标,在高层中检测大目标。如果或者,则设置为negative。其中,。
基于这个原则,不同大小的目标会被分配到不同的层,如果一个location属于两个目标(即重叠目标),而且这个两个目标被分配在了同一个特征图,那么将其选择为小物体。
在上面的介绍中,我们知道,不同大小的特征图共享head,这种方法看起来是不合理的,所以我们这里对标准的exp函数进行修改,用代替,这里是一个可训练的变量以适用于不同大小的特征层。
五、center_ness for FCOS
cnter-ness描绘的是和gt_box中心点的距离,需要回归的目标为:
这里使用的损失函数是BCE loss,而且最终的loss需要加上这里的BCE loss。
注:(1)在inference阶段,目标得分=center-ness * 分类得分。
(2)作者的试验中,center-ness结构放在回归分支结果会更好。