本文首发于微信公众号【DeepDriving】,欢迎关注。
主要思想
将目标检测当做一个标准的关键点估计问题,将目标表示为一个在其bounding box 中心位置的单独点,其他的一些属性比如目标尺寸、维度、朝向和姿态等则直接从这个中心点位置的图像特征中进行回归。该模型将图像输入到一个全卷积网络中用来生成热力图,热力图的峰值位置即为目标的中心,每个峰值位置的图像特征用来预测目标bounding box 的宽度和高度。该模型训练过程采用标准的监督学习方法,推理过程则是简单的网络前向传播而不需要在后处理中做非极大值抑制。 本文提出的是一个通用的目标检测方法,只需要在中心点的预测中添加一些额外的内容就可以非常简单地扩展到其他任务中去,比如3D目标检测和人体姿态估计。对于3D目标检测任务,本文是通过回归目标的绝对深度、3D bounding box 维度和目标的朝向来实现的;而对于人体姿态估计任务,则是将2D关节位置视为距中心点的偏移量,并且在中心点位置直接回归得到它们。
原理
输入一张宽高分别为W和H的3通道图像
I
∈
?
W
×
H
×
3
I\in \Re^{W\times H\times 3}
I∈?W×H×3,CenterNet模型会输出关键点的热点图
Y
^
∈
[
0
,
1
]
W
R
×
H
R
×
C
\hat{Y} \in \left [ 0,1 \right ] ^{\frac{W}{R}\times \frac{H}{R} \times C}
Y^∈[0,1]RW?×RH?×C,其中R表示热点图相对于输入图像的下采样因子,论文里默认为4;C表示关键点类别的数量,如果是用COCO数据集训练的2D目标检测任务那么C=80,如果是人体姿态估计任务那么C=17。在热点图中,
Y
^
x
,
y
,
c
=
1
\hat{Y}_{x,y,c}=1
Y^x,y,c?=1 表示在(x,y)坐标位置检测到一个类别为c的关键点;反之,如果
Y
^
x
,
y
,
c
=
0
\hat{Y}_{x,y,c}=0
Y^x,y,c?=0 表示在该位置不存在类别为c的关键点。
作者采用ResNet、DLA、Hourglass等几种不同的编码-解码结构的全卷积神经网络从图像
I
I
I中预测关键点
Y
^
\hat{Y}
Y^,训练方式沿用CornerNet的方法。对于ground truth中每个类别为c的关键点
p
∈
?
2
p\in \Re^{2}
p∈?2,需要在下采样R倍后的热点图上计算一个等效的关键点
p
~
=
?
p
R
?
\tilde{p} =\left \lfloor \frac{p}{R} \right \rfloor
p~?=?Rp??:通过一个高斯核函数
Y
x
y
c
=
e
x
p
(
?
(
x
?
p
x
~
)
2
+
(
y
?
p
y
~
)
2
2
δ
p
2
)
Y_{xyc} =exp(-\frac{(x-\tilde{p_{x}} )^{2}+(y-\tilde{p_{y}} )^{2}}{2\delta _{p}^{2} } )
Yxyc?=exp(?2δp2?(x?px?~?)2+(y?py?~?)2?),把ground truth中所有的关键点映射到热点图
Y
∈
[
0
,
1
]
W
R
×
H
R
×
C
Y \in \left [ 0,1 \right ] ^{\frac{W}{R}\times \frac{H}{R} \times C}
Y∈[0,1]RW?×RH?×C中,其中
δ
p
\delta _{p}
δp?是一个与目标尺寸有关的标准差。如果某个类别的两个高斯分布区域存在重叠,那么就直接取元素值最大的就可以。
对于一个类别为
c
k
c_{k}
ck?的目标
k
k
k,我们通常会用一个坐标为
(
x
1
(
k
)
,
y
1
(
k
)
,
x
2
(
k
)
,
y
2
(
k
)
)
(x_{1}^{(k)},y_{1}^{(k)},x_{2}^{(k)},y_{2}^{(k)})
(x1(k)?,y1(k)?,x2(k)?,y2(k)?)的bounding box来表示它在图像中的位置,那么它的中心点坐标为
p
k
=
(
x
1
(
k
)
+
x
2
(
k
)
2
,
y
1
(
k
)
+
y
2
(
k
)
2
)
p_{k}=(\frac{x_{1}^{(k)}+x_{2}^{(k)}}{2},\frac{y_{1}^{(k)}+y_{2}^{(k)}}{2})
pk?=(2x1(k)?+x2(k)??,2y1(k)?+y2(k)??)。通过前面的知识我们知道,CenterNet模型就是通过关键点估计的方式来预测所有目标的中心点,但是只有一个中心点还不足以表达一个bounding box,还需要预测出它的尺寸
s
k
=
(
x
2
(
k
)
?
x
1
(
k
)
,
y
2
(
k
)
?
y
1
(
k
)
)
s_{k}=(x_{2}^{(k)}-x_{1}^{(k)},y_{2}^{(k)}-y_{1}^{(k)})
sk?=(x2(k)??x1(k)?,y2(k)??y1(k)?),所以CenterNet用了一个分支
S
^
∈
?
W
R
×
H
R
×
2
\hat{S} \in \Re^{\frac{W}{R}\times \frac{H}{R} \times 2}
S^∈?RW?×RH?×2来预测目标的宽度和高度。为了减少因为下采样带来的中心点坐标精度误差,作者还添加了一个中心点坐标偏置预测分支
O
^
∈
?
W
R
×
H
R
×
2
\hat{O} \in \Re^{\frac{W}{R}\times \frac{H}{R} \times 2}
O^∈?RW?×RH?×2来进行补偿。
在推理阶段,首先从每个类别的热点图中提取峰值点,如果一个点的值大于等于它的8邻域内点的值,那么就认为这个点是一个峰值点,然后从这些候选的峰值点中选取前100个点作为检测到的中心点。对于n个检测到的中心点集合
P
^
=
{
(
x
^
i
,
y
^
i
)
}
i
=
1
n
\hat{P}=\left \{ (\hat{x}_i,\hat{y}_i) \right \}_{i=1}^{n}
P^={(x^i?,y^?i?)}i=1n?中类别为c的中心点
P
^
c
\hat{P}_{c}
P^c?,它的置信度为
Y
^
x
i
y
i
c
\hat{Y}_{x_{i}y_{i}c}
Y^xi?yi?c?,它的位置则用整型坐标值
(
x
i
,
y
i
)
(x_{i},y_{i})
(xi?,yi?)来表示,以它为中心点的一个目标的bounding box可以通过下面的公式计算出来:
(
x
^
i
+
δ
x
^
i
?
w
^
i
/
2
,
y
^
i
+
δ
y
^
i
?
h
^
i
/
2
,
x
^
i
+
δ
x
^
i
+
w
^
i
/
2
,
y
^
i
+
δ
y
^
i
+
h
^
i
/
2
)
(\hat{x}_{i}+\delta\hat{x}_{i}-\hat{w}_{i}/2,\hat{y}_{i}+\delta\hat{y}_{i}-\hat{h}_{i}/2,\hat{x}_{i}+\delta\hat{x}_{i}+\hat{w}_{i}/2,\hat{y}_{i}+\delta\hat{y}_{i}+\hat{h}_{i}/2)
(x^i?+δx^i??w^i?/2,y^?i?+δy^?i??h^i?/2,x^i?+δx^i?+w^i?/2,y^?i?+δy^?i?+h^i?/2)
其中,
(
δ
x
^
i
,
δ
y
^
i
)
=
O
^
x
^
i
,
y
^
i
(\delta\hat{x}_{i},\delta\hat{y}_{i})=\hat{O}_{\hat{x}_{i},\hat{y}_{i}}
(δx^i?,δy^?i?)=O^x^i?,y^?i??是预测的中心点偏置值,
(
w
^
i
,
h
^
i
)
=
S
^
x
^
i
,
y
^
i
(\hat{w}_{i},\hat{h}_{i})=\hat{S}_{\hat{x}_{i},\hat{y}_{i}}
(w^i?,h^i?)=S^x^i?,y^?i??是预测的宽度和高度值。需要注意的是,这里得到的bounding box的坐标只是相对于热点图尺寸的坐标,如果要得到相对于原始图像尺寸的坐标,还需要乘以前面提到的下采样系数
R
R
R。最终所有的目标信息都是直接通过上述关键点估计的方式得到而不需要基于IoU的非极大值抑制(NMS)或者其他后处理操作,因为峰值关键点选取的过程就是一次充分的NMS操作,这可以通过一个3x3的MaxPooling操作来实现。
损失函数
CenterNet的损失函数分为3个部分:
L
d
e
t
=
L
k
+
λ
s
i
z
e
L
s
i
z
e
+
λ
o
f
f
L
o
f
f
L_{det}=L_{k}+\lambda_{size}L_{size}+ \lambda_{off}L_{off}
Ldet?=Lk?+λsize?Lsize?+λoff?Loff?
其中
L
k
,
L
s
i
z
e
,
L
o
f
f
L_{k},L_{size},L_{off}
Lk?,Lsize?,Loff?分别为中心点预测分支损失函数、尺寸预测分支损失函数和中心点偏置预测分支损失函数,设置
λ
s
i
z
e
=
0.1
,
λ
o
f
f
=
1
\lambda_{size}=0.1, \lambda_{off}=1
λsize?=0.1,λoff?=1。
中心点预测分支损失函数
该分支损失函数采用focal loss损失函数:
L
k
=
?
1
N
∑
x
y
c
{
(
1
?
Y
^
x
y
c
)
α
log
?
(
Y
^
x
y
c
)
i
f
?
Y
x
y
c
=
1
(
1
?
Y
x
y
c
)
β
(
Y
^
x
y
c
)
α
log
?
(
1
?
Y
^
x
y
c
)
otherwise
L_{k}=\frac{-1}{N} \sum_{xyc} \begin{cases} (1-\hat{Y}_{xyc})^{\alpha }\log_{}{(\hat{Y}_{xyc})} & if \, Y_{xyc}=1 \\ (1-Y_{xyc})^{\beta }(\hat{Y}_{xyc})^{\alpha }\log_{}{(1-\hat{Y}_{xyc})} & \text{otherwise} \end{cases}
Lk?=N?1?xyc∑?{(1?Y^xyc?)αlog?(Y^xyc?)(1?Yxyc?)β(Y^xyc?)αlog?(1?Y^xyc?)?ifYxyc?=1otherwise?
其中,
α
\alpha
α和
β
\beta
β是focal loss的超参数,分别设置为2和4;
N
N
N是输入图像
I
I
I中关键点的数量,用于将所有的positive focal loss实例标准化为1。
尺寸预测分支损失函数
该分支的损失函数采用L1损失:
L
s
i
z
e
=
1
N
∑
k
=
1
N
∣
S
^
p
k
?
s
k
∣
L_{size}=\frac{1}{N}\sum_{k=1}^{N}\left |\hat{S}_{p_{k}}-s_{k} \right |
Lsize?=N1?k=1∑N?∣
∣?S^pk???sk?∣
∣?
中心点偏置预测分支损失函数
该分支的损失函数同样采用L1损失:
L
o
f
f
=
1
N
∑
p
∣
O
^
p
~
?
(
p
R
?
p
~
)
∣
L_{off}=\frac{1}{N}\sum_{p}\left |\hat{O}_{\tilde{p}} -(\frac{p}{R}-\tilde{p}) \right |
Loff?=N1?p∑?∣
∣?O^p~???(Rp??p~?)∣
∣?
扩展任务
3D目标检测就是给每个目标去估计一个3维的bounding box,这需要为每个关键点估计3个额外的属性:深度、3D维度和朝向,这3个属性通过3个独立的分支进行预测。
人体姿态估计的目的是去估计图像中的
k
k
k个人体实例的关节位置(COCO数据集
k
=
17
k=17
k=17)。可以将姿态视为是包含
k
×
2
k \times 2
k×2维属性的中心点,并且通过到中心点的偏移量对每个关键点进行参数化,另外还使用一个热点图预测分支用于对关键点进行提纯。
检测结果
以下是用官方的代码和模型跑出来的一些结果。
2D目标检测
用COCO数据集训练的2D目标检测的结果如下:
3D目标检测
用KITTI数据集训练的3D目标检测的结果如下:
人体姿态估计
用COCO数据集训练的人体姿态估计的结果如下:
总结
读完《Objects as Points》这篇文章,我的感觉是文如其名,简单而又优雅。本文提出的目标检测算法CenterNet,模型结构简单,速度快效果好,而且还方便扩展,实在是佩服作者!
欢迎关注我的公众号【DeepDriving】,我会不定期分享计算机视觉、机器学习、深度学习、无人驾驶等领域的文章。
|