论文: Objects as Points
Code: https://github.com/xingyizhou/CenterNet
本文中采取了一种不同的方法,它把object建模成一个点–对应bounding box的中心点, 该方法基于中心点,称作CenterNet。相比于对应的基于bbouding box的检测器,CenterNet是端到端可微分的,更简洁的,更快的,而且更精确的。
确立了中心点后,一些其他的特征,比如物体的尺寸,3D里的orientation, dimension, depth等信息,姿势估计里的关键点等信息,都可以直接该中心点的图像特征回归得到。因此,在这种思路下,object detection就是一个标准的关键点估计问题:把图像送入一个全卷积网络,产生一张heatmap,这张heatmap里的peaks就是物体的中心,在每一个peak位置的图像特征用来预测objects的宽度和高度。在检测时,没有nms作为后处理,是一个单一的forward-pass过程。
CenterNet方法是通用的,只需少量工作就可以扩展到其他的问题,如3D的object detection, 多人的姿态估计。实验结果也证明了这一点。
I ∈ R W ∗ H ∗ 3 I \in R^{W * H * 3} I∈RW∗H∗3表示一张宽W、高H的输入图像。CenterNet的目标是产生一张关键点heatmap Y ^ ∈ [ 0 , 1 ] W R ∗ H R ∗ C \hat Y \in [0, 1]^{\frac{W}{R} * \frac{H}{R}*C} Y^∈[0,1]RW∗RH∗C, R R R是输出的stride, C是关键点类别的数量, 在COCO的object detection里 C C C = 80。 R R R一般选用4。骨干网络论文中采取了stacked hourglass network, up-ResNet和deep layer aggregation(DLA).
整个网络的输出包含C + 4个通道,所有的这些输出共享相同的全卷积骨干网络。接下来介绍的loss函数里会详细说明为啥是+4通到
heatmap中的值只有0,1是如何实现的?从论文下面介绍来看,这里产生的heatmap的大小还是在0-1之间,表示置信度。之后再看一下源码,确认一下。
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表示是背景。
关键点的分类loss
对于每一个关键点 p ∈ R 2 p \in R^2 p∈R2, 设它的类别是 c c c, 我计算它的低分率表示 p ~ = ⌊ p R ⌋ \tilde p = \lfloor{\frac{p}{R}}\rfloor p~=⌊Rp⌋, 这样可以通过如下的高斯核得到一个ground truth的heatmap Y ∈ [ 0 , 1 ] W R ∗ H R ∗ C Y \in [0, 1]^{\frac{W}{R} * \frac{H}{R} * C} Y∈[0,1]RW∗RH∗C
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\sigma^2_p}) Yxyc=exp(−2σp2(x−p~x)2+(y−p~y)2)
如果某一类的两个Gaussians重叠了,则选择最大值。
loss函数为惩罚削减的逐像素的逻辑回归的focal loss。
L k = − 1 N Σ x y c = { ( 1 − Y ^ x y c ) α l o g ( Y ^ x y c ) , Y x y c = 1 ( 1 − Y x y c ) β ( Y ^ x y c ) α l o g ( 1 − Y ^ x y c ) , o t h e r s L_k = \frac{-1}{N}\Sigma_{xyc} = \begin{cases} (1-\hat Y_{xyc})^\alpha log(\hat Y_{xyc}), Y_{xyc} = 1 \\\\ (1-Y_{xyc})^\beta (\hat Y_{xyc})^\alpha log(1 - \hat Y_{xyc}), others \end{cases} Lk=N−1Σxyc=⎩⎪⎨⎪⎧(1−Y^xyc)αlog(Y^xyc),Yxyc=1(1−Yxyc)β(Y^xyc)αlog(1−Y^xyc),others
α \alpha α和 β \beta β是focal loss中的超参数,这里设置为 α = 2 \alpha = 2 α=2, β = 4 \beta = 4 β=4。 N N N是在图像 I I I里的关键点的数量,选择N进行归一化。
偏移(offset) loss
由于output stride的存在,也产生了离散化误差, p R − p ~ = p R − ⌊ p R ⌋ \frac{p}{R} - \tilde p = \frac{p}{R} - \lfloor{\frac{p}{R}}\rfloor Rp−p~=Rp−⌊Rp⌋,所以在每个中心点处也预测偏移 O ^ ∈ R W R ∗ W R ∗ 2 \hat O \in R^{\frac{W}{R} * \frac{W}{R} * 2} O^∈RRW∗RW∗2,所有的c个类别贡献偏移预测量。
偏移loss采取的L1 loss,
L o f f = 1 N Σ p ∣ O ^ p ~ − ( p R − p ~ ) ∣ L_{off} = \frac{1}{N} \Sigma_p|\hat O_{\tilde p} - (\frac{p}{R} - \tilde p)| Loff=N1Σp∣O^p~−(Rp−p~)∣
偏移loss只计算在关键点位置 p ~ \tilde p p~的误差,其它所有的位置都会被忽略掉。
尺寸loss(宽、高)
( 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))表示objcet的bounding box, 它的类别是 c k c_k ck。
我们使用 Y ^ \hat Y Y^来预测中心点,除此之外,论文中还要对每一个object k进行回归尺寸 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))。
为了减轻计算负担,论文中对所有的object类别采用单一的尺寸预测 S ^ ∈ R W R ∗ H R ∗ 2 \hat S \in R^{\frac{W}{R} * \frac{H}{R} * 2} S^∈RRW∗RH∗2, 尺寸loss也采用L1 loss,
L s i z e = 1 N Σ k = 1 N ∣ S ^ p k − s k ∣ L_{size} = \frac{1}{N}\Sigma_{k=1}^N|\hat S_{pk} - s_k| Lsize=N1Σk=1N∣S^pk−sk∣
这里没有对尺度(scale)进行归一化,而是直接使用了元素图像的坐标。
训练的总的loss为
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+λsizeLsize+λoffLoff
其中, λ s i z e = 0.1 , λ o f f = 1 \lambda_{size} = 0.1, \lambda_{off} = 1 λsize=0.1,λoff=1
在预测时首先独立的在heatmaps提取每一个类别的peaks。作者把heatmap中大于等于8邻域的位置当做是peaks,并选取top 100。
CenterNet最终预测多少个检测框呢或者通过什么方式控制的呢?有待解决
P ^ c \hat P_c P^c表示类别c的n个检测中心, P ^ = ( x ^ i , y ^ i ) i = 1 n \hat P = {(\hat x_i, \hat y_i)}_{i=1}^n P^=(x^i,y^i)i=1n, 每一个关键点位置的坐标都是整数 ( x i , y i ) (x_i, y_i) (xi,yi), Y ^ x i , y i , c \hat Y_{x_i, y_i, c} Y^xi,yi,c是它检测的置信度,从而可以产生一个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 y_i) = \hat O_{\hat x_i, \hat y_i} (δx^i,δyi)=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是尺寸预测。
Peak keypoint提取可以同可以通过 3 x 3 的 maxpooling操作实现。
速度和精度如下所示