Anchor_base的缺点
- bbox的大小,宽高比和数量这些超参对检测器影响很大,改变这些超参数在COCO基准[16]上对AP的性能影响高达4%,因此这些超参需要很小心的去优化。
- 就算很仔细的调整了上述这些超参,因为框的大小和宽高比都已经固定了,一些小目标比较难检测。并且碰到不同的场景任务时,还需要重新设计框的大小等,比较麻烦。
- 大多数bbox在训练时被标记为阴性样本。负样本数量过多加剧了训练中正负样本之间的不平衡。
- Anchor-based在判断正负样本时一般用IOU,从而也导致计算比较复杂。
FCOS结构图
backbone
没啥好讲,resnext就是resnet+inception
neck
就是FPN的魔改,在FPN的基础上增加了P6和P7,但没有增加相应的C6和C7。这是因为FPN结构在高层的语义特征进行融合效果并不好,所以构建FPN没有必要使用所有的卷积层。但为了尺度的多样性,在其后面加入了P6和P7。
FPN的主要作用已被证明是分治而不是特征融合,详见yolof 《 you only look one-level feature》cvpr 2021.06
但特征融合并不是没用只是作用不如分治大,改进特征融合也能上分,详见augfpn 《 Improving Multi-scale Feature Learning for Object Detection》cvpr 2020.06
head
由于越高层特征图的感受野越大,所以我们希望高层head用于检测大物体,低层head用于检测小物体。
论文中将由上而下head负责的范围设定为[0, 64], [64, 128], [128, 256], [256, 512], [512, 正无穷]。
(m1, m2, m3, m4, m5=0, 64, 128, 256, 512)
如果一个位置满足max(l∗,t∗,r∗,b∗)> mi or max(l∗,t∗,r∗,b∗)< mi−1,它将被设置为一个负样本,因此不再需要返回一个边界框。这样就能使不同尺寸的目标被分配在不同级。
分层的好处
解决了不同尺度bbox中心重叠的情况。
多个二分类替代多分类
为了使用focal loss,缓解类别不均衡的问题。
head参数共享
每个head的参数都是一样的。
为什么要参数共享?
解决不同层级head上可学习样本数量不均衡的问题。
如果每个head都有独立的参数,要想让每个head的参数都得到充分的训练,就需要为所有head准备数量足够且不同尺度的样本。共享后无论哪个head有样本,参数都会得到学习,避免了学习不充分。
共享head的优点有哪些?
减少参数,提升精度。
特征图到原图的映射
(x, y)使特征图上面点的坐标,s为特征图到原图的总stride。
对于每个(x, y),如果映射后落在gt里面(ground truth),并且该点的标签和gt的标签一致,则认为是正样本。
除此之外,每一个点还有一个四维向量t = (l, t, r, b),表示(x, y)到左、上、右、下的距离。由于这四个数必是正数,所以论文中使用exp(x)在regression branch顶部进行映射。
FCOS的创新点
center-ness
可以看到classification分支下面还有一个centerness分支,也可以称为quality分支,用于表达预测框的质量,最后再采用nms时检测框的分数就等于分类分数乘以centeness。
nms
对单个类别的NMS的处理步骤如下:
- 根据检测得分对bbox进行sort得到bbox list,记为[b1, b2, …, bn];
- 将分最高的bbox记为bm,加入到最终输出列表,并将bm从bbox list移除;
- 计算bm与bbox list中每一个检测框的IoU,大于阈值的从bbox list中移除;
- 重复上述操作,直到bbox list为空;
Centerness表示的是(x,y)距目标中心的标准化后的距离,为了制止过多的低质量离目标中心远的检测框而设计,加Sqrt是为了减缓centerness的衰减速度。
之所以引入quality分支是因为之前的双分支模型理所当然的将分类质量等同于预测框质量,这种做法并不是十分合理,quality分支的作用就是将其进行解耦。