Anchor-free 的检测算法可分为anchor-point的算法和key-point的算法。Anchor-point 检测器通过预测目标中心点,边框距中心点的距离或目标宽高来检测目标,本质上和anchor-based算法相似,此类算法有FCOS,CenterNet等;而key-point方法是通过检测目标的边界点(如:角点),再将边界点组合成目标的检测框,典型的此类算法包括CornerNet, RepPoints等。
1 FCOS
论文链接:https://arxiv.org/abs/1904.01355
代码链接:https://github.com/tianzhi0549/FCOS/
FCOS是ICCV2019的一篇文章,其主干网络和RetinaNet的差不多,只是在分类分支上多了一个centerness 分支,用于确定当前点是否是检测目标的中心。因为是anchor-free的方法,最后分类分支和回归分支输出feature map 的 channel 也分别是 C(类别数) 和 4(l,t,r,b),不需要乘以anchor数(K),因此相比anchor based的输出,FCOS的输出可用减少K倍。
1.1 边界框的表示形式
一般目标检测的边界框使用(x,y,x,y) 和 (x,y,w,h) 之类的坐标表示,但FCOS是不同的,FCOS是从一个点开始,然后使用该点与ground truth之间的垂直和水平距离(l,t,r,b)来表示边界框的。通过用点标记,FCOS可以获取更多正样本样本以改善正负样本不平衡状况。具体如下图所示:
1.2 正负样本分配
Step1:分配目标给哪一层预测。引入了min_size和max_size,具体设置是0, 64, 128, 256, 512和无穷大。例如,对于输出的第一个预测层而言,其stride=8,负责最小尺度的物体,对于该层上面的任何一个点,如果有gt bbox映射到特征图上,满足0 < max(中心点到4条边的距离) < 64,那么该gt bbox就属于第1层负责,其余层也是采用类似原则。总结来说就是第1层负责预测尺度在0~64范围内的gt,第2层负责预测尺度在64~128范围内的gt,以此类推。通过该分配策略就可以将不同大小的gt分配到最合适的预测层进行学习。
Step2:确定正负样本区域。通过center_sample_radius参数,确定在半径范围内的样本都属于正样本区域,其余区域作为负样本。默认配置center_sample_radius=1.5。例如,第1层的stride=8,那么在该输出层上,对于任何一个gt,基于gt bbox中心点为起点,在半径为1.5*8=12个像素范围内点都属于正样本区域。
Step3:centerness找到目标的中心点。使得离目标中心越近,输出值越大,反之越小。Center-ness的定义如下公式:
可见最中心的点的centerness为1,距离越远的点,centerness的值越小。在推测的时候直接将中心度分数centerness乘到分类分数上,将偏离很远的检测框分值进行惩罚。
1.3 损失函数
网络的输出依然包括分类和检测分支,具体损失函数公式如下:
(1)分类任务
分类任务通过卷积输出是80维的向量,代表的是80个类别,并采用的是focal loss损失函数。
(2)检测任务
检测任务输出的4维的向量,分别对应点到上下左右边的距离(l, t, r, b),并采用IOU loss。
(3)Center-ness loss
由于中心度的大小在0–1之间,因此在训练的时候使用BCE loss将其加入到训练中。
1.4 小节
FCOS是从一个点开始,然后使用该点与ground truth之间的垂直和水平距离(l,t,r,b)来表示边界框的,并通过引入层、区域、中心确定正负样本的分配。
2 CenterNet
论文链接:https://arxiv.org/pdf/1904.07850.pdf
代码链接:https://github.com/xingyizhou/CenterNet
其实有两篇 CenterNet,分别是Objects as Points这一篇与Keypoint Triplets for Object Detection这一篇。数据上后者优于前者,方法也是后者比较复杂。本文介绍的是Objects as Points这一篇,Objects as Points和FCOS有些相似,但更为简洁流畅,是我很最喜欢的方法。
CenterNet的Head层默认是输出80个类、2个预测的中心点坐标、2个中心点的偏移量。如下官方源码:
代码语言:javascript复制(hm): Sequential((0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): ReLU(inplace)(2): Conv2d(64, 80, kernel_size=(1, 1), stride=(1, 1)))(wh): Sequential((0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): ReLU(inplace)(2): Conv2d(64, 2, kernel_size=(1, 1), stride=(1, 1)))(reg): Sequential((0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): ReLU(inplace)(2): Conv2d(64, 2, kernel_size=(1, 1), stride=(1, 1)))
其中,hm为heatmap、wh为对应中心点的width和height、reg为中心点的offset,特征图的大小分别为 :
2.1 边界框的表示形式
如上图所示,CenterNet采用中心点和宽高来表示一个物体。和FCOS很相似,最大区别在于CenterNet使用的是中心点。
2.2 正负样本分配
与FCOS不同的是,CenterNet引入高斯热图确定正负样本。令中心点为 p,其计算方式为,对于经过网络下采样后的坐标,设为(R 为输出对应原图的步长,本文中R为4),然后将GT坐标通过高斯核分布到热图上,高斯核的计算公式如下:
其中,sigma 是一个与目标大小(也就是w和h)相关的标准差,而c 是在类别数目,如在COCO数据集上,c 的值为80,代表当前有80个类别。
生成的高斯热图如下所示,绿色框是GT,白色的椭圆是高斯核。
因此,对于Yxyc=1,表示在当前中心点 (x, y)位置的物体类别是 c ,Yxyc=0 则表示当前这个坐标点不存在类别为 c 的物体,而 Yxyc=(0,1) 的坐标点是困难样本。
- 那么为什么学习高斯热图,而不是0-1图?
在目标检测中,中心点附近的点其实都非常相似,如果直接将这些点标为负样本,会给网络的训练带来困扰;如果将其用高斯函数做一个“软化”,网络就会更好收敛。高斯热图能够给网络训练增加一个方向性的引导,距离目标点越近,权重就越大,这一点和FCOS的centerness的作用基本一致。
因此,CenterNet中正样本就是高斯核的中心点,高斯核中心附近的点是困难样本,不在高斯核内的都就是负样本。至于困难样本是正样本还是负样本,我认为很难界定。
2.3 分类任务
目标函数如下,使用的是像素级的Focal Loss来处理样本不平衡的问题:
其中,alpha和beta是Focal Loss的超参数,实验中分别设为2和4,N是图像中物体的个数,除以N主要为了将所有Focal Loss归一化。
2.4 offset回归
Offset回归和ROIAlign的出发点是相似的,图像下采样的时候,ground truth会因数据的取整而产生偏差,因此,需要对每个中心点预测偏移量,所有类别共享这个偏移预测分支,这个偏移用L1 Loss来训练:
2.5 wh回归
假设图像上的第k个物体的类别为c,它的包围框为(x1,y1,x2,y2),中心点为pk,对于这个物体,预测一个尺寸sk=(x2-x1,y2-y1),那么L1损失函数可以表示为:
因此,整个网络的损失函数由中心点loss、offset loss和wh loss的组成,并使用不同的权重参数。
2.5 小节
CenterNet可以看作是FCOS的进阶,确定了center和构造高斯热图的重要性。
3 RepPoints
论文链接:https://arxiv.org/abs/1904.11490
代码链接:https://github.com/microsoft/RepPoints
RepPoints是ICCV2019的一篇文章,提出了一种使用representative points表示图像中的目标的方法,相比于CenterNet(Objects as Points)这篇文章,虽然都是用points表示目标,但其实原理大相径庭。
RepPoints 思路很简单。给定靠近物体中心的源点(如下图,以红色标记点),将一个 3x3 的卷积应用于这个点的图像特征上,回归出多个目标点和中心源点的偏移值,这些目标点共同构成代表性点集(RepPoints)。
RPDet采用FPN结构,如下图展示了其中一个尺度。具体来说,RPDet其实有两个阶段:
- 第一阶段,将feature map上的点作为初始点(图中的绿色点),预测9个offset (Δx,Δy)参数(图中的蓝色点);
- 第二阶段,在这9个点的基础上进行refine,通过conv预测相对于第一阶段(Δx,Δy)的offset,得到最终的RepPoints。
3.1 目标表示
如下左图表示一般目标检测算法使用边界框来表示目标位置信息,如SSD,FCOS等等,而右图则表示了RepPoints使用representative points的方法来表示目标位置。这种新的表示方法称为代表性点集(RepPoints),优势是能适应物体姿态或形状的变化,从而提供了一个对物体更加细致的几何描述,同时这些点也能用于提取对识别有用的图像特征。
RepPoints是如何表示object的呢?
对于一个object,本文用点集表示其空间位置:论文中,默认 k=9,然后利用9个点生成的pseudo box(虚拟框)。文中给出了三种不同的生成方式,分别是:
- Min-max function:在RepPoints上执行两个轴上的Min-max操作以确定pseudo box,等效于所有采样点上的边界框值;
- Partial min-max function:在两个轴上分别对样本点的子集进行最小-最大运算,以获得pseudo box;
- Moment-based function:使用RepPoints的平均值和标准偏差用于pseudo box的中心点和比例计算。
3.2 正负样本分配
第一阶段的正样本分配原则为:(1)计算每一层的feature map bin:
其中,是GT框的宽高。
(2)目标的GT中心落在对应的feature map bin的都是正样本;
第二阶段的正样本分配原则:将 GT 和 第一阶段产生的伪框的IoU大于0.5的认为是正样本,小于0.4为负样本,在此之间的忽略不计。
3.3 分类任务
使用Focalloss处理样本不平衡的问题。
3.4 回归任务
第一阶段和第二阶段都是先将respoint转换为伪框(pseudo box),然后计算伪框的左上角和右下角和GT的point损失,损失函数是SmoothL1Loss。
3.5 小节
RepPoints是key-point类的检测器,不过可以看作是CenterNet的进阶。因为如果RepPoints如果只预测两个点,那么就等价于预测左上和右下角了,这样又有了centernet的影子。具体细节上差异其实真的不少,毕竟 RepPoints 使用了点集表示目标物体,和使用边界框从出发点来看是不一样的。
4 总结
事实上,anchor free的方法有很多,而且不像anchor方法那样整洁,本文也仅整理了一小部分内容。但无论是anchor还是anchor free,检测任务无非就是这样的思路:
(1)表示:如何表示图像上的物体,如bbox,conner,center,reppoints等;
(2)分配:如何分配正负样本:IOU、高斯热图、centerness等;
(3)分类:分类任务计算物体类别损失,解决样本不平衡的问题;
(4)回归:回归任务计算物体尺度、offset等等,以进行一些修正。
Anchor free可以看做是检测算法的进阶资料,因为anchor引入了先验框这种很强的假定,而anchor free则发散到了这套检测思路的本质,如何表示?如何分配?如何计算loss?尽管anchor free的方法很杂,但都是在围绕这几个问题展开。有些人认为FCOS和CenterNet等是single anchor,因为使用a point进行预测,这种说法也是有道理的,不过我认为没有必要care这些。
这篇文章先到这里,如果要评价anchor和anchor-free到底孰优孰劣,真的很不容易,数据和算法也往往都是成对的。
检测的话题还真的不少,下一篇,计划讨论label assign和disalignment。如果您有感兴趣的话题,可以在讨论区中发布,或许就是我们接下来的写作方向。 yw
本文仅做学术分享,如有侵权,请联系删文。