赞
踩
FCOS是一种one-stage、全卷积(Fully Convolutional)结构的目标检测模型,发表于2019年ICCV。(什么是one-stage?)
论文原地址:https://arxiv.org/abs/1904.01355
作者源码:https://github.com/tianzhi0549/FCOS
作者的源码有些复杂,我找了一个简单的版本https://github.com/zhenghao977/FCOS-PyTorch-37.2AP,作为本文的详解代码。
FCOS不同于在此之前热门的anchor based方法(比如R-CNN系列),没有设置anchor boxes来作为目标的候选区域,而是使用全卷积网络,结合FPN,直接拿去做检测,实现了anchor free,并达到了当时的state-of-art。当然anchor free这个概念不是作者提出来的,很早就有了。
作者在文中主要与anchor based检测方法作对比,首先指出anchor based方法的缺点:
然后对比anchor based方法,阐述了FCOS的优点,其实就是把上边的缺点反过来就是了:
这一部先讲一下FCOS如何推理,每一步详细做了什么操作,后边再讲FCOS如何进行训练。
文章作者给出了算法结构图,这也算是推理的流程图,非常重要的一张图
第三部分中的Classification和Regression好理解,分别是目标分类和bounding box 的回归,夹在中间的Centerness是作者的主要创新点之一,旨在减少低分目标框,具体的后边会说。
代码里边的BackBone用的是ResNet50,这个东西我就不展开了,我们可以看一下代码上实现。
下图是ResNet网络的结构,其中,我把作者用到的输出层标注出来了,对应图1 -> Backbone的
C
3
C3
C3,
C
4
C4
C4,
C
5
C5
C5
class ResNet(nn.Module): def __init__(self, block, layers, num_classes=1000,if_include_top=False): self.inplanes = 64 super(ResNet, self).__init__() self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False) #对应前图2上conv1 self.bn1 = nn.BatchNorm2d(64) self.relu = nn.ReLU(inplace=True) self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) self.layer1 = self._make_layer(block, 64, 3) #对应前图上conv2_x self.layer2 = self._make_layer(block, 128, 4, stride=2) #对应前图2上conv3_x self.layer3 = self._make_layer(block, 256, 6, stride=2) #对应前图2上conv4_x self.layer4 = self._make_layer(block, 512, 3, stride=2) #对应前图2上conv5_x self.avgpool = nn.AvgPool2d(7, stride=1) if if_include_top: self.fc = nn.Linear(512 * block.expansion, num_classes) self.if_include_top=if_include_top
推理代码:
def forward(self, x):
x = self.conv1(x)
x = self.bn1(x)
x = self.relu(x)
x = self.maxpool(x)
x = self.layer1(x)
C3 = self.layer2(x)
C4 = self.layer3(C3)
C5 = self.layer4(C4)
return (C3,C4,C5)
这里提一下,论文里的输入图像
x
x
x尺寸是
[
800
,
1024
]
[800, 1024]
[800,1024],
C
3
C3
C3、
C
4
C4
C4、
C
5
C5
C5的尺寸分别是
[
100
,
128
]
[100, 128]
[100,128],
[
50
,
64
]
[50, 64]
[50,64],
[
25
,
32
]
[25, 32]
[25,32],对于输入来说,
C
3
C3
C3、
C
4
C4
C4、
C
5
C5
C5的stride分别是
8
8
8、
16
16
16、
32
32
32,这也是图1最左侧那些数字的含义。
在实际推理的时候,却不用严格按照
[
800
,
1024
]
[800, 1024]
[800,1024]来输入,因为是Backbone是全卷积结构,对输入图像的尺寸没有苛刻的硬性要求,比如输入尺寸
[
885
,
1000
]
[885, 1000]
[885,1000]也是ok的。
Feature pyramid network是CVPR2017年的一篇文章,它在目标检测中融入了特征金字塔,提高了目标检测的准确率,尤其体现在小物体的检测上。FCOS作者使用FPN的原因是,FPN可以将不同尺度的目标分开检测,达到一个分而治之的效果。具体是怎么“分而治之”,这一节后边讲,先说一下FPN具体是什么东西,怎么实现的。
![在这里插入图片描述](https://img-blog.csdnimg.cn/f24f722260f74f1ea2797f05ce916f40.png#pic_center
图3 坐上部分对应的是图1的Backbone,是一个全卷积特征提取的过程,右边是一个自上而下的上采样+特征融合。
以图1来说, C 5 C5 C5经过一个 1 ∗ 1 1*1 1∗1卷积得到 P 5 P5 P5, P 3 P3 P3经过 1 ∗ 1 1*1 1∗1卷积,再与 P 5 P5 P5相加,得到 P 4 P4 P4,这里就有一个特征融合的过程了,由于 P 4 P4 P4和 P 5 P5 P5的尺寸不一样,正好差了2倍,所以 P 5 P5 P5要经过2倍的上采样才能与 P 4 P4 P4相加,上采样使用的是最近邻采样;相加之后得到的 P 5 P5 P5还要经过一个 3 ∗ 3 3*3 3∗3卷积层才能去做预测,就是图3红色的那部分。同理, P 3 P3 P3则是由 C 5 C5 C5和 P 4 P4 P4融合而来。除此之外,FCOS作者做了一些改动,就是增加了 P 6 P6 P6和 P 7 P7 P7,他们由 P 5 P5 P5经过 1 ∗ 1 1*1 1∗1卷积层而来,stride为2。
上边,为什么要进行
1
∗
1
1*1
1∗1卷积和
3
∗
3
3*3
3∗3卷积呢?
我的理解是:
1
∗
1
1*1
1∗1卷积核,最明显的目的是解决
C
3
C3
C3、
C
4
C4
C4、
C
5
C5
C5 通道数不同的问题,因为后边相加需要通道数相同才行,当然
1
∗
1
1*1
1∗1卷积还有一些其他好处,我这里就不展开了,有兴趣的可以跳转这里;
3
∗
3
3*3
3∗3卷积的作用,FPN原文是这么说的(下边的英文),意思是降低上采样带来的混叠效应。
we append a 3×3 convolution on each merged map to generate the final feature map, which is to reduce the aliasing effect of upsampling.
从FPN获取最终的特征图后,就要塞进Head获得最终结果了,FPN最后输出5个特征图,那么这5个特征图都要塞进Head网络。
好,到这里,FPN是怎么实现的说完了,我当时看到这里的时候,就有疑问,我拿啥去测?框呢,为啥没有候选框?
别急,下一小节慢慢道来
如果是anchor based的算法,此时会以特征点为中心,划分出anchor boxes拿去回归;而FCOS直接对特征点对应原图的边框都进行回归。什么意思呢?就是先把特征点映射回原图像上,然后直接对这个点进行分类、回归。注意这里虽然是针对一个特征点进行预测,不代表FCOS是没有候选框的,或者说该特征点的感受野就是候选框。
映射关系为:
(
x
o
r
i
g
i
n
,
y
o
r
i
g
i
n
)
=
(
x
f
e
a
t
s
+
s
2
,
y
f
e
a
t
s
+
s
2
)
(x_{origin}, y_{origin})=(x_{feat}s+\frac{s}{2},y_{feat}s+\frac{s}{2})
(xorigin,yorigin)=(xfeats+2s,yfeats+2s)
其中,
(
x
f
e
a
t
,
y
f
e
a
t
)
(x_{feat},y_{feat})
(xfeat,yfeat)为特征点坐标,
(
x
o
r
i
g
i
n
,
y
o
r
i
g
i
n
)
(x_{origin}, y_{origin})
(xorigin,yorigin)映射回原图后的坐标,
s
s
s为采样倍数stride
再举个例子,现在输入图像是640x640,这个特征图的stride是32,那么这个特征图的尺寸就是20x20,现在我们将特征点(3,4)
映射回去,得到该特征点对应的候选框中心为(112,144)
,这个候选框的尺寸是32x32
此外,候选框的个数就是FPN输出的5个特征图上所有特征点数量,一个特征点对应一个候选框。
好了,说完候选框的由来,继续说由特征图生成最终结果。
Head网络也是全卷积网络,中间是什么结构我就不管了,主要关注模型的输出。输出结果分为三个部分,Classification、Centerness和Regression。
Classification
:表示分类结果,尺寸与类别数量有关,如果是20类,就是每一类的得分;
Regression
:表示目标位置偏移,相对于候选框,四个值分别表示相对于候选框的上下左右偏移;假设回归结果是
(
l
,
t
,
r
,
b
)
(l,t,r,b)
(l,t,r,b),候选框左上角坐标是
(
x
1
,
y
1
)
(x1,y1)
(x1,y1),右下角坐标是
(
x
2
,
y
2
)
(x2,y2)
(x2,y2),那么回归后的目标位置就是:左上:
(
x
1
+
l
,
y
1
+
t
)
(x1+l,y1+t)
(x1+l,y1+t),右下:
(
x
2
+
r
,
y
2
+
b
)
(x2+r,y2+b)
(x2+r,y2+b)
FCOS训练的时候,首先要走一遍推理流程,然后根据推理结果和标签值计算损失函数,最后进行反向传播。
所以,这一节最主要的还是损失函数的计算,这个又牵扯到anchor free里边比较特殊的一部分:正负样本的划分,因此,这一部分主要讲解两个问题:正负样本如何划分和LOSS函数
如果你了解anchor based检测算法,比如yolov3/4/5,那你应该知道他们正负样本划分的依据是IOU,但是FCOS不是这么划分,因为它压根不计算IOU。FCOS的正负样本划分可以分为三步:
1、位置
再看一眼前边的映射公式,最朴素的思想就是:如果一个特征点对应的
(
x
o
r
i
g
i
n
,
y
o
r
i
g
i
n
)
(x_{origin}, y_{origin})
(xorigin,yorigin)落在gt内,就认为该特征点为正样本。例如下图
黄色点都是正样本,他们都在gt里边,白色点均为负样本。
在源码中,发现了作者进行了改进,并不是所有在gt内的特征点都给正样本标签,而是以gt中心画个圆,半径是1.5倍的stride,在该圆内的特征点作为正样本,这样可以避免边缘区的低质量正样本。
无论画不画圆,这种方法都有一个问题,如果一个特征点同时落在两个gt中,如何分配标签呢?作者称这种现象为ambiguous point
(如下图),我们针对这个问题进行改进
具体来说,FPN输出共5层特征层,分配到每层特征层上目标的长宽限制范围依次为:(-1, 64), (64, 128), (128, 256),(256, 512),(512, INF)
,对应的stride分别是[128,64,32,16,8]
。
作者在代码中是这么实现的,计算5个特征层各个特征点与该gt的 ( l , t , r , b ) (l,t,r,b) (l,t,r,b),保留 ( l , t , r , b ) (l,t,r,b) (l,t,r,b)四个值均大于0的点(特征点在gt内部);计算 ( l , t , r , b ) (l,t,r,b) (l,t,r,b)中的最大值,该最大值落在哪个区间,就由哪个特征层的特征点去预测。
如果还存在ambiguous point
,俩gt尺寸相近且有重叠部分,就将小的那个gt的标签赋给这个特征点。这个地方乍一看处理的很粗糙,但是结合下边的Centerness就好很多。
又讲到Centerness了,待会儿还要提到它,因为损失函数里边还有他一部分呢。
前边提到一次,作者认为距离目标中心较远的位置产生很多低质量的预测边框,即处于gt的边缘,提取的图像特征不正确,自然检测出低质量的框。在训练部分,FCOS会每个正样本赋予一个Centerness标签,用于表示该特征点的质量,计算方式为:
c
e
n
t
e
r
n
e
s
s
∗
=
m
i
n
(
l
∗
,
r
∗
)
m
a
x
(
l
∗
,
r
∗
)
∗
m
i
n
(
t
∗
,
b
∗
)
m
a
x
(
t
∗
,
b
∗
)
centerness^*=\sqrt{\frac{min(l^*,r^*)}{max(l^*,r^*)}*\frac{min(t^*,b^*)}{max(t^*,b^*)}}
centerness∗=max(l∗,r∗)min(l∗,r∗)∗max(t∗,b∗)min(t∗,b∗)
centerness越小,特征点离gt中心越远,质量越低。
这里偷个懒,直接放论文里的公式了
说实话,没太看懂,别的博文也都只是贴出来,不给个讲解,好在我翻代码大致懂了loss函数咋算的
loss函数分为三部分,分类loss,位置loss和centerness loss。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。