简介
图1:论文原文
论文是发表在
E
C
C
V
2018
{\rm ECCV2018}
E C C V 2 0 1 8 上的一篇基于
A
n
c
h
o
r
{\rm Anchor}
A n c h o r -
F
r
e
e
{\rm Free}
F r e e 的目标检测论文。
C
o
r
n
e
t
N
e
t
{\rm CornetNet}
C o r n e t N e t ——顾名思义,其检测流程是先得到角点,再通过角点生成边界框,进而完成目标检测过程。 论文原文 源码
0. Abstract
论文提出一种新的目标检测算法——
C
o
r
n
e
r
N
e
t
{\rm CornerNet}
C o r n e r N e t ,将检测边界框转换为检测一对关键点(左上角和右下角两个关键点),进而避免了预先设计一系列
A
n
c
h
o
r
{\rm Anchor}
A n c h o r 的操作。实验结果为该方法在
M
S
C
O
C
O
{\rm MS\ COCO}
M S C O C O 数据集上的
A
P
{\rm AP}
A P 为
42.1
%
{\rm 42.1\%}
4 2 . 1 % ,一阶段算法上表现
S
O
T
A
{\rm SOTA}
S O T A 。 本文贡献 :(一)提出一种新的
A
n
c
h
o
r
{\rm Anchor}
A n c h o r -
F
r
e
e
{\rm Free}
F r e e 目标检测方法;(二)提出
C
o
r
n
e
r
{\rm Corner}
C o r n e r 池化帮助网络更好地定位角点。
1. Introduction
A
n
c
h
o
r
s
{\rm Anchors}
A n c h o r s 广泛应用于一阶段目标检测算法中,通常做法是首先在一幅图像上产生大量的
A
n
c
h
o
r
{\rm Anchor}
A n c h o r 框,然后根据每个
B
o
x
{\rm Box}
B o x 的得分和回归修正坐标得到最后的检测框。但
A
n
c
h
o
r
s
{\rm Anchors}
A n c h o r s 的使用存在两个问题 :第一,产生的大量
A
n
c
h
o
r
B
o
x
e
s
{\rm Anchor\ Boxes}
A n c h o r B o x e s 中大部分是属于负类样本(不包含目标的背景),正负样本不均衡影响网络的训练;第二,使用
A
n
c
h
o
r
B
o
x
e
s
{\rm Anchor\ Boxes}
A n c h o r B o x e s 会引入大量超参数,降低了网络的可扩展性。 论文提出一种新的
A
n
c
h
o
r
{\rm Anchor}
A n c h o r -
F
r
e
e
{\rm Free}
F r e e 目标检测算法,通过检测边界框的左上角和右下角角点来定位目标,角点通过
C
N
N
{\rm CNN}
C N N 预测的热图得到。本文方法受到一种基于嵌入向量 的人体姿态估计方法的启发。下图展示了
C
o
r
n
e
r
N
e
t
{\rm CornerNet}
C o r n e r N e t 的整体结构:
图2:CornerNet
C
o
r
n
e
r
N
e
t
{\rm CornerNet}
C o r n e r N e t 的另一个创新是
C
o
r
n
e
r
{\rm Corner}
C o r n e r 池化 。边界框的角点通常位于目标的外面,不能仅通过局部信息判断某个位置是否为角点。要确定某个位置是否是左上角点,必须从左往右看判断是不是目标的上边界、从上往下看判断是不是目标的左边界。右下角点同理。
C
o
r
n
e
r
{\rm Corner}
C o r n e r 池化的思想是:
C
o
r
n
e
r
{\rm Corner}
C o r n e r 池化层的输入是两个特征图,一个特征图用于判断水平方向(上下边界)、一个特征图用于判断竖直方向(左右边界),然后综合两个特征图的判断结果。下图展示了
C
o
r
n
e
r
{\rm Corner}
C o r n e r 池化的一个例子:
图3:Corner Pooling
本文提出了检测角点比检测边界框更好的两个假设:第一,边界框需要四个属性才能定位,而角点仅需两个;第二,本文方法需要产生
O
(
w
h
)
O(wh)
O ( w h ) 个
C
o
r
n
e
r
s
{\rm Corners}
C o r n e r s ,而基于
A
n
c
h
o
r
{\rm Anchor}
A n c h o r 的方法需要产生
O
(
w
2
h
2
)
O(w^2h^2)
O ( w 2 h 2 ) 个
A
n
c
h
o
r
B
o
x
e
s
{\rm Anchor\ Boxes}
A n c h o r B o x e s 。
2. Related Works
两阶段目标检测算法
R
{\rm R}
R -
C
N
N
{\rm CNN}
C N N 、
S
P
P
{\rm SPP}
S P P 、
F
a
s
t
{\rm Fast}
F a s t -
R
C
N
N
{\rm RCNN}
R C N N 、
F
a
s
t
e
r
{\rm Faster}
F a s t e r -
R
C
N
N
{\rm RCNN}
R C N N 、
R
{\rm R}
R -
F
C
N
{\rm FCN}
F C N 、
D
e
N
e
t
{\rm DeNet}
D e N e t 等和一阶段目标检测算法
Y
O
L
O
{\rm YOLO}
Y O L O 、
S
S
D
{\rm SSD}
S S D 、
R
e
t
i
n
a
N
e
t
{\rm RetinaNet}
R e t i n a N e t 、
R
e
f
i
n
e
D
e
t
{\rm RefineDet}
R e f i n e D e t 等。 论文受到 Newell et al. 多人姿态估计背景下关联嵌入的工作启发。在他们的方法中每个人体关节都有一个嵌入向量,关节通过嵌入向量之间的距离分组。 注 :
E
m
b
e
d
d
i
n
g
V
e
c
t
o
r
{\rm Embedding\ Vector}
E m b e d d i n g V e c t o r 来源于
N
L
P
{\rm NLP}
N L P 领域,相关细节可参考这里 。
3. CornerNet
本部分介绍
C
o
r
n
e
r
N
e
t
{\rm CornerNet}
C o r n e r N e t 的实现细节 ,主要包括: (一)如何检测角点; (二)如何给角点分组,每组角点分别包含左上角角点和右下角角点; (三)如何判断该组角点是否是一个可行的边界框; (四)
C
o
r
n
e
r
N
e
t
{\rm CornerNet}
C o r n e r N e t 所用的
B
a
c
k
b
o
n
e
{\rm Backbone}
B a c k b o n e 。 每个问题对应于一个小节。
3.1 Detecting Corners
C
o
r
n
e
r
N
e
t
{\rm CornerNet}
C o r n e r N e t 预测两组热图 (一幅图中以不同颜色表示该位置是
C
o
r
n
e
r
{\rm Corner}
C o r n e r 的概率,如图中以红色表示该位置是
C
o
r
n
e
r
{\rm Corner}
C o r n e r 的概率高、而以蓝色表示该位置是
C
o
r
n
e
r
{\rm Corner}
C o r n e r 的概率低),一组用于预测左上角角点、另一组用于预测右下角角点。热图的大小是
C
×
H
×
W
C×H×W
C × H × W ,
C
C
C 表示热图的通道即类别数、
H
×
W
H×W
H × W 表示热图的二维大小。 对于某个角点而言,只有一个表示正类,其他的均为负类。在训练过程中,对每个负类角点的惩罚也是不同的,减少在真实角点某个半径范围内的负类角点的惩罚,这主要是因为一对错误的角点在足够靠近真实位置时也能够产生一个同标注框有很大
I
o
U
{\rm IoU}
I o U 的框,如图
4
{\rm 4}
4 。即在以真实角点为中心的某个半径的圆内,对负类角点的惩罚随着与圆心距离的增大而减小。
图4:Detecing Corners
用
p
c
i
j
p_{cij}
p c i j 表示热图中位置
(
i
,
j
)
(i,j)
( i , j ) 对类别
c
c
c 的预测概率;
y
c
i
j
y_{cij}
y c i j 表示热图中的真实值,即
y
c
i
j
=
1
y_{cij}=1
y c i j = 1 表示位置
(
i
,
j
)
(i,j)
( i , j ) 对应的类别为
c
c
c ,其余位置的
y
c
i
j
=
0
y_{cij}=0
y c i j = 0 。结合Focal Loss ,得到
C
o
r
n
e
r
N
e
t
{\rm CornerNet}
C o r n e r N e t 的第一部分损失函数
L
d
e
t
L_{det}
L d e t 。
L
d
e
t
=
−
1
N
∑
c
=
1
C
∑
i
=
1
H
∑
j
=
1
W
{
(
1
−
p
c
i
f
)
α
l
o
g
(
p
c
i
j
)
i
f
y
c
i
j
=
1
(
1
−
y
c
i
f
)
β
(
p
c
i
f
)
α
l
o
g
(
1
−
p
c
i
j
)
o
t
h
e
r
w
i
s
e
(3.1)
L_{det} =\frac{-1}{N}\sum\limits_{c=1}^{C}\sum\limits_{i=1}^{H}\sum\limits_{j=1}^{W}\left\{ \begin{aligned} &(1-p_{cif})^αlog(p_{cij}) &ify_{cij}=1\\ &(1-y_{cif})^β(p_{cif})^αlog(1-p_{cij})&otherwise \end{aligned} \right.\tag{3.1}
L d e t = N − 1 c = 1 ∑ C i = 1 ∑ H j = 1 ∑ W { ( 1 − p c i f ) α l o g ( p c i j ) ( 1 − y c i f ) β ( p c i f ) α l o g ( 1 − p c i j ) i f y c i j = 1 o t h e r w i s e ( 3 . 1 )
公式中,
N
N
N 是一幅图像中目标的数量、
α
α
α 和
β
β
β 为超参数(对应于
F
o
c
a
l
L
o
s
s
{\rm Focal\ Loss}
F o c a l L o s s 中损失函数的设计)。
i
f
y
c
i
j
=
1
if y_{cij}=1
i f y c i j = 1 部分表示对真实标注位置处的损失;
o
t
h
e
r
w
i
s
e
otherwise
o t h e r w i s e 表示其他地方的损失,其中在预测时
y
c
i
j
y_{cij}
y c i j 服从高斯分布,即
y
c
=
{
e
−
x
2
+
y
2
2
σ
2
x
2
+
y
2
≤
r
2
0
o
t
h
e
r
w
i
s
e
(3.2)
y_c =\left\{ \begin{aligned} &e^{-\frac{x^2+y^2}{2σ^2}}&x^2+y^2≤r^2\\ &0&otherwise \end{aligned} \right.\tag{3.2}
y c = ⎩ ⎨ ⎧ e − 2 σ 2 x 2 + y 2 0 x 2 + y 2 ≤ r 2 o t h e r w i s e ( 3 . 2 )
(
1
−
y
c
i
f
)
β
(1-y_{cif})^β
( 1 − y c i f ) β 对应于在某半径
r
r
r 范围内,离圆心越远惩罚越小。
另一方面,在使用下采样的情况下,得到的图像比原图小。假设下采样倍数是
n
n
n ,原图上
(
x
,
y
)
(x,y)
( x , y ) 的位置对应于下采样后的
(
⌊
x
n
⌋
,
⌊
y
n
⌋
)
(\lfloor\frac{x}{n}\rfloor,\lfloor\frac{y}{n}\rfloor)
( ⌊ n x ⌋ , ⌊ n y ⌋ ) 。当从下采样后的图像重新映射回原图时会有精度的损失,这在小目标检测时会产生较大的误差。为了解决这个问题,增加一个位置偏移的预测
o
k
o_k
o k 。
o
k
=
(
x
k
n
−
⌊
x
k
n
⌋
,
y
k
n
−
⌊
y
k
n
⌋
)
o_k=(\frac{x_k}n{}-\lfloor\frac{x_k}{n}\rfloor,\frac{y_k}n{}-\lfloor\frac{y_k}{n}\rfloor)
o k = ( n x k − ⌊ n x k ⌋ , n y k − ⌊ n y k ⌋ )
其中
o
k
o_k
o k 表示真实位置的偏差,
(
x
k
,
y
k
)
(x_k,y_k)
( x k , y k ) 表示第
k
k
k 个
C
o
r
n
e
r
{\rm Corner}
C o r n e r 的
(
x
,
y
)
(x,y)
( x , y ) 。
记预测位置的偏差为
o
^
k
\widehat{o}_k
o
k ,第二部分损失函数参考
S
m
o
o
t
h
L
1
{\rm SmoothL1}
S m o o t h L 1 损失函数,得到
L
o
f
f
L_{off}
L o f f 。
L
d
e
t
=
1
N
∑
k
=
1
N
S
m
o
o
t
h
L
1
L
o
s
s
(
o
k
,
o
^
k
)
.
(3.3)
L_{det} =\frac{1}{N}\sum\limits_{k=1}^{N}SmoothL1Loss(o_k,\widehat{o}_k).\tag{3.3}
L d e t = N 1 k = 1 ∑ N S m o o t h L 1 L o s s ( o k , o
k ) . ( 3 . 3 )
其中
N
N
N 是一幅图像中目标的数量,
S
m
o
o
t
h
L
1
L
o
s
s
{\rm SmoothL1Loss}
S m o o t h L 1 L o s s 的形式为
S
m
o
o
t
h
L
1
L
o
s
s
(
x
)
=
{
0.5
x
2
i
f
∣
x
∣
<
1
∣
x
∣
−
0.5
o
t
h
e
r
w
i
s
e
(3.4)
SmoothL1Loss(x) =\left\{ \begin{aligned} &0.5x^2&if|x|<1\\ &|x|-0.5&otherwise \end{aligned} \right.\tag{3.4}
S m o o t h L 1 L o s s ( x ) = { 0 . 5 x 2 ∣ x ∣ − 0 . 5 i f ∣ x ∣ < 1 o t h e r w i s e ( 3 . 4 )
3.2 Grouping Corners
匹配一对左上角角点和右下角角点的方法是使用
E
m
b
e
d
d
i
n
g
V
e
c
t
o
r
{\rm Embedding Vector}
E m b e d d i n g V e c t o r (嵌入向量) 。作者的思路是为每个角点预测一个嵌入向量,属于同一个边界框的嵌入向量的距离应该足够小。 现在定义
e
t
k
e_{t_k}
e t k 为类别
k
k
k 的左上角角点的嵌入向量,
e
b
k
e_{b_k}
e b k 为类别
k
k
k 的右下角角点的嵌入向量。参考文章 ,定义第三部分损失函数和第四部分损失函数
L
p
u
l
l
L_{pull}
L p u l l 和
L
p
u
s
h
L_{push}
L p u s h 。
L
p
u
l
l
=
1
N
∑
k
=
1
N
[
(
e
t
k
−
e
k
)
2
+
(
e
b
k
−
e
k
)
2
]
.
(3.5)
L_{pull} =\frac{1}{N}\sum\limits_{k=1}^{N}[(e_{t_k}-e_k)^2+(e_{b_k}-e_k)^2].\tag{3.5}
L p u l l = N 1 k = 1 ∑ N [ ( e t k − e k ) 2 + ( e b k − e k ) 2 ] . ( 3 . 5 )
L
p
u
s
h
=
1
N
(
N
−
1
)
∑
k
=
1
N
∑
j
=
1
,
j
≠
k
N
m
a
x
(
0
,
∆
−
∣
e
k
−
e
j
∣
)
.
(3.6)
L_{push} =\frac{1}{N(N-1)}\sum\limits_{k=1}^{N}\sum\limits_{j=1,j≠k}^{N}max(0,∆-|e_k-e_j|).\tag{3.6}
L p u s h = N ( N − 1 ) 1 k = 1 ∑ N j = 1 , j = k ∑ N m a x ( 0 , ∆ − ∣ e k − e j ∣ ) . ( 3 . 6 )
其中
N
N
N 表示一幅图像中目标的数量,
e
k
=
e
t
k
+
e
b
k
2
e_k=\frac{e_{t_k}+e_{b_k}}{2}
e k = 2 e t k + e b k ,∆为超参数。
L
p
u
l
l
L_{pull}
L p u l l 是针对同一目标的,由其名字可知,对于同一边界框的
e
t
k
e_{t_k}
e t k 和
e
b
k
e_{b_k}
e b k ,该损失函数越小对应于两个嵌入向量的距离更近;
L
p
u
l
l
L_{pull}
L p u l l 是针对不同目标的,由其名字可知,如果两个嵌入向量
e
k
e_{k}
e k 和
e
j
e_{j}
e j 的L1范数大于∆,则认为这两个嵌入向量来自不同目标(对应于
L
p
u
l
l
=
0
L_{pull}=0
L p u l l = 0 不参与优化过程)。
3.3 Corner Pooling
为了确定当前位置是否属于左上角角点或右下角角点,本文提出了
C
o
r
n
e
r
P
o
o
l
i
n
g
{\rm Corner\ Pooling}
C o r n e r P o o l i n g 。前面第1部分大致说了下
C
o
r
n
e
r
P
o
o
l
i
n
g
{\rm Corner\ Pooling}
C o r n e r P o o l i n g 的流程,现在进行具体描述。 假设现在我们需要确定某个位置
(
i
,
j
)
(i,j)
( i , j ) 是否是一个左上角角点。设
f
t
f_t
f t 和
f
l
f_l
f l 为
C
o
r
n
e
r
{\rm Corner}
C o r n e r 池化层输入的两个特征图,
f
l
i
j
f_{l_{ij}}
f l i j 和
f
l
i
j
f_{l_{ij}}
f l i j 分别表示特征图
f
t
f_t
f t 和
f
l
f_l
f l 上位置
(
i
,
j
)
(i,j)
( i , j ) 处的向量。对于大小为
H
×
W
H×W
H × W 的特征图,在特征图
f
t
f_t
f t 上从在位置
(
i
,
j
)
(i,j)
( i , j ) 和
(
i
,
H
)
(i,H)
( i , H ) 间进行最大池化,得到位置
(
i
,
j
)
(i,j)
( i , j ) 处对应的向量
t
i
j
t_{ij}
t i j (从左向右进行);从在位置
(
i
,
j
)
(i,j)
( i , j ) 和
(
W
,
j
)
(W,j)
( W , j ) 间进行最大池化,得到位置
(
i
,
j
)
(i,j)
( i , j ) 处对应的向量
l
i
j
l_{ij}
l i j (从上往下进行)。
t
i
j
t_{ij}
t i j 和
l
i
j
l_{ij}
l i j 的表达式为:
t
i
j
=
{
m
a
x
(
f
t
i
j
,
t
(
i
+
1
)
j
)
i
f
i
<
H
f
t
H
j
o
t
h
e
r
w
i
s
e
(3.7)
t_{ij} =\left\{ \begin{aligned} &max(f_{t_{ij}},t_{(i+1)j})&if\ i<H\\ &f_{t_{Hj}}&otherwise \end{aligned} \right.\tag{3.7}
t i j = { m a x ( f t i j , t ( i + 1 ) j ) f t H j i f i < H o t h e r w i s e ( 3 . 7 )
l
i
j
=
{
m
a
x
(
f
l
i
j
,
l
i
(
j
+
1
)
)
i
f
j
<
W
f
l
i
W
o
t
h
e
r
w
i
s
e
(3.8)
l_{ij} =\left\{ \begin{aligned} &max(f_{l_{ij}},l_{i(j+1)})&if\ j<W\\ &f_{l_{iW}}&otherwise \end{aligned} \right.\tag{3.8}
l i j = { m a x ( f l i j , l i ( j + 1 ) ) f l i W i f j < W o t h e r w i s e ( 3 . 8 )
观察上式是一个递归的形式,具体计算细节见下图。
如图:
图5:Corner Pooling
在第一列图中,沿着箭头的方向计算就得到第二列图。如第一行第一列的图中,从右往左开始计算,最后一列的值分别是
2
{\rm 2}
2 和
6
{\rm 6}
6 ,
m
a
x
(
0
,
2
)
=
2
、
m
a
x
(
1
,
6
)
=
6
max(0,2)=2、max(1,6)=6
m a x ( 0 , 2 ) = 2 、 m a x ( 1 , 6 ) = 6 ,所以倒数第二列结果为
2
{\rm 2}
2 和
6
{\rm 6}
6 。前面列的计算类似,类似于一个最大池化过程。经过第一列图的计算得到第二列图,将两幅图的计算结果相加得到最后的结果。
C
o
r
n
e
r
{\rm Corner}
C o r n e r 池化用于预测热图、
E
m
b
e
d
d
i
n
g
V
e
c
t
o
r
{\rm Embedding\ Vector}
E m b e d d i n g V e c t o r 和偏移(具体参考源码)。
图6:预测模块
网络的预测模块如图
6
{\rm 6}
6 所示,以左上角为例,通过一系列处理得到热图、
E
m
b
e
d
d
i
n
g
{\rm Embedding}
E m b e d d i n g 和偏移。具体实现细节参考源码。
3.4 Hourglass Network
图7:Hourglass Network
Hourglass Network 最早应用于人体姿态估计,具体网络结构细节可参考论文原文。本文的结构包含两个
H
o
u
r
g
l
a
s
s
{\rm Hourglass}
H o u r g l a s s 模块,每个
H
o
u
r
g
l
a
s
s
{\rm Hourglass}
H o u r g l a s s 模块对应于图
7
{\rm 7}
7 中的虚线框内的部分。本文的结构细节参考源码。
4. Experiments
损失函数 定义为
L
=
L
d
e
t
+
α
L
p
u
l
l
+
β
L
p
u
s
h
+
γ
L
o
f
f
.
L=L_{det}+αL_{pull}+βL_{push}+γL_{off}.
L = L d e t + α L p u l l + β L p u s h + γ L o f f .
其中
α
α
α 、
β
β
β 和
γ
γ
γ 分别设置为
0.1
{\rm 0.1}
0 . 1 、
0.1
{\rm 0.1}
0 . 1 和
1
{\rm 1}
1 。
图8:实验结果对比
5. Conclusion
本文提出了一种基于
A
n
c
h
o
r
{\rm Anchor}
A n c h o r -
F
r
e
e
{\rm Free}
F r e e 的目标检测算法——
C
o
r
n
e
r
N
e
t
{\rm CornerNet}
C o r n e r N e t ,是一种一阶段检测算法。不同于
Y
O
L
O
v
1
{\rm YOLOv1}
Y O L O v 1 和
D
e
n
s
e
B
o
x
{\rm DenseBox}
D e n s e B o x 等基于
A
n
c
h
o
r
{\rm Anchor}
A n c h o r -
F
r
e
e
{\rm Free}
F r e e 的目标检测算法,
C
o
r
n
e
r
N
e
t
{\rm CornerNet}
C o r n e r N e t 采用了一种通过检测角点的全新思路,阅读改论文有助于理解后续基于
A
n
c
h
o
r
{\rm Anchor}
A n c h o r -
F
r
e
e
{\rm Free}
F r e e 的目标检测算法,为以后阅读
C
e
n
t
e
r
N
e
t
{\rm CenterNet}
C e n t e r N e t 、
E
x
t
r
e
m
e
N
e
t
{\rm ExtremeNet}
E x t r e m e N e t 、
F
S
A
F
{\rm FSAF}
F S A F 等打下基础。
由于没有阅读源码,本文只总结了
C
o
r
n
e
r
N
e
t
{\rm CornerNet}
C o r n e r N e t 的大体结构和信息,详细内容请阅读论文原文 。
参考
https://zhuanlan.zhihu.com/p/66406815.
Law H, Deng J. Cornernet: Detecting objects as paired keypoints[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 734-750.
Newell A, Yang K, Deng J. Stacked hourglass networks for human pose estimation[C]//European conference on computer vision. Springer, Cham, 2016: 483-499.
完