代码地址:CenterNet
1. 概述
导读:这篇博客中讲到的CenterNet是由中科院、牛津大学以及华为诺亚方舟实验室联合提出的One-stag目标检测论文,该算法是在之前工作CornerNet(笔记链接:链接)的基础上进行改进得来的。主要改进的地方是使用三个“点”确定一个检测框减少误检提升检测性能。
基于关键点的目标检测算法在结果中经常会出现错误的检测框,论文中的观点是算法并没有去关注检测框的内部信息,单靠两个角点确定一个检测框自然对算法的要求很高,因而文章的作者使用三个部分去确定一个检测框:中间区域与两个角点。文章的算法源自于CornerNet,在此基础上设计了两个模块cascade corner pooling与center pooling。该算法在COCO数据集上达到了 47% 的AP。 在52层的Hourglass下270ms,104层的Hourglass下340ms(输入的图像分辨率 511 ∗ 511 511*511 511∗511,最后的heatmap分辨率 128 ∗ 128 128*128 128∗128)。
下图1中的第一行展示的是使用CornerNet检测结果可以看到与GT(蓝色)相比存在较多的误检,第二行是使用中间区域辅助检测得到的结果。
在此基础上文中使用FD指标去衡量了CornerNet中的错误检出率:
论文中的方法在进行检测时候使用两个角点去确定一个检测框,要是检测框可行那么检测框的类别应该和文章中定义的中间区域的类别高度近似。上面说到需要三个“点”的信息去确定一个检测框,文中为了更好检测中部关键点和两个角点,提出了两个策略去解决
- 1)Center Pooling,它被用在预测中心的关键点分支上,帮助中心关键点获得更多目标的视觉识别信息,这是通过在特征图上提取出预测中心关键点的水平方向和垂直方向的最大响应总和来实现的。
- 2)Cascade Corner Pooling,这里采用了具有感知内部信息的corner pooling模块,通过在一个用于预测角点的特征图上找出物体边界和内部方向的最大和响应来实现这一点。通过实验证明这种两方向的Pooling在面对特征级别噪声时更加稳定,有助于提升网络的精度与召回。
2. 网络结构设计
网络的结构如图2所示,对于每个检测结果的表示使用一对角点与一个中心点。一对角点的产生是使用基于CornerNet中的角点生成器,一个中心点的生成是在其中添加了一个关于中心点的heatmap产生的,用该生成的中心点去过滤之前由多对角点生成的检测框。算法的检测流程可以归纳为:
- 1)首先基于CornerNet的方法检测出 t o p − k top-k top−k个检测框;
- 2)根据每个中心点的置信度选择 t o p − k top-k top−k个中心点,使用对应的偏移系数将这些中心点映射到输入图像中去;
- 3)定义每个检测框的中心区域(这个区域的选择也会影响检测性能,这个在后面进行分析),检查这些区域中是否包含有中心点。需要注意的是中心点的分类应该与检测框的分类相同;
- 4)对于检测框中心区域包含中心点的检测框,他的置信度是三个点置信度的均值。对于那些检测框中心区域没有包含中心点的检测框会被抛弃掉;
2.1 检测框中心区域的选择
在上面说到了要在CornerNet生成的默认检测框上去确定中心区域,但是检测框的目标有大有小。中心区域设置过小会导致小目标的召回比较低;相反过大了之后会导致大目标的的精度降低。因而,在文章中按照检测框的大小做了自适应,使用
t
l
x
,
t
l
y
,
b
r
x
,
b
r
y
,
c
t
l
x
,
c
t
l
y
,
c
b
r
x
,
c
b
r
y
tl_x,tl_y,br_x,br_y,ctl_x,ctl_y,cbr_x,cbr_y
tlx,tly,brx,bry,ctlx,ctly,cbrx,cbry分别代表检测的左上角点、右下角点、中间区域左上角点和中间区域右下角点。其关系使用系数
n
n
n确定如下:
文中指出使用阈值150确定
n
n
n的取值为3还是5。
n
n
n为3与5时中心区域示意图如下:
2.2 使用2个Pooling丰富检测信息
2.2.1 Center pooling:
有些情况下目标的几何中心并不能很好表达识别的视觉信息,例如,人的头部有较强的视觉响应,但是中心点却是在人身体的中部。图4(a)中展示了中心点选择的原则,在特征图上寻找同时在水平与垂直方向上的最大值,并且将它们组合起来,这部分工作可以通过center pooling来解决。
2.2.2 Cascade corner pooling:
在CornerNet中使用corner pooling解决了角点缺乏局部呈现特征通常在目标外面的问题。corner pooling的原理在图4(b)中进行展示,但是这样的方法是在边界方向上去确定角点这就导致了角点对边界敏感。为了解决这个问题,文中指出首先在边界方向上最大值,之后从内部去寻找最大值,由此两个最大值组合来确定角点。这样使得角点获得了视觉与边界信息。如图4(c)所示。
上面提到的center pooling与cascade corner pooling都可以通过corner pooling的方式得到,其实现方式如下图所示:
2.3 损失函数确定
论文中将算法的损失函数定义为:
L
=
L
d
e
t
c
o
+
L
d
e
t
c
e
+
α
L
p
u
l
l
c
o
+
β
L
p
u
s
h
c
o
+
γ
(
L
o
f
f
c
o
+
L
o
f
f
c
e
)
L=L_{det}^{co}+L_{det}^{ce}+\alpha L_{pull}^{co}+\beta L_{push}^{co}+\gamma (L_{off}^{co}+L_{off}^{ce})
L=Ldetco+Ldetce+αLpullco+βLpushco+γ(Loffco+Loffce)
其中,
L
d
e
t
c
o
,
L
d
e
t
c
e
L_{det}^{co},L_{det}^{ce}
Ldetco,Ldetce用于计算检测框所需的三个“点”的损失,
L
p
u
l
l
c
o
L_{pull}^{co}
Lpullco用于拉近属于同一个检测框的两个角点损失,
L
p
u
s
h
c
o
L_{push}^{co}
Lpushco用于拉远属于不同检测框的两个角点的损失,
L
o
f
f
c
o
,
L
o
f
f
c
e
L_{off}^{co},L_{off}^{ce}
Loffco,Loffce是
L
1
L_1
L1损失函数用于计算三个“点”偏移。
3. 实验
3.1 网络的性能分析
文章提出的检测模型在MS-COCO数据集上与当今现有的检测方法进行对比:
可以说秒杀一众一阶段检测算法,只有两阶段的PANet能够抗衡(PANet的两个金字塔吃显存呀-_-||)。此外作者还将改进的算法与之前的算法进行对比(错误率):
3.2 网络个模块的重要性分析(消融实验)
文中提到的各个模块在检测网络中对检测性能的影响程度:
3.3 改进的空间
在前面的内容中提到对于中心区域的检测是通过网络学习得到的,那么直接将中心区域与GT结合不是更精准么?于是作者使用GT来替换了对中心点的预测,得到如下的结果,-_-|| 厉害了