因为用到了某家带bpu的(懂的都懂) 他们支持这个只是demo做的有点差 还没有c++的~~
因为他们用所以就搬来了 勿怪啊 基于昨天和他们相关的tops 又说说这个!!
FCOS是一种基于全卷积的单阶段目标检测算法,并且是一种Anchor box free的算法。其实现了无Anchor,无Proposal,并且提出了Center-ness的思想,极大的提升了Anchor-Free目标检测算法的性能。
类型:基于multy-level的目标检测模型
Paper link:https://arxiv.org/pdf/1904.01355.pdf
Code link:https://github.com/tianzhi0549/FCOS
anchor box 的弊端:
1.太多超参数,调试复杂
检测性能对anchor的尺寸、宽高比、数量十分敏感。比如RetinaNet中,调整超参数能够影响4%的AP在COCO数据集上。因此对于anchor的超参数需要细致调整。
2.难以处理尺度变化很大的目标,尤其是很小的目标
预定义的anchor框尺寸和宽高比是固定的也会妨碍检测模型的泛化性能,检测模型会难以处理尺度变化很大的目标,尤其是很小的目标。
3.通用性差
对于新的检测任务就需要重新设计anchor
4.negative sample 占比太大,正负样本不均衡
为了获得更高的找回率,基于anchor的模型会在输入图像上密集放置anchor框,大多数anchor框在训练阶段被认为是负例,过多的负例加剧了正负样本之间的不平衡。
5.计算复杂
大量的anchor框也会明显增加计算量和内存占用,尤其在iou计算的阶段。
问题:
全卷积FCN神经网络在密集预测任务(语义分割、高度估计、关键点检测、计数)上获得了巨大的成功。作为其中一种高层的视觉任务,目标检测因为用到了anchor,可能是唯一一个没有纯粹全卷积像素级预测的任务了。很自然我们会疑问:我们能通过简单的像素级预测来做目标检测吗,像语义分割中的FCN那样?
现有方法和存在的问题:
一些工作尝试去构造一种FCN-base的框架,如DenseBox、UintBox。具体来说,这些FCN-base的模型直接在特征图的一层的每个空间位置上预测一个4D向量和一个类别。如图1左所示,4D向量 (l,t,r,b)表示该位置到边界框四条边的偏移量。这些模型和语义分割的FCNs很像,除了每个位置需要回归一个4D向量以外。
DenseBox图像金字塔多次重复计算
为了处理不同尺寸的边界框,DenseBox将训练样本缩放成固定尺寸,从而在特征金字塔上进行检测,这和一次计算所有卷积的FCNs理念不同。
重叠处的像素回归的框是不明确的
而且,这些方法主要用在特定区域的检测上,比如场景文字检测和人脸检测,因为边界框大大重叠,所以这方法不适合在通用目标检测上使用。如图1右所示,高度重叠的边界框会给训练带来问题:重叠处的像素回归的框是不明确的。
如左图所式,FCOS预测一个4D向量 (l,t,r,b)来编码每个前景像素点对应边界框的位置(训练时由ground-truth监督)。右图展示了一个像素点对应多个边界框,这可能会给边界框的回归带来问题。
解决方法
1.使用FPN可以大幅度减弱目标分类和回归的这种不明确性。
2.“中心度”(center-ness)分支来预测一个像素到对应边界框中心的偏移,差的边界框会被”中心度“分支抑制
这种新的检测模型有如下优势:
方法
在这首先推导目标检测在像素级预测范式中的形式。其次展示了如何利用多层预测来提高召回率,解决训练中重叠边界框的不确定性的问题。最后,提出了“中心度”分支,抑制差的检测框,大幅度提高总体性能。
1.网络结构
FCOS采用的网络架构和RetinaNet一样,都是采用FPN架构,如图2所示,每个特征图后是检测器,检测器包含3个分支:classification,regression和center-ness。
2.正负样本定义
如果其落在任何GT的中心区域,就认为这个位置为正样本,并负责预测这个GT,在映射后的该点直接回归目标框,而不是把这个点看成目标框的中心点进行回归;否则为负样本。如果落在多个GT的区域内,则称其为模糊样本(ambiguous)。
3.FPN结构和ambiguous样本的处理
重叠框会在训练过程中带来二义性模糊的问题,因为重叠区域的像素需要判断:我到底该去回归哪个框呢?这是导致FCN based模型性能较差的一个原因。对于anchor-based方法,采用FPN时会将不同大小的anchor放置在不同大小的特征图上,特征图越小,感受野相应更大,用来检测更大的物体。同样地,这种设计理念可以用在FCOS模型上,以解决前面所说的模糊样本问题。

上python
class Scale(nn.Module):def __init__(self, init_value=1.0):super(Scale, self).__init__()self.scale = nn.Parameter(torch.FloatTensor([init_value]))def forward(self, input):return input * self.scale
但是现在的版本中,前面已经提到每个特征图上的回归值其实是已经除以特征图的 s 进行缩放,这样就和学习一个scale值基本等同,所以加不加这个策略都可以。
模糊样本的出现大部分是由于物体重叠造成的,但是重叠的物体大部分其大小是不同的,所以FPN的使用可以更一步解决模糊样本问题。
4.网络输出和loss定义
和RetinaNet一样采用 C 个二分类,classification分支共输出C个预测值,loss采用focal loss。
2. regression分支
regression分支每个位置预测一个实数向量 t=(l,t,r,b) ,其对应的target为当前位置与GT框4个顶点间的距离:

loss计算使用的是IOU loss。
3. ceterness分支
FCOS在regression分支的末尾添加了一个额外的center-ness分支(最早的版本是放在classification分支,但是放在regression分支效果更好)来抑制那些由那些偏离目标中心的位置所预测的低质量检测框。center-ness分支只预测一个值:当前位置与要预测的物体中心点之间的归一化距离,值在[0, 1]之间,图4给出了可视化效果,其中红色和蓝色值分别1和0,其它颜色介于两者之间,从物体中心向外,center-ness从1递减为0。
给定回归的 target=(l∗,t∗,r∗,b∗) ,center-ness的target定义为:

centerness 可视化
centerness 的loss计算使用BCE损失。
最终的loss是三个loss相加。(以下是分类和回归loss)

在测试阶段,最终的置信度为center-ness和分类概率的乘积:
六、实验
简要提一下,日后如果感兴趣再补。
COCO训练集上训练,验证集上测试和消融研究,在测试集上提交得到最终结果。
如果没额外说明:
训练: 主干resnet50,优化器SGD训练90K次迭代,初始学习率0.01,batchsize=16,学习率在60K和80K次迭代时减小10倍,衰减系数1e-4,动量0.9。用ImageNet预训练模型,RetinaNet中的初始化方法初始化其他参数,输入图像短边固定在800,长边小于等于1333。
预测: 输入图像经过模型,后处理和RetinaNet相同(包括超参数)。
消融分析





如左图所式,FCOS预测一个4D向量 (l,t,r,b)来编码每个前景像素点对应边界框的位置(训练时由ground-truth监督)。右图展示了一个像素点对应多个边界框,这可能会给边界框的回归带来问题。
分类得分乘以ceterness之后,,低质量的不准的框大大减少,相当于减少了FP.
下面在复习一下~~ whaosoft aiot http://143ai.com
Anchor free的好处是:
因此,FCOS的优点是:
FCOS包含三个大模块:


正负样本定义
一个目标检测算法性能的优异性,最大影响因素就是如何定义正负样本。而FCOS的定义方式非常通俗易懂。主要分为两步: (1) 设置regress_ranges=((-1, 64), (64, 128), (128, 256), (256, 512),(512, INF),用于将不同大小的bbox分配到不同的FPN层进行预测即距离4条边的最大值在给定范围内 (2) 设置center_sampling_ratio=1.5,用于确定对于任意一个输出层距离bbox中心多远的区域属于正样本(基于gt bbox中心点进行扩展出正方形,扩展范围是center_sample_radius×stride,正方形区域就当做新的gt bbox),该值越大,扩张比例越大,选择正样本区域越大;(细节:如果扩展比例过大,导致中心采样区域超过了gt bbox本身范围了,此时需要截断操作)
损失函数
上面已经发了~~!!
Center-ness的计算公式如下,其范围为0-1,训练阶段使用BCE Loss并和之前的损失函数相加,测试阶段用于加权预测得分:

实验结果
对比实验结果:

有无Center-ness分支的消融实验:
替换RPN的消融实验:
上一篇:软件工程结构化设计
下一篇:StarRocks 的学习笔记