扔掉 anchor!真正的 CenterNet——Objects as Points 论文解读

date
Jan 1, 2022
Last edited time
Mar 27, 2023 09:02 AM
status
Published
slug
CenterNet论文解读
tags
DL
CV
summary
转载
type
Post
origin
Field
Plat
扔掉anchor!真正的CenterNet--Objects as Points论文解读
anchor-free目标检测属于anchor-free系列的目标检测,相比于CornerNet做出了改进,使得检测速度和精度相比于one-stage和two-stage的框架都有不小的提高,尤其是与YOLOv3作比较,在相同速度的条件下,CenterNet的精度比YOLOv3提高了4个左右的点。 CenterNet不仅可以用于目标检测,还可以用于其他的一些任务,如 肢体识别或者3D目标检测等等,但是这篇文章我们就重点说的是其对 目标检测 的部分。 那CenterNet相比于之前的one-stage和two-stage的目标检测有什么特点? CenterNet的"anchor"仅仅会出现在当前目标的位置处而不是整张图上撒,所以也没有所谓的box overlap大于多少多少的算positive anchor这一说,也不需要区分这个anchor是物体还是背景 - 因为每个目标只对应一个"anchor",这个anchor是从heatmap中提取出来的,所以不需要NMS再进行来筛选 CenterNet的输出分辨率的下采样因子是4,比起其他的目标检测框架算是比较小的(Mask-Rcnn最小为16、SSD为最小为16)。 总体来说,CenterNet结构优雅简单,直接检测目标的中心点和大小,是真anchor-free。 PS:其实本篇所说的CenterNet的真实论文名称叫做 objects as points,因为也有一篇叫做 CenterNet: Keypoint Triplets for Object Detection的论文与这篇文章的网络名称冲突了,所以以下所说的CenterNet是指 objects as points 。 总之这是一篇值得一读的好文! 接下来说一下正式进入篇章之前的一些前提知识。 论文中CenterNet提到了三种用于目标检测的网络,这三种网络都是编码解码(encoder-decoder)的结构: Resnet-18 with up-convolutional layers : 28.1% coco and 142 FPS DLA-34 : 37.4% COCOAP and 52 FPS Hourglass-104 : 45.1%
扔掉anchor!真正的CenterNet--Objects as Points论文解读
 

前言

anchor-free 目标检测属于 anchor-free 系列的目标检测,相比于 CornerNet 做出了改进,使得检测速度和精度相比于 one-stage 和 two-stage 的框架都有不小的提高,尤其是与 YOLOv3 作比较,在相同速度的条件下,CenterNet 的精度比 YOLOv3 提高了 4 个左右的点。
notion image
CenterNet 不仅可以用于目标检测,还可以用于其他的一些任务,如肢体识别或者 3D 目标检测等等,但是这篇文章我们就重点说的是其对目标检测的部分。
notion image
那 CenterNet 相比于之前的 one-stage 和 two-stage 的目标检测有什么特点?
  • CenterNet 的 “anchor” 仅仅会出现在当前目标的位置处而不是整张图上撒,所以也没有所谓的 box overlap 大于多少多少的算 positive anchor 这一说,也不需要区分这个 anchor 是物体还是背景 - 因为每个目标只对应一个“anchor”,这个 anchor 是从 heatmap 中提取出来的,所以不需要 NMS 再进行来筛选
  • CenterNet 的输出分辨率的下采样因子是 4,比起其他的目标检测框架算是比较小的 (Mask-Rcnn 最小为 16、SSD 为最小为 16)。
总体来说,CenterNet 结构优雅简单,直接检测目标的中心点和大小,是真 anchor-free。
总之这是一篇值得一读的好文!

网络结构与前提条件

接下来说一下正式进入篇章之前的一些前提知识。

使用的网络

论文中 CenterNet 提到了三种用于目标检测的网络,这三种网络都是编码解码 (encoder-decoder) 的结构:
  1. Resnet-18 with up-convolutional layers : 28.1% coco and 142 FPS
  1. DLA-34 : 37.4% COCOAP and 52 FPS
  1. Hourglass-104 : 45.1% COCOAP and 1.4 FPS
每个网络内部的结构不同,但是在模型的最后都是加了三个网络构造来输出预测值,默认是 80 个类、2 个预测的中心点坐标、2 个中心点的偏置。
用官方的源码 (使用 Pytorch) 来表示一下最后三层,其中 hm 为 heatmap、wh 为对应中心点的 width 和 height、reg 为偏置量,这些值在后文中会有讲述。

前提条件

附一张检测的效果图:
notion image
我们该如何检测呢?
首先假设输入图像为 ,其中 分别为图像的宽和高,然后在预测的时候,我们要产生出关键点的热点图 (keypoint heatmap):,其中 为输出对应原图的步长,而 是在目标检测中对应着检测点的数量,如在 COCO 目标检测任务中,这个
的值为 80,代表当前有 80 个类别。插一段官方代码,其中 就是 self.opt.down_ratio 也就是 4,代表下采样的因子。
这样,就是一个检测到物体的预测值,对于 ,表示对于类别 ,在当前 坐标中检测到了这种类别的物体,而 则表示当前当前这个坐标点不存在类别为 的物体。
在整个训练的流程中,CenterNet 学习了 CornerNet 的方法。对于每个标签图 (ground truth) 中的某一 类,我们要将真实关键点 (true keypoint) 计算出来用于训练,中心点的计算方式为 ,对于下采样后的坐标,我们设为 ,其中 是上文中提到的下采样因子 4。所以我们最终计算出来的中心点是对应低分辨率的中心点。然后我们利用 来对图像进行标记,在下采样的 [128,128] 图像中将 ground truth point 的形式,用一个高斯核 来将关键点分布到特征图上,其中 是一个与目标大小 (也就是 ) 相关的标准差。如果某一个类的两个高斯分布发生了重叠,直接取元素间最大的就可以。
这么说可能不是很好理解,那么直接看一个官方源码中生成的一个高斯分布 [9,9]:
notion image
每个点 的范围是 0-1, 而 1 则代表这个目标的中心点,也就是我们要预测要学习的点。

损失函数

重点看一下中心点预测的损失函数,原始论文中因为篇幅关系将第二个 otherwise 的公式挤一块了,这里我们展平看一下就比较清爽:
其中 是 Focal Loss 的超参数, 是图像 的的关键点数量,用于将所有的 positive focal loss 标准化为 1。在这篇论文中 分别是 2 和 4。这个损失函数是 Focal Loss 的修改版,适用于 CenterNet。
这个损失也比较关键,需要重点说一下。和 Focal Loss 类似,对于 easy example 的中心点,适当减少其训练比重也就是 loss 值,当 的时候,就充当了矫正的作用,假如 接近 1 的话,说明这个是一个比较容易检测出来的点,那么 就相应比较低了。而当 接近 0 的时候,说明这个中心点还没有学习到,所以要加大其训练的比重,因此 就会很大, 是超参数,这里取 2。
notion image
再说下另一种情况,当 的时候,这里对实际中心点的其他近邻点的训练比重 (loss) 也进行了调整,首先可以看到 ,因为当 的时候 的预测值理应是 0,如果不为 0 的且越来越接近 1 的话,的值就会变大从而使这个损失的训练比重也加大;而 则对中心点周围的,和中心点靠得越近的点也做出了调整 (因为与实际中心点靠的越近的点可能会影响干扰到实际中心点,造成误检测),因为 在上文中已经提到,是一个高斯核生成的中心点,在中心点 但是在中心点周围扩散 会由 1 慢慢变小但是并不是直接为 0,类似于上图,因此 ,与中心点距离越近, 越接近 1,这个值越小,相反则越大。
另外看一下官方的这张图可能有助于理解:传统的基于 anchor 的检测方法,通常选择与标记框 IoU 大于 0.7 的作为 positive,相反,IoU 小于 0.3 的则标记为 negative,如下图 a。这样设定好 box 之后,在训练过程中使 positive 和 negative 的 box 比例为 1:3 来减少 negative box 的比例 (例如 SSD 没有使用 focal loss)。
而在 CenterNet 中,每个中心点对应一个目标的位置,不需要进行 overlap 的判断。那么怎么去减少 negative center pointer 的比例呢?CenterNet 是采用 Focal Loss 的思想,在实际训练中,中心点的周围其他点 (negative center pointer) 的损失则是经过衰减后的损失(上文提到的),而目标的长和宽是经过对应当前中心点的 w 和 h 回归得到的:
notion image

目标中心的偏置损失

因为上文中对图像进行了 的下采样,这样的特征图重新映射到原始图像上的时候会带来精度误差,因此对于每一个中心点,额外采用了一个 local offset 去补偿它。所有类 的中心点共享同一个 offset prediction,这个偏置值 (offset) 用 L1 loss 来训练:
这个偏置损失是可选的,我们不使用它也可以,只不过精度会下降一些。

目标大小的损失

我们假设 为目标 ,所属类别为 ,它的中心点为 。我们使用关键点预测 去预测所有的中心点。然后对每个目标 size 进行回归,最终回归到 ,这个值是在训练前提前计算出来的,是进行了下采样之后的长宽值。为了减少回归的难度,这里使用 作为预测值,使用 L1 损失函数,与之前的 损失一样:
整体的损失函数为物体损失、大小损失与偏置损失的和,每个损失都有相应的权重。
在论文中 ,然后 ,论文中所使用的 backbone 都有三个 head layer,分别产生 [1,80,128,128][1,2,128,128][1,2,128,128],也就是每个坐标点产生 个数据,分别是类别以及、长宽、以及偏置。

推断阶段

在预测阶段,首先针对一张图像进行下采样,随后对下采样后的图像进行预测,对于每个类在下采样的特征图中预测中心点,然后将输出图中的每个类的热点单独地提取出来。具体怎么提取呢?就是检测当前热点的值是否比周围的八个近邻点 (八方位) 都大(或者等于),然后取 100 个这样的点,采用的方式是一个 3x3 的 MaxPool,类似于 anchor-based 检测中 nms 的效果。
这里假设 为检测到的点, 代表 类中检测到的一个点。每个关键点的位置用整型坐标表示 ,然后使用 表示当前点的 confidence,随后使用坐标来产生标定框:
其中 是当前点对应原始图像的偏置点, 代表预测出来当前点对应目标的长宽。
下图展示网络模型预测出来的中心点、中心点偏置以及该点对应目标的长宽:
notion image
那最终是怎么选择的,最终是根据模型预测出来的 值,也就是当前中心点存在物体的概率值,代码中设置的阈值为 0.3,也就是从上面选出的 100 个结果中调出大于该阈值的中心点作为最终的结果。

例子

运行官方源码的 demo,随便挑了一张图,跑出来的结果分别对应最终图,取 top=100 的检测图以及预测出来的 heatmap。
notion image
notion image
notion image

后记

总之这是一篇笔记,好久没有认真阅读一篇论文了。搞工程搞多了看见论文就头大,但是好的论文还是值得一读了,特别是这一篇。这篇论文厉害的地方在于:
  1. 设计模型的结构比较简单,像我这么头脑愚笨的人也可以轻松看明白,不仅对于 two-stage,对于 one-stage 的目标检测算法来说该网络的模型设计也是优雅简单的。
  1. 该模型的思想不仅可以用于目标检测,还可以用于 3D 检测和人体姿态识别,虽然论文中没有是深入探讨这个,但是可以说明这个网络的设计还是很好的,我们可以借助这个框架去做一些其他的任务。
  1. 虽然目前尚未尝试轻量级的模型 (这是我接下来要做的!),但是可以猜到这个模型对于嵌入式端这种算力比较小的平台还是很有优势的,希望大家多多尝试一些新的 backbone(不知道 mobilenetv3+CenterNet 会是什么样的效果),测试一下,欢迎和我交流呀~
当然说了一堆优点,CenterNet 的缺点也是有的,那就是:
  • 在实际训练中,如果在图像中,同一个类别中的某些物体的 GT 中心点,在下采样时会挤到一块,也就是两个物体在 GT 中的中心点重叠了,CenterNet 对于这种情况也是无能为力的,也就是将这两个物体的当成一个物体来训练 (因为只有一个中心点)。同理,在预测过程中,如果两个同类的物体在下采样后的中心点也重叠了,那么 CenterNet 也是只能检测出一个中心点,不过 CenterNet 对于这种情况的处理要比 faster-rcnn 强一些的,具体指标可以查看论文相关部分。
  • 有一个需要注意的点,CenterNet 在训练过程中,如果同一个类的不同物体的高斯分布点互相有重叠,那么则在重叠的范围内选取较大的高斯点。
好了,说了这么多,最后以这篇论文的 Conclusion 来结尾吧:

Conclusion

notion image

© Lazurite 2021 - 2024