CenterNet论文阅读笔记
前言:CenterNet这篇文章,我觉得作者思路特别清晰,每一步怎么做,该怎么进行实验,而且我觉得CenterNet的实验挺详实的,真的是一篇很好的文章。
(一)Title
![image-20201101111752877](https://i-blog.csdnimg.cn/blog_migrate/cec34c79ffaa0637e08f6241dd8099a5.png#pic_center)
(二)Summary
在本文中,我们采取了不同的方法。我们将对象建模为一个点,即其边界框的中心点。我们的detector使用关键点估计来找到中心点,并回归到所有其他对象属性(object properties),如大小、3D位置、方向,甚至姿势。CenterNet比基于bounding box的检测器更容易、更简单、更快、更准确,并且是端到端可微分的。
CenterNet的性能表现:
在MS COCO数据集上取得了28.1% AP at 142 FPS, 37.4% AP at 52 FPS, and 45.1% AP with multi-scale testing at 1.4 FPS.这个要比CornerNet-Squeeze要强啊!
KITTI benchmark上估计3D bounding box
COCO keypoint dataset上进行human pose估计
同复杂的多阶段方法比较,我们的取得了有竞争力的结果,而且做到了实时的。
CenterNet用于目标检测的特点:
- 输入图像输入到全卷积网络中得到heatmap,其中heatmap的峰值对应着物体的中心位置
- 使用heatmap峰值点的图像特征预测边界框的长和高
- 模型利用标准dense supervised learning进行训练,Inference就是单个网络的前向传播,没有使用NMS做后处理
相比其他的基于关键点的目标检测,比如CornerNet和ExtremeNet,他们在关键点检测之后需要一个组合分组阶段(比如cornerNet中的对左上角和右下角根据嵌入向量进行分组),而CenterNet则不需要分组或者后处理,提高了算法的速度。
(三)Research Objective
本文提出了另外一种框架去解决目标检测的问题,使用边界框中心点来表示对象。对象的其他属性,如对象大小、尺寸、3D范围、方向和姿态,则直接从中心位置的图像特征进行回归。
(四)Problem Statement
大多数成功的object detectors列举出一个几乎详尽的可能的物体位置列表,并对每个位置进行分类。这是浪费的、低效的,并且需要额外的后处理(比如NMS)。后处理的过程很难微分以及训练。
(五)Method
5.1 Loss Fuction
在CenterNet中,我们的损失函数包括3个部分:关键点估计损失(Focal Loss)、回归关键点偏移损失(由下采样造成的关键点精度损失)以及wh回归损失
关键点估计损失(Focal Loss)
关键点预测 Y ^ ϵ [ 0 , 1 ] W R × H R × C \hat{Y}\epsilon [0,1]^{\frac{W}{R}\times \frac{H}{R}\times C} Y^ϵ[0,1]RW×RH×C,
关键点真实值
Y
∈
[
0
,
1
]
W
R
×
H
R
×
C
Y \in[0,1]^{\frac{W}{R} \times \frac{H}{R} \times C}
Y∈[0,1]RW×RH×C通过高斯核
Y
x
y
c
=
exp
(
−
(
x
−
p
~
x
)
2
+
(
y
−
p
~
y
)
2
2
σ
p
2
)
Y_{x y c}=\exp \left(-\frac{\left(x-\tilde{p}_{x}\right)^{2}+\left(y-\tilde{p}_{y}\right)^{2}}{2 \sigma_{p}^{2}}\right)
Yxyc=exp(−2σp2(x−p~x)2+(y−p~y)2)分散到热力图
L
k
=
1
N
∑
x
y
c
{
(
1
−
Y
^
x
y
c
)
α
log
(
Y
^
x
y
c
)
if
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_{x y c}\left\{\begin{array}{cl} \left(1-\hat{Y}_{x y c}\right)^{\alpha} \log \left(\hat{Y}_{x y c}\right) & \text { if } Y_{x y c}=1 \\ \left(1-Y_{x y c}\right)^{\beta}\left(\hat{Y}_{x y c}\right)^{\alpha} \log \left(1-\hat{Y}_{x y c}\right) & \text { otherwise } \end{array}\right.
Lk=N1xyc∑⎩⎨⎧(1−Y^xyc)αlog(Y^xyc)(1−Yxyc)β(Y^xyc)αlog(1−Y^xyc) if Yxyc=1 otherwise
其中
α
\alpha
α用于调整正确分类和错误分类的权重,是Focal Loss的核心,而
β
\beta
β用于调整负样本
Y
x
y
c
Y_{xyc}
Yxyc不为1的权重,负样本数量较大,而且还是经过高斯核处理过的,负样本数量更多了。因此,
β
\beta
β取大一些。
回归关键点偏移损失(C个类别共用:前提假设下采样后的特征图上一个像素位置至多一个object)
offset预测 O ^ ∈ R W R × H R × 2 \hat{O} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times 2} O^∈RRW×RH×2
offset真实值 ( p R − p ~ ) (\frac{p}{R}-\tilde{p}) (Rp−p~),其中 p p p为Ground Truth关键点的位置, p ~ = ⌊ p R ⌋ \tilde{p}=\left \lfloor \frac{p}{R} \right \rfloor p~=⌊Rp⌋.
这里的预测和真实值是怎么一一对应上的呢?
L
o
f
f
=
1
N
∑
p
∣
O
^
p
~
−
(
p
R
−
p
~
)
∣
L_{o f f}=\frac{1}{N} \sum_{p}\left|\hat{O}_{\tilde{p}}-\left(\frac{p}{R}-\tilde{p}\right)\right|
Loff=N1p∑∣∣∣O^p~−(Rp−p~)∣∣∣
wh回归损失
wh回归预测值 S ^ ∈ R W R × H R × 2 \hat{S} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times 2} S^∈RRW×RH×2
wh回归真实值 s k = ( x 2 ( k ) − x 1 ( k ) , y 2 ( k ) − y 1 ( k ) ) s_{k}=\left(x_{2}^{(k)}-x_{1}^{(k)}, y_{2}^{(k)}-y_{1}^{(k)}\right) sk=(x2(k)−x1(k),y2(k)−y1(k)),其中 ( x 1 ( k ) , y 1 ( k ) , x 2 ( k ) , y 2 ( k ) ) \left(x_{1}^{(k)}, y_{1}^{(k)}, x_{2}^{(k)}, y_{2}^{(k)}\right) (x1(k),y1(k),x2(k),y2(k))表示第k个物体的边界框(这里 x 1 ( k ) x_{1}^{(k)} x1(k)应该表示的是box在x方向的像素坐标最小值, x 1 ( k ) x_{1}^{(k)} x1(k)表示的是box在x方向像素坐标的最大值)
这里的预测和真实值是怎么一一对应上的呢?
L
size
=
1
N
∑
k
=
1
N
∣
S
^
p
k
−
s
k
∣
L_{\text {size}}=\frac{1}{N} \sum_{k=1}^{N}\left|\hat{S}_{p_{k}}-s_{k}\right|
Lsize=N1k=1∑N∣∣∣S^pk−sk∣∣∣
最终的整体损失:
L
det
=
L
k
+
λ
size
L
size
+
λ
off
L
off
L_{\text {det}}=L_{k}+\lambda_{\text {size}} L_{\text {size}}+\lambda_{\text {off}} L_{\text {off}}
Ldet=Lk+λsizeLsize+λoffLoff
5.2 网络架构和inference
图4中显示了3个任务的输出情况:分别是2D目标检测、3D目标检测以及位姿估计这3种任务,对于3D目标检测以及位姿估计任务的最终输出向量大小我不是很清楚。
5.2.1 目标检测任务
目标检测网络输出:
在目标检测任务中:我们使用single network来预测关键点 Y ^ \hat Y Y^、offsets O ^ \hat O O^和wh大小 S ^ \hat S S^,网络的整体输出向量为 W R × H R × ( c + 4 ) {\frac{W}{R} \times \frac{H}{R} \times (c+4)} RW×RH×(c+4),这些输出共用一个全卷积的backbone网络。然后分别经过一个单独的 3 × 3 3\times3 3×3卷积+ReLU+ 1 × 1 1\times1 1×1卷积。
目标检测的inference
-
从预测 Y ^ , W R × H R × c \hat Y,{\frac{W}{R} \times \frac{H}{R} \times c} Y^,RW×RH×c中获取每一个类别对应的关键点,这里对于每一个类别,分别的提取其对应heatmap W R × H R \frac{W}{R} \times \frac{H}{R} RW×RH上的peaks(peaks的定义是其8邻域中的所有值都小于等于中心位置的预测值),然后保留前100个峰值,此时我们得到了C个类别所有的关键点大致位置,其中第c类别的中心点位置为 P ^ c \hat{\mathcal{P}}_{c} P^c。假设其总数为n,那么这n个点的表示方式为: P c ^ = { ( x ^ i , y ^ i ) } i = 1 n \hat{\mathcal{P}_c}=\left\{\left(\hat{x}_{i}, \hat{y}_{i}\right)\right\}_{i=1}^{n} Pc^={(x^i,y^i)}i=1n,每一个关键点都对应着一个坐标 ( x ^ i , y ^ i ) (\hat{x}_{i}, \hat{y}_{i}) (x^i,y^i)
-
预测的像素级offset为 ( δ x ^ i , δ y ^ i ) = O ^ x ^ i , y ^ i \left(\delta \hat{x}_{i}, \delta \hat{y}_{i}\right)=\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 \left(\hat{w}_{i}, \hat{h}_{i}\right)=\hat{S}_{\hat{x}_{i}, \hat{y}_{i}} (w^i,h^i)=S^x^i,y^i。
这样我们就得到了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
)
,
\begin{array}{c} \left(\hat{x}_{i}+\delta \hat{x}_{i}-\hat{w}_{i} / 2, \quad \hat{y}_{i}+\delta \hat{y}_{i}-\hat{h}_{i} / 2,\right. \\ \left.\hat{x}_{i}+\delta \hat{x}_{i}+\hat{w}_{i} / 2, \quad \hat{y}_{i}+\delta \hat{y}_{i}+\hat{h}_{i} / 2\right), \end{array}
(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),
所有的outputs都是直接从关键点估计产生,并且求keypoint peaks可以通过
3
×
3
3\times3
3×3的max pooling操作实现。
5.2.2 3D目标检测任务
3D目标检测网络输出
对于一个对象来说,3D检测的任务是,需要确定中心点,同时需要确定中心点的三个附加属性:depth、3D dimension和orientation,这3个附加属性是通过3个不同的head进行预测的。对于第k个object,从3个输出特征图上提取输出结果 d ^ k ∈ R , γ ^ k ∈ R 3 , α ^ k ∈ R 8 \hat{d}_{k} \in R, \hat{\gamma}_{k} \in R^{3}, \hat{\alpha}_{k} \in R^{8} d^k∈R,γ^k∈R3,α^k∈R8。
-
网络预测depth输出为 D ^ ∈ [ 0 , 1 ] W R × H R \hat{D} \in[0,1]^{\frac{W}{R} \times \frac{H}{R}} D^∈[0,1]RW×RH,depth很难直接去回归,作者令网络的输出经过变换 d = 1 / σ ( d ^ ) − 1 d=1 / \sigma(\hat{d})-1 d=1/σ(d^)−1之后得到网络的depth,其中 d d d为真实的depth, d ^ \hat d d^为网络输出的预测值, σ \sigma σ为sigmoid函数。在backbone之后接卷积+ReLU+卷积进行depth的预测,输出经sigmoid取倒数后-1变换到真实的depth尺度上,利用L1距离计算损失。
损失表示为:
L d e p = 1 N ∑ k = 1 N ∣ 1 σ ( d ^ k ) − 1 − d k ∣ L_{d e p}=\frac{1}{N} \sum_{k=1}^{N}\left|\frac{1}{\sigma\left(\hat{d}_{k}\right)}-1-d_{k}\right| Ldep=N1k=1∑N∣∣∣∣∣∣σ(d^k)1−1−dk∣∣∣∣∣∣ -
预测3D dimension,直接回归,网络输出 Γ ^ ∈ R W R × H R × 3 \hat{\Gamma} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times 3} Γ^∈RRW×RH×3,并计算L1损失
损失表示为:
L dim = 1 N ∑ k = 1 N ∣ γ ^ k − γ k ∣ L_{\text {dim}}=\frac{1}{N} \sum_{k=1}^{N}\left|\hat{\gamma}_{k}-\gamma_{k}\right| Ldim=N1k=1∑N∣γ^k−γk∣ -
预测orientation encoding为 A ^ ∈ R W R × H R × 8 \hat{A} \in R^{\frac{W}{R} \times \frac{H}{R} \times 8} A^∈RRW×RH×8,原本orientation θ \theta θ是一个标量,作者这里使用Mousavian et al. [24,38]的想法,使用8个标量去编码方向从而能够更好地训练。
关于角度这里的思想,我们还需要读一读[24,38]这两片论文体会下。
这8个标量被分成两组,一组的角度范围是 [ − 7 π 6 , π 6 ] [-\frac{7\pi}{6},\frac{\pi}{6}] [−67π,6π],另一组角度范围是 [ − π 6 , 7 π 6 ] [-\frac{\pi}{6},\frac{7\pi}{6}] [−6π,67π],并且每一组中有4个标量,其中两个标量 b i ∈ R 2 b_i\in R^2 bi∈R2用于softmax分类表示,(疑问为什么一个bin里面的softmax 分类是2维的?)。剩下两个标量 a i ∈ R 2 a_i\in R^2 ai∈R2表示到bin中心 m i m_i mi的offset的sin和cos值。因此一个bin的预测结果为: α ^ = [ b ^ 1 , a ^ 1 , b ^ 2 , a ^ 2 ] \hat{\alpha}=\left[\hat{b}_{1}, \hat{a}_{1}, \hat{b}_{2}, \hat{a}_{2}\right] α^=[b^1,a^1,b^2,a^2],其损失函数的表示为:
L o r i = 1 N ∑ k = 1 N ∑ i = 1 2 ( softmax ( b ^ i , c i ) + c i ∣ a ^ i − a i ∣ ) L_{o r i}=\frac{1}{N} \sum_{k=1}^{N} \sum_{i=1}^{2}\left(\operatorname{softmax}\left(\hat{b}_{i}, c_{i}\right)+c_{i}\left|\hat{a}_{i}-a_{i}\right|\right) Lori=N1k=1∑Ni=1∑2(softmax(b^i,ci)+ci∣a^i−ai∣)
其中 c i = 1 ( θ ∈ B i ) , a i = ( sin ( θ − m i ) , cos ( θ − m i ) ) c_{i}=\mathbb{1}\left(\theta \in B_{i}\right), a_{i}=\left(\sin \left(\theta-m_{i}\right), \cos \left(\theta-m_{i}\right)\right) ci=1(θ∈Bi),ai=(sin(θ−mi),cos(θ−mi)), c i c_i ci表示示性函数(这里我觉得 c i c_i ci应该是 R 2 R^2 R2的)最终的角度inference结果为:
θ ^ = arctan 2 ( a ^ j 1 , a ^ j 2 ) + m j \hat{\theta}=\arctan 2\left(\hat{a}_{j 1}, \hat{a}_{j 2}\right)+m_{j} θ^=arctan2(a^j1,a^j2)+mj
其中 j j j是具有较大分类score的那个组。
我觉得这里应该也有一个关键点的预测网络,即 Y ^ ∈ R W R × H R × c \hat Y\in R^{\frac{W}{R} \times \frac{H}{R} \times c} Y^∈RRW×RH×c,然后,这些不同类别的关键点属性(depth,3D dimension以及orientation encoding)公用同一个预测结果
5.2.3 人体位姿估计
人体姿态估计旨在为图像中的每个人体object估计k个2D人体关节位置(对于COCO,k = 17)。作者将每个关节位置看成是中心点的属性,利用关节位置相比于中心点位置的偏移来定义关节位置, J ^ ∈ R W R × H R × k × 2 \hat{J} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times k \times 2} J^∈RRW×RH×k×2,并且这里直接使用像素距离来表示损失,利用L1距离计算损失,作者通过masking loss来忽略那些不可见的keypoints。
预测k个关节的heatmap,以及对应的偏移位置 Φ ^ ∈ R W R × H R × k \hat{\Phi} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times k} Φ^∈RRW×RH×k(这里使用focal loss),同时对这些关节,预测offset,offset是对所有类别的关节通用的,因此预测的offset大小为 R W R × H R × 2 \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times 2} RRW×RH×2(这里和目标检测任务中offset使用相同的损失),
说明:这应该是一个由粗到细的过程(个人看论文的理解)
作者应该在关节位置估计上:首先对于一个人体目标(已经知道中心点的位置)来说只估计其他点相对于中心点的offsets,这样使用 W R × H R × k × 2 {\frac{W}{R} \times \frac{H}{R} \times k \times 2} RW×RH×k×2参数,但是得到的距离中心点的偏移位置不准确,因此,需要对每一个关节位置预测一个偏移offset,因为我们预测的偏移是一个 W R × H R × 2 {\frac{W}{R} \times \frac{H}{R} \times 2} RW×RH×2大小的,也就是我们需要确定这个偏移究竟是哪一个关节的偏移。
假设我们当前仅考虑第j个关节,我们先找到中心点位于
(
x
^
,
y
^
)
(\hat{x}, \hat{y})
(x^,y^)位置的第j个关节的粗略位置
l
j
=
(
x
^
,
y
^
)
+
J
^
x
^
y
^
j
for
j
∈
1
…
k
l_{j}=(\hat{x}, \hat{y})+\hat{J}_{\hat{x} \hat{y} j} \text { for } j \in 1 \ldots k
lj=(x^,y^)+J^x^y^j for j∈1…k
然后我们根据另一个特征图
Φ
^
∈
R
W
R
×
H
R
×
k
\hat{\Phi} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times k}
Φ^∈RRW×RH×k的第j个关节上的子图
R
W
R
×
H
R
\mathcal{R}^{\frac{W}{R} \times \frac{H}{R}}
RRW×RH上的值>0.1的位置记录下来,一共有
n
j
n_j
nj个,也就是第j个关节可能出现的位置
L
j
=
{
l
~
j
i
}
i
=
1
n
j
L_{j}=\left\{\tilde{l}_{j i}\right\}_{i=1}^{n_{j}}
Lj={l~ji}i=1nj。然后在所有第j个关节可能出现的位置上,找到和中心点位于
(
x
^
,
y
^
)
(\hat{x}, \hat{y})
(x^,y^)位置的第j个关节的粗略位置
l
j
l_j
lj最接近的那个位置
l
∈
L
j
l \in L_j
l∈Lj,这个位置对应的偏移就是我们应该加到
l
j
l_j
lj上的偏移。
我这里的疑问是:为什么还要引入 Φ ^ \hat{\Phi} Φ^而不直接预测基于当前粗略的关节位置,对应到预测的offset图上。这样不是更加简单一些吗?
(六)实现上的一些细节问题
backbone采用了四种方式:ResNet-18, ResNet-101 [55], DLA-34 [58], and Hourglass-104 。并且使用可变形卷积层(deformable convolution layers)修改了ResNets以及DLA-34。
-
Hourglass-104首先将输入下采样4倍,然后是两个连续的Hourglass Module。每个Hourglass Module是一个带有跳跃连接的对称的5层down- and up-convolutional network。这个网络相当大,但是产生了最优关键点估计
-
ResNet,使用3个up-convolutional networks对标准的残差网络进行扩充,使得网络能有一个更高的输出分辨率(输出步长为4),3个上卷积网络的特征图通道分别为256,128,64.并且在每一个上卷积网络前增加一个3 × 3的可变形卷积层。上卷积核被初始化为双线性插值。
-
DLA是一个带有层间跳跃连接的图像分类网络,我们利用DLA的完全卷积上采样版本进行密集预测,它使用迭代深度聚合来对称地提高feature map的分辨率,我们用从较低层到输出的可变形卷积来增强跳跃连接,在具体实现上,我们是使用3*3的可变形卷积代替原始卷积的。
并且在每一个输出head前增加了一个256通道的 3 × 3 3\times3 3×3的卷积层,最后经过 1 × 1 1\times1 1×1卷积产生最后的输出。
6.1 训练阶段
- 训练我们以512 × 512的输入分辨率进行训练。所有模型产生的输出分辨率为128×12。
- 我们使用随机翻转、随机缩放(在0.6到1.3之间)、裁剪和颜色抖动作为数据增强,
- 并使用Adam[28]来优化整体目标。
- 我们不使用增强来训练3D估计分支,因为裁剪或缩放会改变3D测量。
- 对于residual网络和DLA-34,batchsize=128(在8个GPU上),他们的学习率策略没有理解。对于Hourglass-104,使用batchsize=29(在5个GPU上,主GPU批处理大小为4),学习率也没有看明白。
- 在检测时,我们从ExtremeNet [61]微调Hourglass-104以节省计算。Resnet101和DLA-34的下采样层用ImageNet预处理初始化,上采样层随机初始化。
6.2 Inference阶段
使用了3种级别的测试增强:no augmentation, flip augmentation, and flip and multi-scale(0.5, 0.75, 1, 1.25, 1.5)
在flip中,在编码bounding box之前对网络输出进行一个平均,
在multi-scale中,使用NMS合并结果。
(七)实验
在MS COCO上进行实验,我们报道的评价指标为:report average precision over all IOU thresholds (AP), AP at IOU thresholds 0.5(AP50) and 0.75 (AP75).
实验1
Hourglass-104以相对较好的速度实现了最好的精度,并且在该backbone上的表现,CenterNet要优于CornerNet。运行时间的改进来自更少的output heads和更简单的box decoding方案。更高的精度表明中心点比拐角或极值点更容易检测。
实验2
然后再和一些state of art的网络进行比较:
实验3
当两个不同的物体完全对齐,它们可能会共享同一个中心。在这种情况下,CenterNet将只检测到其中的一个。我们从研究这种情况在实践中发生的频率开始,并将它和一些和CenterNet能竞争的方法漏检情况联系起来。
首先就是统计CenterNet失效的情况(看看人家这定量分析,这是服了)
COCO训练集中614对物体以步幅4碰撞到同一个中心点,总共有860001个对象,概率小于 0.1 0.1 0.1%,这要比slow or fast RCNN由于inperfect region proposals(大约2%)造成的漏检小。
并且,比由于不充分的anchor放置,导致的anchor-based方法的漏检(20.0% for Faster-RCNN with 15 anchors at 0.5 IOU threshold)要小
最后,715对物体的IoU超过了0.7,这对于基于anchor的方法来说,在检测时很容易将两个框中的一个去掉,导致目标的漏检
因此我们漏检的概率是非常的小的。
实验4
我们说了我们的CenterNet可以不用做NMS这些后处理,我们口气那么大,肯定是有实验证明的
我们分别使用和不使用NMS做后处理,得到的AP结果对于DLA-34 (flip-test),从39.2% 变到 39.7%。对于Hourglass-104,AP还是保持42.2%。嗨,干脆不用了。
实验5
对于我们新增加的超参数,我们要做Ablation实验。我们选一个网络来做,DLA-34
实验5.1
训练期间,我们将输入分辨率固定为512×512。
测试阶段,我们有两种方式:1.保持原来分辨率,然后将网络零填充到网络的最大步长(stide),对于ResNet以及DLA分别零填充32个pixels,对于HourglassNet,零填充128个pixels。2.固定分辨率进行测试。
从上图中可以看出,使用原图加零填充取得了最佳的效果,我想知道这里的原图是多大,会不会比512还大?
实验5.2
回归损失比较了一个普通的L1损失以及一个smooth L1损失,看看哪个要好一些,普通L1的效果比smooth L1好的挺多的啊,这个地方解释很少啊,为什么L1损失要更好一些呢?
实验5.3
调整损失函数中的 λ s i z e \lambda_{size} λsize也就是长宽回归的损失的权重,增大 λ s i z e \lambda_{size} λsize使得AP显著下降,这个因为长宽损失的范围是0到w和h(这里我觉得应该是这个,单看论文的话)而不是0-1,因此增加 λ s i z e \lambda_{size} λsize会显著增加网络对w和h的回归,而其他损失回归就会差很多,会造成网络精度的下降。
实验5.4
epoch=140的情况是:前90epoch训练,然后进行学习率下降,再训练50个epoch
epoch=230的情况是:前180epoch训练,然后进行学习率下降,再训练50个epoch。
虽然性能会提升,但是相比于时间成本来说,不是很划算,为了节省计算资源(和北极熊),我们在消融实验中使用了140个epoch,但与其他方法相比,DLA使用了230个epoch。
实验5.5
作者他们还尝试了回归到一个以上的anchor上,但是实验没有取得成功
实验6
我们的方法表现在AP和AOS指标上和同行不相上下,在BEV中略胜一筹。同时我们的CenterNet比这两种方法都快两个数量级。就是强
实验7
我觉得这里的reg指的就是我之前问的问题,直接在预测的粗糙的关节点位置,加上预测的offsets训练出来的,而jd应该是增加了 Φ ^ \hat \Phi Φ^的关节位置的预测的情况,使得网络的性能得到了提升,实现了通用性的说明!
(八)Notes
1. 本文中的方法和anchor-based one-stage的方法很接近。
center point被看成是一个形状未知的anchor。不同之处在于:
- 没有手动设置阈值用于前景和背景的分类
- 每个物体而言,我们只有一个positive “anchor”,不需要做NMS
- 具有larger output resolution(输出下采样比例为4),相比于传统的目标detectors(输出下采样比例到16),这样就不需要使用multiple anchors了,对于不同scale的特征图,使用不同大小的anchor。
2. 损失函数是怎么得到的呢?
符号说明:
令 I ϵ R W × H × 3 I\epsilon R^{W\times H\times 3} IϵRW×H×3为输入图像,其宽W,高H。我们目标是生成关键点热力图 Y ^ ϵ [ 0 , 1 ] W R × H R × C \hat{Y}\epsilon [0,1]^{\frac{W}{R}\times \frac{H}{R}\times C} Y^ϵ[0,1]RW×RH×C,其中R 是输出stride(即尺寸缩放比例),C是关键点类型数(即输出特征图通道数);关键点类型有: C = 17 的人关节点,用于人姿态估计; C = 80 的目标类别,用于目标检测。我们默认采用下采用数为R=4 ; Y ^ x , y , c = 1 \hat{Y}_{x,y,c}=1 Y^x,y,c=1表示检测到的关键点; Y ^ x , y , c = 0 \hat{Y}_{x,y,c}=0 Y^x,y,c=0表示背景;我们采用了几个不同的全卷积编码-解码网络来预测图像 I得到的 Y ^ \hat{Y} Y^:stacked hourglass network , upconvolutional residual networks (ResNet), deep layer aggregation (DLA) 。
我们训练关键点预测网络时参照了Law和Deng (H. Law and J. Deng. Cornernet: Detecting objects as
paired keypoints. In ECCV, 2018.) 对于 Ground Truth(即GT)的关键点 c ,其位置为 p ϵ R 2 p \epsilon R^{2} pϵR2 ,计算得到低分辨率(经过下采样)上对应的关键点 p ~ = ⌊ p R ⌋ \tilde{p}=\left \lfloor \frac{p}{R} \right \rfloor p~=⌊Rp⌋. 我们将 GT 关键点 通过高斯核 Y x y c = exp ( − ( x − p ~ x ) 2 + ( y − p ~ y ) 2 2 σ p 2 ) Y_{x y c}=\exp \left(-\frac{\left(x-\tilde{p}_{x}\right)^{2}+\left(y-\tilde{p}_{y}\right)^{2}}{2 \sigma_{p}^{2}}\right) Yxyc=exp(−2σp2(x−p~x)2+(y−p~y)2)分散到热力图 Y ∈ [ 0 , 1 ] W R × H R × C Y \in[0,1]^{\frac{W}{R} \times \frac{H}{R} \times C} Y∈[0,1]RW×RH×C 上,其中 σ p \sigma_{p} σp 是目标尺度-自适应 的标准方差。如果对于同个类 c (同个关键点或是目标类别)有两个高斯函数发生重叠,我们选择元素级(element-wise maxi-mum)最大的。
训练目标函数如下,像素级逻辑回归的focal loss:
L
k
=
1
N
∑
x
y
c
{
(
1
−
Y
^
x
y
c
)
α
log
(
Y
^
x
y
c
)
if
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_{x y c}\left\{\begin{array}{cl} \left(1-\hat{Y}_{x y c}\right)^{\alpha} \log \left(\hat{Y}_{x y c}\right) & \text { if } Y_{x y c}=1 \\ \left(1-Y_{x y c}\right)^{\beta}\left(\hat{Y}_{x y c}\right)^{\alpha} \log \left(1-\hat{Y}_{x y c}\right) & \text { otherwise } \end{array}\right.
Lk=N1xyc∑⎩⎨⎧(1−Y^xyc)αlog(Y^xyc)(1−Yxyc)β(Y^xyc)αlog(1−Y^xyc) if Yxyc=1 otherwise
其中 α \alpha α 和 β \beta β是focal loss的超参数,分别用于调整正确分类样本和错误分类样本之间,正负样本之间的权重关系,实验中两个数分别设置为2和4, N是图像 I I I 中的关键点个数,这里的关键点值得是所有 Y x y c = 1 Y_{xyc}=1 Yxyc=1的点吗?,除以N主要为了将所有focal loss归一化。
由于图像下采样时,GT的关键点会因数据是离散的而产生偏差,我们对每个中心点附加预测了个局部偏移 O ^ ∈ R W R × H R × 2 \hat{O} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times 2} O^∈RRW×RH×2 所有类别 c 共享同个偏移预测(也就是说我们这里假设C个类别的中心不会在同一个位置),
这个偏移用 L1 loss来训练:
L
o
f
f
=
1
N
∑
p
∣
O
^
p
~
−
(
p
R
−
p
~
)
∣
L_{o f f}=\frac{1}{N} \sum_{p}\left|\hat{O}_{\tilde{p}}-\left(\frac{p}{R}-\tilde{p}\right)\right|
Loff=N1p∑∣∣∣O^p~−(Rp−p~)∣∣∣
很明显,这里只计算了关键点位置的offset损失。
令 ( x 1 ( k ) , y 1 ( k ) , x 2 ( k ) , y 2 ( k ) ) \left(x_{1}^{(k)}, y_{1}^{(k)}, x_{2}^{(k)}, y_{2}^{(k)}\right) (x1(k),y1(k),x2(k),y2(k))表示第k个物体的边界框(这里 x 1 ( k ) x_{1}^{(k)} x1(k)应该表示的是box在x方向的像素坐标最小值, x 1 ( k ) x_{1}^{(k)} x1(k)表示的是box在x方向像素坐标的最大值),他的类别为 c k c_k ck,因此,其中心点坐标为: ( x 1 ( k ) + x 2 ( k ) 2 , y 1 ( k ) + y 2 ( k ) 2 ) \left(\frac{x_{1}^{(k)}+x_{2}^{(k)}}{2}, \frac{y_{1}^{(k)}+y_{2}^{(k)}}{2}\right) (2x1(k)+x2(k),2y1(k)+y2(k)),之前我们已经预测了所有的Center Keypoints,需要对长宽进行回归,这里作者采取的回归方法是直接回归像素级的长和宽,而不是使用对尺度进行归一化的方法,即 s k = ( x 2 ( k ) − x 1 ( k ) , y 2 ( k ) − y 1 ( k ) ) s_{k}=\left(x_{2}^{(k)}-x_{1}^{(k)}, y_{2}^{(k)}-y_{1}^{(k)}\right) sk=(x2(k)−x1(k),y2(k)−y1(k)),和之前offsets中假设相同,对于所有类别目标回归wh值 S ^ ∈ R W R × H R × 2 \hat{S} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times 2} S^∈RRW×RH×2
(也就是在特征图上(4倍下采样原图),C个类别的中心不会在同一个位置,或者说4个像素位置的大小,我们假设只存在一个物体,很显然物体的大小是要大于4个像素的,我们认为这个假设是合理的)
这里的长宽回归我们同样也使用L1损失函数:和offsets损失相同,我们同样仅对所有的目标点计算损失
L
size
=
1
N
∑
k
=
1
N
∣
S
^
p
k
−
s
k
∣
L_{\text {size}}=\frac{1}{N} \sum_{k=1}^{N}\left|\hat{S}_{p_{k}}-s_{k}\right|
Lsize=N1k=1∑N∣∣∣S^pk−sk∣∣∣
整体损失函数为:
L
det
=
L
k
+
λ
size
L
size
+
λ
off
L
off
L_{\text {det}}=L_{k}+\lambda_{\text {size}} L_{\text {size}}+\lambda_{\text {off}} L_{\text {off}}
Ldet=Lk+λsizeLsize+λoffLoff
作者论文中的设定为:
λ
off
=
0.1
\lambda_{\text {off}}=0.1
λoff=0.1并且
λ
size
=
1
\lambda_{\text {size}}=1
λsize=1
(九)问题
问题1:offsets损失中的 O ^ p ~ \hat{O}_{\tilde{p}} O^p~和wh回归损失中的 S ^ p k \hat{S}_{p_{k}} S^pk在网络中的表示形式,
或者说怎么利用网络架构得到损失的计算值的?
问题2:3D目标检测以及位姿估计任务的最终输出向量大小
不知道这三种网络之间存在着的差异是什么?需要看看代码实现