说明
anchor free系列是单阶段检测算法另外的一个发展分支,了解anchor free常见的算法是非常有必要的。
免责申明
有误写/错写/错误观点/错误解读,或者大家有其它见解,都可以在评论区指出,博主会认真学习的。
原始论文下载链接
CornerNet、CenterNet、FCOS。
目录结构
anchor free就是不使用anchor的意思。其它类似的xxx free也是不使用xxx的意思。
使用anchor机制主要存在两个缺点:
CornerNet的关键就是通过对象左上和右下两个角点来定位。
论文中的模型架构如下图所示:
上述架构主要分为三个部位:输入图像 + hourglass网络 + 预测模块。
这个预测模块很简单,但是有两点需要注意,即corner pooling 和 三个输出值。
首先,看下图:
对于这些对象,并不是方方正正的,而为了保证获取的角点(左上点和右下点)是该对象最上面或最下面的点,就需要进行corner pooling。
原理如下图所示:
首先分两个方向进行单方向的最大池化操作,最后将两个方向相同位置的值相加即可。举个例子如下:
HeatMaps
输出预测角点信息,可以这么理解,heatmaps既包含了关键点信息,同时包含了概率值。另外,heatmap每个点都是关键点,可以通过将关键点映射到原图与真实box计算损失,也可以将真实box映射到与heatmap相同尺寸计算损失。
损失公式:
这个公式是Focal Loss的改版,其中α控制样本的难易程度、C表示目标类别(不包含背景)。
Offsets
输出回归偏移量,用于微调预测框,因为特征图转为原图时会造成取整误差。
损失公式:
公式为常用的目标检测回归偏移损失,其中ok为:
其中n表示缩放因子。
Embedding
一个图像不只一个对象,那么就不只一对角点,那么问题就是不同的角点如何匹配?因此,作者给定第三个输出,用一个间距向量来表示,向量间距越小,匹配程度越高。
其损失公式分为两个部分,一个是缩小相同角点的间距,另外一个是放大不同角点间距:
看下图:
其实上面的预测框已经很不错了,但是网络仍然会计入损失。因此,我们需要引入一个阈值来控制损失值,这个阈值的方法就叫做高斯圆。
我们可以假设临界情况IOU为0.7或者某个值,然后通过上面三幅图计算出高斯圆的半径r为多少。
CenterNet是通过中心点来检测目标的。
CenterNet的架构和CornerNet的架构都类似,分为三个部位:
以resNet为backbone展示其流程
1. image resize 为 512*512,则输入shape为【1,3,512,512】
2. ResNet输出【1,2048,16,16】
3. 将输出特征图反卷积上采样为【1,64,128,128】
4. 送入三个预测分支:
heatmaps : 【1,80,128,128】 (80表示类别个数)
sizes : 【1,2,128,128】 (2=w+h,图像尺寸)
offsets : 【1,2,128,128 (2=x、y的偏移值)
centerNet的损失函数和CornerNet的损失函数大体类似,只是细节有点差别:
具体的公式如下:
其中N是关键点个数、sk表示目标预测尺寸,p是中心点坐标,R是缩放因子,p-是缩放后的中心点的近似整数目标(这一点和corner net一样)。
sizes
这个是box的尺寸大小,配合中心关键点来确定整个box。
offsets
这个是偏移量,主要是因为真实框落于特征图上时,由于取整操作会导致误差存在,因此引入了该误差。
heatmaps
这个是为每个类别生成一个heatmap图,用于确定中心点位置和目标概率值。
FCOS不像cornernet、centernet,它是预测关键点到预测框的四个距离值来实现检测的。
架构很容易读懂,但是有几个关键点:
首先,要知道什么是模糊样本,即关键点同时落入多个GT内的点。
针对这些点,引入FPN和PAN的作用就是利用不同的大小的特征图,去预测不同大小的对象,这样可以尽量去避免模糊样本的存在。同时,还可以提高模型的精度。
公式如下:
其中,Lcls采用的BCELoss和Focal loss(正负样本都参加计算)、lreg采用IOU loss(正样本才参加)。
其中,Sx,y就是特征图上(x,y)这个点的center-ness值,作者在论文中给出了其公式和含义,即用于衡量关键点到中心点的距离:
在FCOS中,由于回归得到的值是关键点到box的四条边的距离。因此,原理如下图所示:
计算公式如下:
因此,模型能够输出的四个距离值与真实距离值越接近效果越好。
上面简单解读了三个经典的anchor free算法,这些anchor free算法都是基于某个关键点去检测目标,虽然没有利用anchor机制,但是关键点的生成其实与anchor思想有点类似之处(anchor为特征图每个特征点生成一定数量的建议框,而anchor free则是生成了一个热图,热图的每个点都是关键点,然后再利用这些关键点和真实box映射的值对比进行训练模型)。