目标检测:centernet论文笔记

  • centernet使用关键点估计来找到中心点,然后回归到所有其他对象属性,如大小、3D位置、方向,甚至姿态。CenterNet是端到端可微的,比基于边界框的检测器更简单、更快、更准确。

总体方法如下图所示:

目标检测 fps代码 目标检测centernet_深度学习

Head检测头

在backbone之后,会得到一个特征图,shape为Rh,w,D,h和w是原图的1/4。这个特征经过检测Head,得到了三样东西。

  • key point heatmap: shape是 h × w × C , c是类别数目,就是每个类别都有自己的单通道的heatmap。热图上的峰值对应了图像的一个目标(属于热图对应的类别)。
  • Offset: 因为是预测目标中心的位置。如果一个在原图的目标的中心坐标为x,y。那这个目标对应在特征图上的位置就是 x//4, y // 4。 这里用的是整除。 这个数字乘以4得到的数值就不会是原图坐标了。所以从heatmap上取到的峰值位置,未必等于原图上目标的中心点。还需要一个偏置项,描述了heatmap上的取到的峰值位置离原图坐标下最终的目标的一个偏移量。
  • Size: shape和offset一致,都是2通道的map。两个通道分别描述目标的height和width。

所以总的输出通道为C+4。相较于Anchor Base的检测网络,需要N* K*(C+4)小了很多。N是检测头的数目,K是anchor的数目

Label的编码

三个分支对应的标签:

  • heatmap:既然heatmap是预测目标的中心位置。那么对于一张图像中的一个目标Oc,x,y在图像上x,y的位置上,且所属类别C。我们就应该在第C个类别对应的heatmap上,在[x//4, y//4]的位置上设置为1。但是仅仅这样是不够的,一个目标的中心点是通过暴力的求平均得到的,网络在训练初期很难理解,为啥离中心点一个像素单元的地方就变成了负样本了。就是说网络比较难get到什么是物体的中心。因为还需要用一个高斯核对每个位置重新赋值一个label,这个label是在0-1之间,相当于起到了一个软标签的效果。离目标中心越远的位置,其label值越接近0。 重叠位置的label赋值选择二者的最大值。(其实也是关键点检测常用的编码label的方法)
  • offSet: 如果你理解了offset的用途。那不难理解如何训练Offset。我们希望offset输出的是 原始坐标整除stride和不整除stride 的差值。所以目标 Oc,x,y在offset上对应的label就是 在 [x//4, y//4]上的值为 [x / 4 - x // 4, y / 4 - y // 4]
  • Size:基于上面的两个分支,我们已经可以准确获得目标在原图坐标系下的中心点了。接下里,希望Size输出基于峰值位置上目标框的高和宽。假设这个目标的GT框是(x1,y1; x2, y2), 则这个位置的label是 (x2 - x1; y2 - y1)。 注意是在原图坐标下计算的,没有除以stride。同时尺度过大,作者在size分支的loss上乘上了0.1这个系数。loss放在后面说。

label的解码

在inference的过程中,得到三个分支的特征图之后,如何解码呢?

  1. 首先得到峰值位置(x,y),据作者说,用3x3的最大池化就能找到。转到源码分析部分。
  2. 加上(x,y)位置上的offset结果。 然后乘以4,映射到原图坐标下。
  3. 得到(x,y)位置上Size结果。 然后加加减减就能得到框的左上角坐标和右下角坐标了
    (看到这的时候,我是好奇第三步中怎么得到size的)